Python 을 사용 하여 vim 플러그 인 을 만 드 는 방법 에 대한 자세 한 설명
vim 는 위대 한 편집기 로 그녀 가 독자 적 으로 편집 하 는 방식 뿐만 아니 라 그녀의 강력 한 확장 능력 에 도 있다.그러나 vim 자체 가 플러그 인 을 쓰 는 데 사용 되 는 언어 vimL 기능 은 한계 가 많 고 기능 이 복잡 한 플러그 인 을 실현 하 는 데 힘 이 들 지 않 으 며 운행 효율 도 높 지 않다.다행히 vim 은 이 점 을 생각 했 습 니 다.그녀 는 Python,ruby,lua,Perl 등 외부 언어 인 터 페 이 스 를 많이 제공 하여 vim 플러그 인 을 편리 하 게 만 들 수 있 습 니 다.이 글 은 주로 Python 을 사용 하여 vim 플러그 인 을 만 드 는 방법 을 소개 합 니 다.
준비 작업
1.vim 을 컴 파일 하여 vim 이 Python 을 지원 하도록 합 니 다.
컴 파일 하기 전에 configure 에--enable-pythoninterp 와--enable-python 3 interp 옵션 을 추가 하여 각각 Python 2 와 Python 3 을 지원 합 니 다.
컴 파일 된 후에 vim--version|grep+python 을 통 해 Python 을 지원 하 는 지 확인 할 수 있 습 니 다.결과 에는+python 과+python 3 이 포함 되 어야 합 니 다.물론 Python 2 나 Python 3 만 지원 하 는 것 으로 컴 파일 할 수도 있 습 니 다.
현재 많은 플랫폼 에서 직접 컴 파일 된 버 전이 있 습 니 다.Python 지원 이 포함 되 어 있 습 니 다.직접 다운로드 하면 됩 니 다.
2.어떻게 하면 Python 이 정상적으로 작 동 할 수 있 습 니까?
vim 는 Python 을 지 지 했 지만 echo has("python")또는 echo has("python 3")의 결 과 는 0 으로 Python 이 아직 정상적으로 작 동 하지 않 는 다 는 것 을 의미한다.
이 때 검사 가 필요 합 니 다:
set pythondll=/Users/yggdroot/.python2.7.6/lib/libpython2.7.so
이 4 단 계 를 통 해 99%는 파 이 썬 을 일 시 킬 수 있 고 나머지 1%는 인품 에 달 려 있다.보충 점:
neovim 에 대한 실행
pip2 install --user --upgrade neovim
pip3 install --user --upgrade neovim
Python 2 와 Python 3 의 지원 을 추가 할 수 있 습 니 다.구체 적 으로 는 h provider-python 을 참조 하 십시오.Hello World 부터.
명령 행 창 에서 실행:pyx print("hello world!"),출력"hello world!",Python 이 정상적으로 작 동 하고 있다 는 것 을 설명 합 니 다.이때 우 리 는 vim 의 EX 명령 으로 Python 을 사용 할 수 있 습 니 다.
vim 을 다 루 는 게 vimL 처럼 쉬 워 요.
어떻게 Python 으로 vim 의 정보 에 접근 하고 vim 를 조작 합 니까?간단 합 니 다.vim 의 Python 인 터 페 이 스 는 vim 이라는 모듈(module)을 제공 합 니 다.vim 모듈 은 Python 과 vim 이 소통 하 는 다리 입 니 다.이 를 통 해 Python 은 vim 의 모든 정보 와 vim 를 방문 할 수 있 습 니 다.마치 vimL 을 사용 하 는 것 과 같 습 니 다.그래서 스 크 립 트 를 쓰 려 면 먼저 import vim 이 필요 합 니 다.
vim 모듈
vim 모듈 은 두 개의 매우 유용 한 함수 인 터 페 이 스 를 제공 합 니 다.
vim.command(str)
vim 의 명령 str(ex-mode)를 실행 하고 반환 값 은 None 입 니 다.예 를 들 어:
:py vim.command("%s/\s\+$//g")
:py vim.command("set shiftwidth=4")
:py vim.command("normal! dd")
vim.eval(str) vim 표현 식 str 의 값 을 구 합 니 다.(vim 표현 식 이 무엇 입 니까?참조:h expr)결과 형식 은 다음 과 같 습 니 다.
예 를 들 면:
:py sw = vim.eval("&shiftwidth")
:py print vim.eval("expand('%:p')")
:py print vim.eval("@a")
vim 모듈 은 유용 한 대상 도 제공 합 니 다.
:py print b.name # write the buffer file name
:py b[0] = "hello!!!" # replace the top line
:py b[:] = None # delete the whole buffer
:py del b[:] # delete the whole buffer
:py b[0:0] = [ "a line" ] # add a line at the top
:py del b[2] # delete a line (the third)
:py b.append("bottom") # add a line at the bottom
:py n = len(b) # number of lines
:py (row,col) = b.mark('a') # named mark
:py r = b.range(1,5) # a sub-range of the buffer
:py b.vars["foo"] = "bar" # assign b:foo variable
:py b.options["ff"] = "dos" # set fileformat
:py del b.options["ar"] # same as :set autoread<
vim.current 대상(:h python-current)vim.current 대상 은 일부 속성 을 제공 하여'현재'의 vim 대상 에 편리 하 게 접근 할 수 있 습 니 다.
속성
속뜻
유형
vim.current.line
The current line (RW)
String
vim.current.buffer
The current buffer (RW)
Buffer
vim.current.window
The current window (RW)
Window
vim.current.tabpage
The current tab page (RW)
TabPage
vim.current.range
The current line range (RO)
Range
python 접근 vim 의 변수
vim 의 변 수 를 방문 하면 앞에서 소개 한 vim.eval(str)을 통 해 접근 할 수 있 습 니 다.예 를 들 어:
:py print vim.eval("v:version")
하지만 더 pythonic 하 는 방법 도 있 습 니 다.vim 변 수 를 미리 정의 합 니 다(v:var)
vim.vvars 를 통 해 미리 정 의 된 vim 변 수 를 방문 할 수 있 습 니 다.vim.vvars 는 Dictionary 와 유사 한 대상 입 니 다.예 를 들 어,방문 v:version:
:py print vim.vvars["version"]
전역 변수(g:var)vim.vars 를 통 해 전역 변 수 를 방문 할 수 있 습 니 다.vim.vars 도 Dictionary 와 유사 한 대상 입 니 다.예 를 들 어 전역 변수 g:global 변경var 의 값:
:py vim.vars["global_var"] = 123
tabpage 변수(t:var)예 를 들 면:
:py vim.current.tabpage.vars["var"] = "Tabpage"
window 변수(w:var)예 를 들 면:
:py vim.current.window.vars["var"] = "Window"
버퍼 변수(b:var)예 를 들 면:
:py vim.current.buffer.vars["var"] = "Buffer"
python 이 vim 에 접근 하 는 옵션(options)vim 에 접근 하 는 옵션 은 앞에서 소개 한 vim.command(str)와 vim.eval(str)을 통 해 접근 할 수 있 습 니 다.예 를 들 어:
:py vim.command("set shiftwidth=4")
:py print vim.eval("&shiftwidth")
물론 더 pythonic 방법 도 있 습 니 다.전역 옵션 설정(:h python-options)
예 를 들 면:
:py vim.options["autochdir"] = True
메모:window-local 이나 buffer-local 옵션 이 라면 키 오류 이상 을 알 릴 수 있 습 니 다.window-local 과 buffer-local 옵션 에 대해 서 는 아래 를 보 세 요.window-local 옵션 설정
예 를 들 면:
:py vim.current.window.options["number"] = True
buffer-local 옵션 설정예 를 들 면:
:py vim.current.buffer.options["shiftwidth"] = 4
vim 플러그 인인 라인
py[thon] << {endmarker}
{script}
{endmarker}
{script}의 내용 은 Python 코드 입 니 다.{endmarker}은 태그 기호 입 니 다.모든 문자열 일 수 있 습 니 다.그러나{endmarker}앞 에 빈 문자 가 있 으 면 안 됩 니 다.즉,맨 위 에 써 야 합 니 다.예 를 들 어 함 수 를 써 서 현재 buffer 의 모든 줄(Demo.vim)을 출력 합 니 다.
function! Demo()
py << EOF
import vim
for line in vim.current.buffer:
print line
EOF
endfunction
call Demo()
실행:source%결과 보기.독립 식
Python 코드 를*.py 에 쓰 면 vimL 은 전역 변수,map,command 등 만 정의 합 니 다.LeaderF 는 바로 이런 방식 을 사용 합 니 다.개인 적 으로 이런 방식 을 더 좋아 하기 때문에 파 이 썬 코드 를 쓰 는 데 모든 정력 을 집중 할 수 있다.
비동기
다 중 스 레 드
Python 의 threading 모듈 을 통 해 다 중 스 레 드 를 실현 할 수 있 습 니 다.그러나 스 레 드 에 서 는 vim 와 무관 한 논리 만 실현 할 수 있 습 니 다.스 레 드 에서 vim 를 조작 하려 는 모든 행 위 는 vim 붕 괴 를 초래 할 수 있 습 니 다.심지어 하나의 vim 옵션 만 읽 는 것 도 포함 합 니 다.그럼 에 도 불구 하고 vimL 보다 훨씬 좋 습 니 다.없 는 것 보다 조금 낫 기 때 문 입 니 다.
subprocess
Python 의 subprocess 모듈 을 통 해 외부 명령 을 호출 할 수 있 습 니 다.
예 를 들 면:
:py import subprocess
:py print subprocess.Popen("ls -l", shell=True, stdout=subprocess.PIPE).stdout.read()
즉,Python 을 지원 할 때 부터 vim 은 비동기(vim 7.4 가 되 어야 bug 가 거의 없 지만)를 지원 했다.Neovim 이 추가 한 비동기 기능 은 Python 으로 플러그 인 을 쓰 는 파트너 에 게 아무런 매력 이 없다.많은 Neovim 가루 들 이 비동기(job)를 도입 하 는 것 을 자 랑스 럽 게 여 긴 다.언제 진정한 다 중 스 레 드 지원 을 도입 할 수 있 을 까?케이스
유명한 완성 플러그 인 YCM 과 퍼 지 탐색 기LeaderF는 모두 Python 으로 작 성 된 것 입 니 다.
결함.
GIL 때문에 Python 스 레 드 를 병행 처리 할 수 없습니다.한편,vim 는 Python 의 프로 세 스https://github.com/vim/vim/issues/906를 지원 하지 않 고 밀집 형 임 무 를 계산 하여 다 핵 을 이용 하여 성능 을 향상 시 키 는 것 은 불가능 하 다.
기예 가 음탕 하고 교묘 하 다.
buffer 의 모든 단어 이니셜 을 대문자 로 바 꿉 니 다.
:%pydo return line.title()
buffer 의 모든 줄 미 러 를 표시 합 니 다.예컨대
vim is very useful
123 456 789
abc def ghi
who am I
되다
lufesu yrev si miv
987 654 321
ihg fed cba
I ma ohw
이 명령 을 실행 할 수 있 습 니 다:%pydo return line[:-1]총결산
이상 은 간단 한 소개 일 뿐 더 자세 한 자 료 는 h python 을 참고 할 수 있 습 니 다.여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.