첫 번째 Neovim 플러그인을 작성한 방법

저는 Vim과 Neovim을 많이 사용합니다. 나는 아마도 모든 바인딩과 내부의 모든 마법을 알지 못하지만 매일 사용하며 내가 가장 좋아하는 앱 중 하나가 되었습니다.

이전 기사( 및 )에서 나는 이미 내가 사용하는 일부 플러그인과 일부 구성 팁을 살펴보았습니다.

하지만 오늘은 한 단계 더 나아가 플러그인 작성에 대해 알아보겠습니다!

고통



우리는 직장에서 자체 쿼리 언어가 있는 데이터 기반 클라우드 앱Splunk을 사용합니다. Splunk에 대한 쿼리 작성은 특히 쿼리가 점점 커지기 시작하고 괄호의 양 때문에 길을 잃을 때 번거로울 수 있습니다.

내가 찾은 해결책은 쿼리를 더 편리하게 읽을 수 있도록 서로 다른 블록을 들여쓰고 분리하는 작은 파이썬 스크립트를 작성하는 것이었습니다.

그리고...

Neovim 플러그인으로 만드는 것은 어떻습니까? Neovim에는 Python 인터페이스가 있으므로 제대로 작동해야 합니까? 스포일러: 네.

다이빙하자!

플러그인 작성



먼저 몇 가지를 설정해야 합니다. Python 바이너리는 셸 PATH에 있어야 합니다( :checkhealth 로 확인할 수 있음).



여기에서 볼 수 있듯이 Python 바이너리가 PATH에서 누락되었으며 Neovim은 그것으로 아무것도 실행할 수 없습니다. 따라서 init.vim에 해당 줄을 추가해 보겠습니다.

let g:python3_host_prog = '/usr/bin/python3'
let g:python_host_prog = '/usr/bin/python2'


또는 바이너리를 경로에 추가할 수 있습니다.

export PATH=$PATH:/usr/bin/python:/usr/bin/python3

echo $PATH로 확인하십시오.

그런 다음 Python Neovim 라이브러리인 pynvim 버전이 모두 있는지 확인합니다.

python3 -m pip install pynvim
python -m pip install pynvim


그런 다음 리포지토리와 폴더 설정을 시작할 수 있습니다.

# do your git magic here
mkdir -p rplugin/python
touch rplugin/python/nvim-test.py


documentation 에 따르면 원격 플러그인은 작업을 수행하는 새로운 방법이므로 이를 따를 것입니다.
nvim-test.py를 살펴보고 이것Jacob Simpson's example에서 영감을 얻으십시오.

import pynvim

@pynvim.plugin
class TestPlugin(object):
    def _init__(self, nvim):
        self.nvim = nvim

    @pynvim.function("TestFunction")
    def testFunction(self, args):
        self.nvim.current.line = "Hello from your plugin!"


코드 분해:
  • 클래스와 하위 클래스를 초기화합니다nvim.
  • 현재 줄을 덮어쓰는 함수를 만듭니다
  • .

    이를 테스트하기 위해 git 인스턴스에서 플러그인을 업데이트하고 init.vim에서 플러그인을 업데이트할 수 있습니다. 하지만... 테스트vimrc를 사용할 수도 있습니다.

    echo "let &runtimepath.=','.escape(expand('<sfile>:p:h'), '\,')" > testvimrc
    


    이제 시작nvim -u testvimrc하고 실행:UpdateRemotePlugins하면 플러그인이 원격 플러그인으로 등록되고 매니페스트가 생성됩니다. cat ~/.local/share/nvim/rplugin.vim 로 확인하십시오. 파일이 비어 있지 않아야 하며 거기에 플러그인이 표시되어야 합니다.

    이제 Neovim:call TestFunction()을 다시 로드한 후 실행하면 정상적으로 작동하고 작업을 테스트할 수 있습니다. 지금까지는 제거 플러그인을 업데이트할 때마다 Neovim을 재부팅해야 한다고 생각하지만 아마도 그것을 우회하는 방법이 있을 것입니다.

    이제 내가 한 작업에 대해:

    import re
    
    import pynvim
    
    
    @pynvim.plugin
    class SplunkLinter(object):
        def __init__(self, nvim):
            self.nvim = nvim
    
        @pynvim.function("LintSplunk")
        def lintSplunk(self, args):
            current_line = self.nvim.current.line
            front = current_line.split("(")
            i = 0
            j = 0
            res = ""
            for line in front:
                p = ""
                if j != 0:
                    p = "("
                back = re.findall("\)", line)
                line = ((i) * "\t") + p + line
                self.nvim.current.buffer.append(line, -1)
                if len(back) == 0:
                    i = i + 1
                elif len(back) > 1:
                    i = i - len(back)
                    if i < 0:
                        i = 0
                j = j + 1
            self.nvim.current.line = ""
            return
    
    


    당신이 아무 말도 하기 전에, 나는 이것이 개선될 수 있다는 것을 압니다. 기본적으로 이 코드는 포함된 괄호 수준에 따라 문자열을 들여쓰기합니다. 그것은 기본적으로 내가 필요한 것이고 그것은 일을합니다!

    test (on) (one) (one (two (three))) (one) ((two))
    
    # to
    
    test
        (on)
        (one)
        (one
            (two
                (three)))
            (one)
            (
                (two))
    


    Github 저장소는 여기에 있습니다: https://github.com/christalib/nvim-splunk-linter , 문제, PR 등을 자유롭게 여십시오!

    Neovim 또는 Vim용 플러그인을 이미 개발하셨습니까? 넌 어떻게 그걸 했니?

    좋은 웹페이지 즐겨찾기