Estou trabalhando em um plug-in que permite aos usuários criar operadores personalizados. Os operadores aplicariam uma expressão VimL ao objeto de movimento ou texto sobre o qual o operador se move.
Mantendo uma interface de usuário limpa
Eu acho que a interface mais limpa para definir os operadores personalizados seria usar um comando. Eu defini um comando :MapExpress
que seria chamado assim:
:MapExpress cd '/* ' . v:val . ' */'
Isso criaria um operador no modo Normal e um mapeamento no modo Visual para cd
envolver o movimento ou a seleção nos delimitadores de comentários no estilo C.
Claro, aqui está um problema. Você não pode chamar um comando definido em um plug-in do seu .vimrc
arquivo.
Soluções alternativas pouco satisfatórias
Eu vim com algumas soluções alternativas com as quais não estou totalmente feliz.
O usuário usa autocmd VimEnter *
para chamar o comando
Embora isso funcione, ele adiciona muita "sobrecarga mental". Eu acho que muitos usuários do Vim não têm uma sólida compreensão de como autocmd
funciona.
Usuário cria um arquivo no ~/.vim/after/plugin/
qual chama o comando
Novamente, isso funcionaria, mas tem a desvantagem de que essa parte da configuração está em seu próprio arquivo, facilmente perdida e esquecida.
Movo as definições de comando para o autoload/
diretório do meu plug-in e o usuário chama algum método que aciona o carregamento do arquivo e, portanto, os comandos a serem definidos
Isso ficaria assim:
call express#init()
MapExpress cd '/* ' . v:val . ' */'
Um pouco melhor, mas isso causaria confusão sobre se o express#init()
método é necessário para o plugin funcionar.
Alternativas ao uso de um comando
Também considerei algumas alternativas ao uso de um comando para definir o operador, mas cada uma tem suas ressalvas.
O usuário chama uma função para definir os operadores
Isso seria algo como isto:
call express#operator('cd', '"/* ".v:val." */"')
Isso não é terrível, mas tem a desvantagem de exigir uma expressão citada. Isso pode ser irritante quando você deseja usar aspas em sua expressão.
Usuário usa um <expr>
mapeamento
Como isso:
nmap <expr> cd express#nmap('"/* ".v:val." */"')
xmap <expr> cd express#xmap('"/* ".v:val." */"')
Ele tem o mesmo requisito de expressão tediosa e também viola o DRY, a menos que você introduza uma variável (não ideal).
Ok, e daí?
Aqui estão todas as minhas idéias e por que não gosto de nenhuma delas. Estou sendo muito exigente? Existe alguma solução melhor que eu não tenha pensado?
<q-args>
realmente funciona. Obrigado
call express#initMapCommands()
? Qualquer coisa que exija citações extras, no entanto, é uma péssima idéia.