I'gostaria de colar texto arrancado na linha de comando da Vim. É possível?
Sim. Hit Ctrl-R depois ". Se tiver caracteres de controlo literais no que puxou, utilize kbd>Ctrl-R, Ctrl-O, ". Aqui está uma explicação do que você pode fazer com os registros. O que pode fazer com os registos é extraordinário e, uma vez que saiba como utilizá-los, não poderá viver sem eles. Os registradores são basicamente locais de armazenamento de cordas. Vim tem muitos registros que funcionam de diferentes maneiras:
0
(registro yank: quando você utiliza y
no modo normal, sem especificar um registro, o texto yanked vai para lá e também para o registro padrão),1
a 9
(mudando registros de exclusão, quando você utiliza comandos como c
ou d
, o que foi excluído vai para o registro 1, o que estava no registro 1 vai para o registro 2, etc.),"
(registro padrão, também conhecido como registro sem nome. É aqui que o " vem em Ctrl-R, "),a' a
z' para seu próprio uso (os A' a
Z' em maiúsculas são para anexar aos registros correspondentes)._
(age como /dev/null
(Unix) ou NUL
(Windows), você pode escrever para ele mas ele's descartado e quando você lê dele, ele está sempre vazio),-
(pequeno registo de eliminação),/
(registro de padrão de busca, atualizado quando você procura por texto com /
, ?
, *
ou #
por exemplo; você também pode escrever nele para alterar dinamicamente o padrão de busca),:
(armazena o último comando digitado em VimL via Q
ou :
, somente leitura),+
e *
(registros da área de transferência do sistema, você pode escrever a eles para definir a área de transferência e ler o conteúdo da área de transferência a partir deles)
Veja :registros de ajuda' para a referência completa. Você pode, a qualquer momento, utilizar
:registros' para exibir o conteúdo de todos os registros. Sinônimos e abreviações para este comando são :display',
:reg' e :di'. No modo Insert ou Command-line, <kbd>Ctrl</kbd>-<kbd>R</kbd> mais um nome de registo, insere o conteúdo deste registo. Se pretender inseri-los literalmente (sem auto-indentação, sem conversão de caracteres de controlo como
0x08para o backspace, etc.), pode utilizar <kbd>Ctrl</kbd>-<kbd>R</kbd>, <kbd>Ctrl</kbd>-<kbd>O</kbd>, nome do registo. Veja
:ajuda i_CTRL-R` e os parágrafos seguintes para mais referências.
Mas você também pode fazer o seguinte (e eu provavelmente esqueci muitos usos para registros)."
é um comando de modo normal que permite selecionar qual registro será utilizado durante a próxima operação de yank, apagar ou colar. So ": seleciona o registro de dois pontos (armazenando o último comando). Depois p é um comando que já conhece, cola o conteúdo do registo.
cf. :help "
, :help quote_:
.vimrc
) e gostaria de executar algumas linhas consecutivas agora mesmo: yj:<@"kbd>Enter.:@
Ex executa comandos Ex armazenados no registro dado como argumento, e "
é como você se refere ao registro não-nomeado. Veja também o topo desta resposta, que está relacionada.
Não confunda "
utilizado aqui (que é um nome de registro) com "
do exemplo anterior, que era um comando de modo normal.
cf. :help :@
e :help quote_quote
.:ajuda a citar_/
, help i_CTRL-R
.
Corolário: Mantenha o seu padrão de pesquisa mas adicione uma alternativa: /
Ctrl-R, / `|alternativo'.y
, elas estão no registro sem nome. Agora você quer abrir uma nova linha logo abaixo de onde você está, com essas duas palavras: :pu
. Este é o diminutivo de :put "
. O comando :put
, como muitos comandos Ex, funciona apenas linewise.
cf. :help :put
.
Você também poderia ter feito: :call setreg('"', @", 'V')
então p
. A função setreg
define o registro do qual o nome é dado como primeiro argumento (como uma string), inicializa-o com o conteúdo do segundo argumento (e você pode utilizar registros como variáveis com o nome @x
onde x
é o nome do registro em VimL), e o transforma no modo especificado no terceiro argumento, V
para linewise, nada para characterwise e literal ^V
para blockwise.
cf. :help setreg()
. As funções invertidas são getreg()
e getregtype()
.qa
...q
, então :echo @a' lhe dirá o que você digitou, e
@a' repetirá a macro (provavelmente você sabia disso, muito útil para evitar tarefas repetitivas).
cf. :help q
, help @
Corolário do exemplo anterior: Se você tem 8go
na área de transferência, então @+
irá reproduzir o conteúdo da área de transferência como uma macro, e assim ir para o 8º byte do seu arquivo. Na verdade, isso funcionará com quase todos os registros. Se a sua última string inserida foi dd
no modo Insert, então @.
irá (porque o .
registro contém a última string inserida) apagar uma linha. (A documentação do Vim está errada a esse respeito, já que diz que os registros #
, %
, :
e .
só funcionarão com p
, P
, :put
e Ctrl-R).
cf. :ajuda @
Don't confunda :@
(comando que executa comandos Vim de um registrador) e @
(comando de modo normal que executa comandos de modo normal de um registrador).
A exceção notável é @:
. O comando register não contém os dois pontos iniciais e também não contém o retorno final da carruagem. Entretanto, no modo Normal, @:
fará o que você espera, interpretando o registro como um comando Ex, não tentando tocá-lo no modo Normal. Então se seu último comando foi :e
, o registrador contém e
mas @:
irá recarregar o arquivo, não irá para o fim da palavra.
cf. :help @:
@='dd'
Enter. Assim que você pressiona a tecla =
, Vim muda para avaliação de expressão: quando você digita uma expressão e pressiona Enter, Vim a computa, e o resultado atua como um conteúdo de registro. É claro que o registro =
é somente leitura, e um tiro. Cada vez que você começar a usá-lo, você terá que inserir uma nova expressão.
cf. :ajuda a citar_=`` Corolário: Se você estiver editando um comando e perceber que deve inserir na sua linha de comando alguma linha do seu buffer atual: don't pressione <kbd>Esc</kbd>! Utilize <kbd>Ctrl</kbd>-<kbd>R</kbd>
=getline(58)` Enter. Depois disso, você estará de volta à edição da linha de comando, mas ela inseriu o conteúdo da 58ª linha.:let @/ = 'foo'
cf. :ajuda :let
Note que ao fazer isso, você precisa't para escapar /
no padrão. No entanto, você precisa dobrar todas as aspas simples, é claro.foo
, e depois todas as linhas contendo bar
para a área de transferência, encadeando estes comandos: qaq
(redefine o registro a armazenando uma macro vazia dentro dele), :g/^foo/y A
, :g/bar/y A
, :let @+ = @a
.
O uso de um nome de registro em maiúsculas faz o registro funcionar no modo anexo
Melhor, se Q
não tiver sido remapeado por mswin.vim
, inicie o modo Ex com Q
, acorrente aqueles "comandos de dois pontos" que na verdade são melhor chamados de "comandos Ex", e volte ao modo Normal digitando visual
.
cf. :help :g
, :help :y
, :help Q
.:g/^/put _
. Isto coloca o conteúdo do registro do buraco negro (vazio ao ler, mas escrevível, comportando-se como /dev/null
) linewise, após cada linha (porque cada linha tem um começo!).foo
antes de cada linha: :g/^/-put ='foo'
. Esta é uma utilização inteligente do registo de expressões. Aqui, -
é sinônimo de .-1
(cf. :help :range
). Como :put
coloca o texto após a linha, você tem que dizer explicitamente para agir sobre o anterior.:%y+
.
cf. :help :range
(para a parte %
) e :help :y
.:let @a='
Ctrl-R =replace(@a,"'","''",'g')
Enter '
e editá-lo. Isto modificará o conteúdo da macro armazenada no registro a
, e it's mostra aqui como você pode usar o registro de expressões para fazer isso.dddd
, você pode fazer uu
para desfazer. Com p' você pode obter a última linha deletada. Mas na verdade você também pode recuperar até 9 deleções com os registros
@1até
@9. Melhor ainda, se você fizer
"1P', então .
no modo Normal irá jogar "2P', e assim por diante. cf.
:help .e
:help quote_number`.=strftime('%y%m%d')
Enter.
cf. :help strftime()
Mais uma vez, o que pode ser confuso::@
é um comando de linha de comando que interpreta o conteúdo de um registro como vimscript e o origina@`` em modo normal comando que interpreta o conteúdo de um registro como toques de tecla de modo normal (exceto quando você utiliza
:` register, que contém o último comando tocado sem os dois pontos iniciais: neste caso, ele replays o comando como se você também digitasse novamente os dois pontos e a chave de retorno final)."
em modo normal comando que ajuda a selecionar um registro para yank, colar, apagar, corrigir, etc."
também é um nome de registro válido (o padrão, ou sem nome, register) e, portanto, pode ser passado como um argumento para comandos que esperam nomes de registroPara colar algo da área de transferência do sistema na linha de comando vim ("modo de comando"), use Ctrl+R seguido por +. Para mim, pelo menos no Ubuntu, kbd>Shift+Ins não está a funcionar.
PS: Não sei porquê Ctrl+R seguido de * que é teoricamente o mesmo que Ctrl+R seguido de + doesn't parece funcionar sempre. Pesquisei e descobri o + versão e parece que funciona sempre, pelo menos na minha caixa.