Tornar o modo de linha de comando tipo <Esc> e comandos Ctrl

11

Imagine que você deseja citar a palavra abaixo. Se |é a posição do cursor, você pode citar facilmente a palavra no cw""<Esc>Pmodo Normal.

|below

Eu quero alcançar o mesmo comportamento no modo de linha de comando. Minha pergunta é como posso dizer ao modo de linha de comando que desejo digitar um <Esc>. Eu tentei :norm cw""<Esc>Pe algumas outras variações, mas eu fico ""<Esc>Pem vez de "below".

Ainda relacionado a isso, gostaria de saber como posso fazer com que o modo de linha de comando digite comandos Ctrl. Por exemplo, eu poderia citar a palavra acima mencionada cw"<C-r>""<Esc>. Mas então eu precisaria da linha de comando para digitar <C-r>para mim. Como posso fazer isso?

Gonçalo Ribeiro
fonte
1
Assim como existe <C-x><C-e>na linha de leitura para editar a linha de comando $EDITOR, você tem <C-f>no Vim para abrir a janela da linha de comando. Veja :help cmdline-window.
Romainl 22/03

Respostas:

11

<C-v>é o que você está procurando. Permite inserir caracteres literais (por exemplo, um literal em Escvez da string "Esc") sem exigir que você escape de nada.

:norm cw""<C-v><Esc>P

exibe como:

:norm cw""^[P

e fará o que quiser (ou seja, cite a palavra). Você também pode usar isso com outros <C-?>mapeamentos. Por exemplo, sua segunda solicitação:

:norm cw"<C-v><C-r>""

exibe como:

:norm cw"^R""

E resultará no mesmo que o acima. Não há necessidade de incluir o extra Escno final.

Zach Ingbretsen
fonte
10

Isso ocorre porque teclas especiais como <Esc>não são traduzidas em normalcomandos e são tratadas como você pressionou <Esc>. Para remediar isso, você pode usar um execcomando. Igual a:

:exec "norm cw\"\"\<Esc>P"

Observe que você deve colocar uma barra invertida antes das aspas e <Esc>, e usar aspas simples em vez de aspas duplas não funcionará.

EvergreenTree
fonte
Isso funciona também para os comandos Ctrl? Como devo escrevê-los no comando?
Gonçalo Ribeiro
Sim, deve funcionar. Você pode escrevê-los assim:"\<C-{insert key}>"
EvergreenTree
2

O modo de linha de comando é diferente; você não pode usar os mesmos comandos de edição (modo normal) lá. Você pode encontrar uma lista de comandos em :help c_CTRL-V.

Agora, há a janela da linha de comando ( :help command-line-window), que pode ser inserida q:no modo normal e <C-F>na linha de comando. Em que janela, você pode usar todos os comandos normais e mapeamentos, de modo que seria a opção 1.

A opção 2 é mapeamentos especiais para o modo de linha de comando. Como eu disse, você não pode usar a abordagem via :normalet al. A chave para definir esses é o :help c_CTRL-\_emapeamento, que "avalia [s] {expr} e substitui [s] toda a linha de comando pelo resultado". Aqui está um exemplo simples que só funciona corretamente no final da linha de comando:

:cnoremap <F1> <C-\>esubstitute(getcmdline(), '\w\+$', '"&"', '')<CR>
Ingo Karkat
fonte
1
Não acho que o OP tenha criado um mapeamento para a linha de comando, mas sim um mapeamento a partir da linha de comando.
EvergreenTree