Vim popup_menu ()의 callback에 추가로 인수를 전달하고 싶습니다.

8914 단어 vimscriptVim

소개


popup_menu() 의 콜백에 (global에 두는 것 같은 무차한 건네주는 방법등을 하지 않고) 능숙한 추가로 값을 건네주는 방법을 찾고 있어, 하나의 방법이 발견되었으므로 그 점유율이 됩니다.

덧붙여 : 콜백의 인수에 window의 id가 건네지기 때문에 본래는 window 스코프의 변수로 잘 건네주는 것이 좋은 것 같습니다. 이번 기사는 그것과는 별도로 JS의 익명 함수 틱한 접근을 해보겠습니다.

자신이 곤란한 경우



Vim script에서 선택사항의 유저 인터페이스라고 하면 inputlist() 가 있었다고 생각합니다만, 최근의 기능 추가로 popup_menu() 가 추가되어, 팝업 메뉴 중에서 유저에게 선택하도록 하는 선택도 늘었습니다.

↓↓popup_menu()의 예


자신의 플러그인( spelunker.vim )도 지금까지 inputlist() 를 사용하고 있었습니다만, 이번 새롭게 popup_menu() 있어, 지금까지의 inputlist() 를 그대로 옮겨놓는 것 같은 수정은 할 수 없을 것 같습니다.

지금까지의 inputlist() 구현 예


" ユーザーが選ぶ
function select(arg)
    let l:list = ['111', '222', '333']
    let l:selected = inputlist(l:list)
    " このあとl:selectedを使ってなんかする
endfunction

popup_menu()를 사용하는 경우의 구현 예


function select(arg)
    " ユーザーが選ぶとコールバックが呼ばれる
    let l:list = ['111', '222', '333']
    call popup_menu(l:list, #{
            \ callback: 'callbackFunction',
            \ pos: 'topleft',
            \ line: 'cursor+1',
            \ col: 'cursor'
            \ })
endfunction

function calbackFunction(id, selected)
    " a:selectedを使ってなんかする
endfunction


팝업 메뉴를 선택하면 콜백이 호출됩니다.
이렇게 되면 select() 의 함수 내에서 가지고 있는 변수로( a:arg 등), 이 후의 처리에서도 사용하고 싶은 변수는 어떻게 calbackFunction() 에 건네주면 좋을까... 디자인에도 영향을 줄 것입니다.

콜백에 추가로 인수 전달



이 기사의 클로저 항목에 대한 내용적인 접근법을 살펴 보겠습니다.
htps : // ゔぃm jp. rg/ゔぃm-우세 rs-jp/2010/08/13/은 ck-167. HTML
" argをコールバックに渡したい!
function s:select(arg)
    " 記事中のクロージャの項目の内容的なアプローチ
    " https://vim-jp.org/vim-users-jp/2010/08/13/Hack-167.html
    let l:callback = {'arg': a:arg}
    function l:callback.funcall(id, selected) dict
        call Popup_callback(a:id, a:selected, self.arg)
    endfunction

    let l:list = ['111', '222', '333']
    call popup_menu(l:list, #{
                \ callback: l:callback.funcall,
                \ pos: 'topleft',
                \ line: 'cursor+1',
                \ col: 'cursor'
                \ })
endfunction

function Popup_callback(id, selected, arg)
    " ここでもs:select()のarg(a:arg)を使える!
endfunction

인수를 잘 추가할 수 있었습니다.
또한, 이것은 간단하게 이렇게 할 수 있습니다.
function s:select(arg)
    let l:callback = {'arg': a:arg}
    function l:callback.funcall(id, selected) dict
        " callbackとしてやりたかった内容をここに移動します
        " self.argもa:id, a:selectedも使えます
    endfunction

    let l:list = ['111', '222', '333']
    call popup_menu(l:list, #{
                \ callback: l:callback.funcall,
                \ pos: 'topleft',
                \ line: 'cursor+1',
                \ col: 'cursor'
                \ })
endfunction

마지막 2개의 쓰는 방법은 취향이나 목적에 따라 구분 정도의 이야기라고 생각합니다. 공통화나 콜백 함수의 테스트를 하고 싶으면 전자이고, 간결함을 요구한다면 후자, 같은.

이것으로 일단, popup_menu() 의 호출원의 스코프에 있는 변수의 전달이 생겼습니다🙌

좋은 웹페이지 즐겨찾기