É possível criar mapeamentos com parâmetros?

11

Eu criei alguns mapeamentos como este:

:nnoremap <buffer> <leader>xyzABC   :call SomeFunc('ABC')<CR>
:nnoremap <buffer> <leader>xyzDE    :call SomeFunc('DE')<CR>
:nnoremap <buffer> <leader>xyzFoo18 :call SomeFunc('Foo18')<CR>
:nnoremap <buffer> <leader>xyzBar22 :call SomeFunc('Bar22')<CR>

que funciona como desejado.

Agora estou procurando a possibilidade de criar um modelo de mapa que me permita remover as partes redundantes óbvias dos meus mapeamentos, algo como

:nnoremap <buffer> <leader> xyz? :call SomeFunc(?)<CR>

para que eu pudesse passar qualquer valor como parâmetro para SomeFunc.

Existe essa possibilidade?

René Nyffenegger
fonte
7
Você pode usar input()ou getchar(). No entanto, é provavelmente mais normal usar um comando em vez de um mapeamento para algo que aceita um parâmetro.
Peter Rincker
Eu concordo com o comentário de Peter; Os comandos são mais adequados para o trabalho do que os mapeamentos.
romainl

Respostas:

6

Como o @ peter-rinckler disse, provavelmente é mais fácil fazê-lo com um comando:

command! -nargs=* Xyz :call SomeFunc(<q-args>)

Torna possível fazer (no modo normal)

:Xyz ABC

Eu realmente não gosto disso input()porque você não pode repetir esse tipo de coisa facilmente.

edi9999
fonte
6

Graças ao comentário de Peter Rincker, encontrei a resposta:

:nnoremap <buffer> <leader> xyz :call SomeFunc(input('Param: '))<CR>
René Nyffenegger
fonte
Aqui está outro exemplo: nnoremap <silent> <leader>tn :exe "tabn" nr2char(getchar())<cr> . A idéia é escrever <leader>tn2para navegar para guia 2.
Jasha
1

Você pode dar uma olhada no SnipMate , que visa fornecer snippets do tipo TextMate ao vim. De qualquer forma, provou-me muito útil.

Bet Lamed
fonte