denops.vim로 괄호 보완 플러그인을 썼어요.

개시하다


안녕하세요, 저는 히가시입니다.
이번엔 denops.vim로 괄호 보완 플러그인을 만들었기 때문에 소개해 드릴게요.

이번에 만든 플러그인.


플러그인dps-kakkonan.
원래 제작된 플러그인vim-kakkonan을 denops로 사용합니다.vim로 이루어진 형식입니다.

denops.vim 정보


이 글의 저자인 lambdalisue가 해설을 진행하였다.
간단히 말해서 Vim/Neovim의 플러그인을 쓰기 위해 Deno를 사용할 수 있습니다.
TypeScript로 기술할 수 있기 때문에 금형 외에 이미 존재하는 Deno 자산도 사용할 수 있다.

dps-Cakkonan 기능


괄호 보완.
일반적인 괄호 보완.
이쪽gif를 보시면 알 수 있습니다.
Image from Gyazo

설치 정보

  • 보충 괄호
  • 닫힌 괄호가 오른쪽에 있는 상태에서 닫힌 괄호를 입력하면 커서가 오른쪽으로 이동
  • 커서 양쪽에 괄호가 열려 있는 상태에서 뒤로 물러나는 공간을 누르면 괄호가 삭제됩니다
  • 기본 기능만 구현했기 때문에 코드가 길어지지 않고 Type Script 105 행으로 구현할 수 있습니다.
    start(async (vim) => {
        const getLineChar = async (diff: number): Promise<string> => {
            if (typeof diff !== "number") {
                throw new Error(`'diff' attribute of 'getLineChar' in must be a number`)
            }
    
            const cursorStr = await vim.call('getline', '.');
            if (typeof cursorStr !== "string") {
                throw new Error(`'cursorStr' attribute of 'kakkonanCompletion' in must be a string`)
            }
    
            const cursorLine = await vim.call('line', '.');
            if (typeof cursorLine !== "number") {
                throw new Error(`'cursorLine' attribute of 'kakkonanCompletion' in must be a number`)
            }
    
            const cursorCol = await vim.call('col', '.');
            if (typeof cursorCol !== "number") {
                throw new Error(`'cursorCol' attribute of 'kakkonanCompletion' in must be a number`)
            }
    
            const cursorChar = cursorStr.substr(cursorCol + diff, 1);
    
            return cursorChar;
        }
    })
    
    이렇게 Arror 함수로 함수를 등록해서 쓰기가 아주 좋아요.
    또한, 반환 값이Vim/Neovim에 직접 전달되기 때문에inoremap 등으로 insertmode에서 이 함수를 호출할 때 반환 값은 파일에 삽입됩니다.
    async hogehogefugafuga(inputBrackets: unknown): Promise<string> {
        if (typeof inputBrackets !== "string") {
            throw new Error(`'inputBrackets' attribute of 'kakkonanCompletion' in must be a string`);
        }
    
        return "hogehoge" + inputBrackets;
    }
    
    이 경우 hogehoge 매개 변수 문자열을 결합하여 삽입합니다.
    이 방법을 이용하여 괄호 보완을 만들었다.
    작은 지도의 정의도 간단하다.vim.다만 excute () 에 평소vimrc에 적힌 열쇠 그림 설정을 추가합니다.
    vim.execute(`
        inoremap <expr> ( denops#request("kakkonan", "kakkonanCompletion", ['(']) . "\<left>"
        inoremap <expr> { denops#request("kakkonan", "kakkonanCompletion", ['{']) . "\<left>"
        inoremap <expr> [ denops#request("kakkonan", "kakkonanCompletion", ['[']) . "\<left>"
        inoremap <expr> " denops#request("kakkonan", "kakkonanCompletion", ['"']) != "" ? '""' . "\<left>" : "\<right>"
        inoremap <expr> ' denops#request("kakkonan", "kakkonanCompletion", ["'"]) != "" ? "''" . "\<left>" : "\<right>"
        inoremap <expr> ${backQuote} denops#request("kakkonan", "kakkonanCompletion", ['${backQuote}']) != "" ? '${backQuote + backQuote}' . "\<left>" : "\<right>"
        inoremap <expr> ) denops#request("kakkonan", "kakkonanEscapeBrackets", [')']) == v:false ? ")" : "\<right>"
        inoremap <expr> } denops#request("kakkonan", "kakkonanEscapeBrackets", ['}']) == v:false ? "}" : "\<right>"
        inoremap <expr> ] denops#request("kakkonan", "kakkonanEscapeBrackets", [']']) == v:false ? "]" : "\<right>"
        inoremap <expr> <CR> denops#request("kakkonan", "kakkonanBackSpaceEnter", []) == v:false ? "\<CR>" : "\<CR>\<C-o>\<S-o>"
        inoremap <expr> <BS> denops#request("kakkonan", "kakkonanBackSpaceEnter", []) == v:false ? "\<BS>" : "\<BS>\<right>\<BS>"
    `);
    
    이것은 dps-Cakkonan에서 정의한 명령입니다.
    이렇게 하면 여러 줄 문자열을 전달하여 명령을 한꺼번에 정의할 수 있다.
    참고로 다음과 같은 정의를 내릴 수도 있다.
    vim.execute(`inoremap <expr> ( denps#request("kakkonan", "kakkonanCompletion", ['('])`)
    vim.execute(`inoremap <expr> [ denps#request("kakkonan", "kakkonanCompletion", ['['])`)
    

    최후


    denops.vim 덕분에 저는 Deno를 이용해서 Vim pluggin을 만들 수 있었습니다.
    나는 이렇게 플러그인의 제작 범위를 확장하는 것이 매우 좋다고 생각한다.
    저도 이를 계기로 타입 스크립트를 열심히 배우고 싶어요.
    여기까지 읽어주셔서 감사합니다.
    denops.vim에 관심이 있는 사람은 반드시vim-jp의 슬랙 안의 #tech-denops에 참가하세요.
    이쪽부터 vim-jp Slack에 참여를 하도록 하겠습니다.

    좋은 웹페이지 즐겨찾기