Como iniciar o vim e executar um comando específico que inclui a \, na linha de comando?

8

No meu ~/.vimrc, eu tenho um comando definido aproximadamente assim:

nnoremap <expr> <Leader>n ':new ~/Notes/' . strftime('%F') . '-'

Ele foi projetado para criar arquivos de notas que contêm a data atual no nome do arquivo. A combinação de teclas foi projetada para deixar meu cursor na linha de comando para que eu possa digitar o tópico da nota e pressionar Return.

Isso funciona de dentro do vim fine. No entanto, também estou tentando especificar um comando de terminal que possa ser usado para abrir o vim e disparar esse comando. Eu tentei:

vim -c '\n'

(meu Líder está definido como padrão \, o qual eu preferiria não mudar)

No entanto, isso não funciona - em vez disso, apenas recebo o erro detectado ao processar a linha de comando: E10: \ deve ser seguido por /,? ou & . Não tenho certeza se isso é um bug no vim ou se estou fazendo algo errado. Eu também tentei:

vim -c '<Leader>n'

Mas isso fornece: Erro detectado ao processar a linha de comando: E488: Caracteres finais: n Pressione ENTER ou digite o comando para continuar .

Existe uma maneira de conseguir o que eu quero?

Andrew Ferrier
fonte

Respostas:

5

Você pode criar uma função que cria a nova entrada e, em seguida, usar a função como parte do seu mapeamento:

nnoremap <leader>t :call NewEntry()<cr>
function! NewEntry()
  let title = expand('~/Notes/') . strftime('%F') . '-' . input("Title: ")
  execute 'edit ' . title
endfunction

O mapeamento pode ser chamado conforme descrito por @Carpetsmoker:

vim -c 'execute "normal \\t"'
Karl Yngve Lervåg
fonte
Karl, excelente, obrigado! Isso também lida com a entrada do nome de forma um pouco mais elegante, o que é ótimo, e tudo parece funcionar, incluindo a chamada do mapeamento.
Andrew Ferrier
Não tem problema, estou feliz que funcione.
Karl Yngve Lervåg
7

-cnão executa combinações de teclas no modo normal; ele executa comandos (com o que você normalmente faz :). Então você precisa usar o executecomando, que parece funcionar:

$ vim -c 'execute "normal \\t"'

Precisamos do dobro, \\porque estamos emitindo um comando shell (e não queremos que o shell interprete isso como uma sequência de escape).

Testado com o keybind:

nnoremap <Leader>t :echo "TEST!"<CR>

Não consigo :execute "normal <Leader>t"trabalhar; obter o valor de mapleader também é um pouco mais envolvido, pois você recebe um erro se não tiver definido mapleadernada e usar o padrão de \.

Martin Tournoij
fonte
Sim, seu teste parece funcionar para mim também. Mas ele não funciona com meu mapeamento nnoremap - eu estou pensando se é porque estou usando <expr> no meu mapeamento. Investigando ...
Andrew Ferrier
Tentei simplificar meu mapeamento nnoremap <Leader>x ':new ~/Desktop/x.txt'para remover o <expr>. Mas vim -c 'execute "normal \\x"'indica "Erro detectado ao processar a linha de comando: E78: marca desconhecida". Alguma idéia do porquê?
Andrew Ferrier
@AndrewFerrier Sim, também não consigo trabalhar com seu mapeamento: - / ... Talvez uma solução melhor para esse problema seja usar o VimEnterautocmd ou algo assim? ... Eu não tenho tempo para investigar agora, se ninguém mais encontrar uma resposta hoje à noite, vou dar uma olhada (deixarei essa resposta por enquanto), porque isso parece uma espécie se coisa que eu gostaria de ter / uso bem :-)
Martin Tournoij
sem preocupações, sem pressa. É apenas uma curiosidade para mim agora. Obrigado por seus ponteiros até agora.
Andrew Ferrier
2

Se seu objetivo é usar o mapleader e você o redefinir no seu .vimrc

deixe mapleader = ','

isso não funcionaria. Você pode usar

$ vim -c 'execute "normal ".get(g:,"mapleader","\\")."t"'

em vez de.

mas se você planeja usar essa funcionalidade na linha de comando, é melhor encapsular a funcionalidade em uma função e chamá-la diretamente.

albfan
fonte