Estou tentando definir uma macro que gera rapidamente uma lista de palavras aleatórias.
Eu quero que a macro transforme isso em uma lista como
a
b
c
d
e
nisso
arezzo
bywords
czars
détente
eyrie
O que tenho até agora:
- colocar o cursor na letra
a
- começar a gravar macro
qq
a
entre no modo de inserção<C-x><C-k> - perform dictionary completion on the character before cursor - in this case the letter
a`<C-p>
selecione o último item na lista de conclusão que aparece, no meu sistema é a palavraarezzo
. (NBlongest
incluí na minha'completeopt'
configuração, necessária para<C-p>
trabalhar dessa maneira durante a conclusão:)'set completeopt=longest,menuone,preview'
.<C-y>
aceite a conclusão^[^[
sair do modo de inserçãoj
desça para a próxima linha, pronto para fazer a mesma operação na próxima linhaq
pare de gravar
quando crio a macro e passo as etapas manualmente, tudo funciona bem; no entanto, quando executo a macro, vejo uma mensagem piscando na linha de comando, algo como:
digitalizando arquivo de dicionário
e nada acontece, apenas os comandos da macro j
são executados, ou seja, o cursor se move para baixo da linha, mas nenhum dos comandos de conclusão é executado.
É possível usar as conclusões do modo de inserção em uma macro e, em caso afirmativo, como posso fazer isso?
autocompletion
macro
the_velour_fog
fonte
fonte
<C-p>
passo ... quando eu faço isso no meu vim, ele apenas dá a mensagemback at original
- não seleciona o último item. Usei a tecla de seta duas vezes para selecionar a última palavra (meu casoazures
), pressione enter e entãoEsc+j+q
.. então funciona muito bem na execução de macroset completeopt=longest,menuone,preview
alongest
opção que causa<C-p>
a inserção imediata. Se eu removerlongest
dacompleteopt
string, recebo o mesmo comportamento que você. Além disso, sim, as teclas de seta funcionaram! obrigado (esqueci que você pode usá-los para navegar na lista de conclusão) #:set completeopt=
ea<c-x><c-k><esc>j
como sua macro.Respostas:
EDIT : Realmente você está após a conclusão do dicionário; você não precisa necessariamente do modo de inserção (modo Ctrl + X) para fazer isso. Como você descobriu, isso torna o trabalho com macros uma verdadeira dor. O script abaixo pode ser usado para concluir o dicionário sem o modo de inserção, para que você possa repeti-lo facilmente dentro de uma macro.
Adicione o código abaixo ao seu
.vimrc
arquivo, feche e reabra todas as janelas do vim para obter a nova função e, em seguida, registre-se pressionando alternadamente<C-k>
para concluir ej
passar para a próxima linha. Eu adicionei uma verificação para alongest
opção e, se estiver desativada, seleciona uma entrada aleatória usando o tempo aleatório do sistema. Se encontrar alongest
opção, ela procurará manualmente a entrada correspondente mais longa do dicionário e a inserirá.Se você não gosta do
<C-k>
mapeamento, sinta-se à vontade para alterá-lo como achar melhor. Deve funcionar com qualquer mapeamento que você desejar.Além disso, o comando para retornar a expressão para o mapeamento a avaliar adiciona um
\<esc>
caractere ao final, para que deixemos o modo de inserção automaticamente após cada inserção e um0cw
na frente para entrar no modo de inserção para começar e certifique-se de substituir a palavra inteira corretamente. Dependendo do comportamento exato que você deseja (se suas palavras não estiverem bem na frente de cada linha), você poderá usarbcw
para encontrar o início real da palavra. No entanto, você verá algumas esquisitices ao voltar às palavras que começam a linha. Provavelmente existe um comando mais avançado para ignorar o final da linha e fazer as duas coisas ao mesmo tempo, mas não consegui encontrar um.Além disso, não seria difícil estender a lógica aqui para criar mapeamentos alternativos (usando, por exemplo, parâmetros de função) que executam qualquer função fornecida pelo modo de inserção. Ficarei feliz em ajudar com esses requisitos e atualizar esse script, pois tenho tempo.
fonte
sleep
comando também?completeopt
descrito nos comentários (novamente, não por mim). edit : Ops,'longest'
é necessário para actrl-p
etapa: nãoctrl-y
. Ainda assim, as etapas descritas pelo questionador funcionam para mimvim -Nu NONE
com ascompleteopt
edições editadas.