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 지원 이 포함 되 어 있 습 니 다.직접 다운로드 하면 됩 니 다.
  • 윈도:여기,이곳에서 다운로드 할 수 있 습 니 다.
  • Mac OS:brew install vim 으로 직접 설치 할 수 있 습 니 다.
  • Linux:빠 른 설치 방식 도 있 으 니 군말 하지 않 겠 습 니 다.4567918)
    2.어떻게 하면 Python 이 정상적으로 작 동 할 수 있 습 니까?
    vim 는 Python 을 지 지 했 지만 echo has("python")또는 echo has("python 3")의 결 과 는 0 으로 Python 이 아직 정상적으로 작 동 하지 않 는 다 는 것 을 의미한다.
    이 때 검사 가 필요 합 니 다:
  • 시스템 에 Python 이 설치 되 어 있 습 니까?
  • Python 은 32 비트 입 니까?64 비트 가 vim 과 일치 합 니까?
  • Python 버 전이 컴 파일 된 버 전과 일치 하 는 지 여부(컴 파일 된 버 전 은 사용 가능:version 보기)
  • python 2 와 Python 3 이 사용 하 는 동적 라 이브 러 리 를 python 3 과 python 3 을 통 해 각각 지정 합 니 다.
  • 예 를 들 어 vimrc 에 추가 할 수 있 습 니 다.
    
    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)결과 형식 은 다음 과 같 습 니 다.
  • string:vim 표현 식 의 값 유형 이 string 또는 number
  • 라면
  • list:vim 표현 식 의 값 형식 이 vim list(:h list)
  • 라면
  • dictionary:vim 표현 식 의 값 유형 이 vim dictionary(:h dict)
  • 라면
    예 를 들 면:
    
    :py sw = vim.eval("&shiftwidth")
    :py print vim.eval("expand('%:p')")
    :py print vim.eval("@a")
    vim 모듈 은 유용 한 대상 도 제공 합 니 다.
  • Tabpage 대상(:h python-tabpage)Tabpage 대상 은 vim 의 Tabpage 에 대응 합 니 다.
  • Window 대상(:h python-window)은 Window 대상 이 vim 에 대응 하 는 Window 입 니 다.
  • Buffer 대상(:h python-buffer)은 Buffer 대상 이 vim 에 대응 하 는 buffer 입 니 다.Buffer 대상 은 속성 과 방법 을 제공 하여 buffer 를 쉽게 조작 할 수 있 습 니 다.
  • 예 를 들 어(b 가 현재 buffer 라 고 가정):
    
    :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 을 참고 할 수 있 습 니 다.여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

    좋은 웹페이지 즐겨찾기