Como posso obter uma seleção visual do vimscript?

11

Se eu tenho algumas linhas de vimscript que quero testar antes de colocar no meu vimrc, é possível selecionar visualmente e então obtê-las?

eu tentei

  • faça a seleção visual v, depois faça movimentos para fazer a seleção etc.
  • :'<,'>so

Mas o vim dá um erro

nenhum intervalo permitido

Além disso

:'<,'>w | so

Usar ! escrever buffer parcial

Como posso obter o vimscript visualmente selecionado?

the_velour_fog
fonte

Respostas:

11

Na linha de comando, pressione <C-u>e digite @*e digite.

<C-u>excluirá o intervalo visual '<,'>que foi inserido automaticamente se algum texto for selecionado visualmente.

:@*executará o conteúdo do *registro que contém o que for visualmente selecionado no momento.

Mesmo que o texto selecionado / destacado esteja no seu navegador da web (firefox, chrome, ...), ele funcionará, o *registro permitirá que você acesse diretamente no vim.


Se o texto for selecionado em um buffer vim, outra solução é copiá-lo num registo nomeado, por exemplo, a um registo de digitação "ay.

Em seguida, na linha de comandos, digite: <C-r>ae digite.
Ctrl+ rlhe dará uma espécie de prompt representado pelo personagem "(para mais informações, leia :h c_Ctrl-r).
Nesse novo prompt, se você der o nome de um registro, seu conteúdo será inserido na linha de comando, onde você poderá editá-lo antes da execução.


Além disso, se você copiar algum texto sem especificar um registro, ele estará acessível a partir do registro sem nome " .

Então, suponha que você tenha uma linha de vimscript em um arquivo e deseje fornecê-lo rapidamente, copie-o e Y, na linha de comando, com: :<C-r>"e digite.

Finalmente, se você usar esta última solução, há apenas um problema do qual você deve estar ciente.
Se você vir um caractere estranho na linha de comando ^M, é a notação de sinal de intercalação do retorno de carro. Você deve excluí-lo, caso contrário, provavelmente receberá um erro.

Em resumo, você:

  1. copie sua linha de vimscript com Y
  2. alterne para o modo de comando com :
  3. pressione <C-r>para entrar no prompt de registros
  4. digite "para chamar o registro sem nome
  5. pressione backspace para excluir o ^Mcaractere
  6. e aperte enter.
saginaw
fonte
1
Doce! : D funciona bem - eu nunca tinha me deparado com isso @*antes, obrigado!
the_velour_fog
Estou feliz que tenha ajudado. Editei a resposta para propor outra solução.
Saginaw
1
legal, tentei sua sugestão de usá- : <C-r>a lo também funcionou muito bem :) Acho que o vim leu os ^Mcomo retornos de linha - e executou cada um como sua própria linha / comando individual?
the_velour_fog
Essa é uma boa pergunta, sinceramente, não sei. Normalmente, se eu não excluir esse caractere, tenho erros. Estou feliz que funcionou para você sem erros. Talvez alguém com mais conhecimento sobre o assunto possa nos explicar como o vim trata esse tipo de caracteres especiais.
Saginaw
2

Na verdade, eu faço isso de maneira um pouco diferente, apenas faço as edições no meu vimrc e a reencheio toda vez que escrevo. (Eu tenho um conjunto em cascata de arquivos vimrc, então isso me permite alterar qualquer um deles.)

if $MYVIMRC != ''
    autocmd BufWritePost    *vimrc      source $MYVIMRC
endif
traço-tom-bang
fonte
2

Mais diretamente para a pergunta do que minha outra resposta, você pode definir um mapeamento como este ( nnoremappara nenhuma seleção, basta executar a linha atual; vnoremappara quando o modo visual estiver ativo):

nnoremap <F2> :execute getline(".")<CR>
vnoremap <F2> :<C-u>for line in getline("'<", "'>") \| execute line \| endfor<CR>

Nos dois casos, a "linha atual" é :executed; portanto, na versão visual, você está :executeinserindo uma linha após a outra através da seleção visual.

Conforme declarado em outra resposta, ele <C-u>exclui a especificação de intervalo que aparece na linha de comando quando :é digitada. Os |caracteres precisam ser escapados porque, caso contrário, são interpretados como o final do vnoremapcomando.

Isso também pode ser transformado em uma função para se livrar de algumas das ginástica de escape, mas não me parece uma grande vitória neste momento. Basicamente, o vnoremap será expandido em várias linhas e calleditado com um intervalo ou não, dependendo do modo de mapeamento [nv].

traço-tom-bang
fonte
Ah, o mapeamento do modo visual executa linhas inteiras; portanto, se você for do tipo bloco ou personagem, ignorará os pontos inicial e final das linhas.
traço-tom-bang