Continuar um comando no modo ex depois de "norma"?

8

Costumo usar macros extremamente longas ao lidar com edição e refatoração repetitivas. Sempre que possível, escrevo-os como comandos no modo ex, em vez de gravá-los como macros, porque são mais fáceis de editar interativamente dessa maneira (com a janela de comando).

No entanto, às vezes eu preciso adicionar alguns comandos no modo normal, por exemplo, para puxar apenas parte de uma linha em vez de uma linha inteira para uso posterior na minha macro ou alinhar algum texto da maneira que eu quero.

Existe uma maneira de continuar um comando ex mode após a norminclusão?

(Para um exemplo real do tipo de complexidade de que estou falando :)

:'a+s/\_^\s*\(\S*\)::\_[^>]*>\s*\("[^"]*"\)\s*;\_s*\_$/    "\1", \2,/ | m 'a- | norm f,50a ^[d44|

Existe uma maneira de adicionar mais texto no final e executá-lo como um comando no modo ex?

Curinga
fonte
11
Deseja impedir que o :normalcomando consuma o restante da linha? Se assim você poderia envolvê-lo dentro de uma cadeia de caracteres que você pode executar com o :executecomando: :exe 'norm f,50a ^[d44|' | other Ex command.
Saginaw
:executepassará a string apenas como argumento para :normal, e o último não verá o que está depois na linha de comando, permitindo que você adicione outros comandos Ex. Há apenas uma coisa a prestar atenção, se a string contiver caracteres de controle não literais, como \epara <Esc>você ter que usar aspas duplas para permitir que o Vim os interprete, caso contrário, aspas simples impedem a interpretação de qualquer coisa dentro da string.
precisa

Respostas:

10

Se você tiver uma sequência de pressionamentos de tecla que deseja executar no modo normal na linha de comando, poderá usar o :normalcomando

No entanto, por padrão, o :normalcomando não pode ser seguido por outro comando, porque, como diz a ajuda:

    This command cannot be followed by another command,
    since any '|' is considered part of the command.

Portanto, se você quiser adicionar outro comando Ex depois :normal, poderá agrupar todo o :normalcomando dentro de uma sequência e, em seguida, fazer com que o :executecomando execute o último. Poderia dar algo como:

:exe 'norm {your keystrokes}' | Other Ex command

Ao contrário :normal, :executenão considerará o tubo como parte de seu argumento. Ele o considerará como uma terminação de comando e executará apenas o que está dentro da cadeia.
:normalnão verá o que está depois na linha de comando, apenas o que resta na string.
Portanto, você poderá adicionar outro comando Ex posteriormente sem :normaldigitá-lo no modo normal.

Há apenas uma pequena coisa para prestar atenção a:
se você cercar seu string com aspas simples, o Vim não irá interpretar qualquer coisa dentro dele, o que pode ser um problema se você quiser :normalbater caracteres de controle, tais como <Esc>, <CR>, <Tab>ou <C-V>por escrever caracteres especiais, respectivamente: \e, \r, \te \<C-V>.
Esses caracteres especiais são descritos em :help expr-quote.
Nesse caso, você pode usar aspas duplas em vez de aspas simples para envolver a string, para que o Vim possa interpretá-las corretamente.
Se os caracteres de controle forem literais (ou seja, se você vir a notação de sinal de intercalação: ^[para Escape, ^Mpara Enter, ^Ipara Tab, ^Vpara<C-V>), você não deve precisar de aspas duplas.

Quando você grava uma macro, a última armazena os caracteres de controle como literais, não usa o tipo de caracteres especiais descrito em :h expr-quote, portanto, você não precisa de aspas duplas. E se você deseja editar uma macro adicionando um caractere de controle literal, você pode prefixá-la <C-V>(consulte :h i_ctrl-vpara obter mais informações). Por exemplo, para adicionar uma fuga literal dentro do registro em que sua macro está armazenada ou na sequência de pressionamentos de tecla passados ​​como argumento :normal, você pode pressionar <C-V><Esc>.

saginaw
fonte