Eu gostaria de colar o texto arrancado na linha de comando do Vim. É possível?
vim
copy-paste
dan
fonte
fonte
Respostas:
Sim. Bata Ctrl- Rentão ". Se você tiver caracteres de controle literais no que você puxou, use Ctrl- R, Ctrl- O," .
Aqui está uma explicação do que você pode fazer com os registros. O que você pode fazer com os registros é extraordinário e, depois de saber como usá-los, você não pode viver sem eles.
Registradores são basicamente locais de armazenamento para seqüências de caracteres. O Vim tem muitos registros que funcionam de diferentes maneiras:
0
(registroy
arrancado : quando você usa no modo normal, sem especificar um registro, o texto arrancado vai para lá e também para o registro padrão),1
para9
(mudando os registros de exclusão, quando você usa comandos comoc
oud
, o que foi excluído passa para o registro 1, o que estava no registro 1 vai para o registro 2, etc. ),"
(padrão de registro, também conhecido como registo sem nome Este é o lugar onde o. "vem em Ctrl- R, "),a
az
para seu próprio uso (capitalizadoA
paraZ
são para acrescentar aos registos correspondentes)._
(age como/dev/null
(Unix) ouNUL
(Windows), você pode escrever nele, mas é descartado e, quando lê, está sempre vazio),-
(pequeno registro de exclusão),/
(registo pesquisar padrão, atualizado quando você olha para o texto com/
,?
,*
ou#
, por exemplo, você também pode escrever para ele para alterar dinamicamente o padrão de pesquisa),:
(armazena o último comando digitado no VimL viaQ
ou:
, somente leitura),+
e*
(registros da área de transferência do sistema, você pode gravá-los para definir a área de transferência e ler o conteúdo da área de transferência)Veja
:help registers
para a referência completa.Você pode, a qualquer momento, usar
:registers
para exibir o conteúdo de todos os registros. Sinônimos e atalhos para este comando são:display
,:reg
e:di
.No modo Inserir ou Linha de comando, Ctrl- Rmais um nome de registro, insere o conteúdo desse registro. Se você deseja inseri-los literalmente (sem recuo automático, sem conversão de caracteres de controle, como
0x08
backspace, etc.), você pode usar Ctrl- R, Ctrl- O, nome do registro. Vejo:help i_CTRL-R
e parágrafos seguintes para mais referência.Mas você também pode fazer o seguinte (e provavelmente esqueci muitos usos para registros).
No modo normal, pressione ":p. O último comando que você usou no vim é colado no seu buffer.
Vamos decompor:
"
é um comando no modo Normal que permite selecionar o registro a ser usado durante a próxima operação de arrancar, excluir ou colar. Então, ":seleciona o registro de dois pontos (armazenando o último comando). Então pé um comando que você já conhece, que cola o conteúdo do registro.cf.
:help "
,:help quote_:
Você está editando um arquivo VimL (por exemplo, o seu
.vimrc
) e gostaria de executar um par de linhas consecutivas agora: yj:@"Enter.Aqui, yjpuxa a linha atual e a próxima (isso é porque j é um movimento linear, mas está fora do escopo desta resposta) no registro padrão (também conhecido como registro sem nome). Em seguida, o
:@
comando Ex reproduz comandos Ex armazenados no registro dado como argumento e"
é como você se refere ao registro sem nome. Veja também o topo desta resposta, que está relacionado.Não confunda
"
usado aqui (que é um nome de registro) com o"
do exemplo anterior, que era um comando no modo Normal.cf.
:help :@
e:help quote_quote
Insira o último padrão de busca em seu arquivo no modo de Inserção, ou na linha de comando, com Ctrl- R, /.
cf.
:help quote_/
,help i_CTRL-R
Corolário: Mantenha o seu padrão de pesquisa, mas acrescentar uma alternativa:
/
Ctrl- R, /\|alternative
.Você selecionou duas palavras no meio de uma linha no modo visual, puxou-as com
y
, elas estão no registro sem nome. Agora você deseja abrir uma nova linha logo abaixo de onde você é, com essas duas palavras::pu
. Isso é uma abreviação de:put "
. O:put
comando, como muitos comandos Ex, funciona apenas na linha.cf.
:help :put
Você também poderia ter feito:
:call setreg('"', @", 'V')
entãop
. Asetreg
função define o registro cujo nome é dado como primeiro argumento (como uma string), inicializa-o com o conteúdo do segundo argumento (e você pode usar registradores como variáveis com o nome de@x
ondex
está o nome do registro no VimL) e transforma-o no modo especificado no terceiro argumento,V
para linha, nada para caractere e literal^V
para bloco.cf.
:help setreg()
. As funções reversas sãogetreg()
egetregtype()
.Se você gravou uma macro com
qa
...q
,:echo @a
será informado o que você digitou e@a
reproduzirá a macro (provavelmente você a conheceu, muito útil para evitar tarefas repetitivas)cf.
:help q
,help @
Corolário do exemplo anterior: Se você tiver
8go
na área de transferência,@+
reproduzirá o conteúdo da área de transferência como uma macro e, portanto, passará para o 8º byte do seu arquivo. Na verdade, isso funcionará com quase todos os registros. Se a última string inseridadd
estiver no modo Inserir,@.
(porque o.
registro contém a última string inserida) excluirá uma linha. (Documentação Vim está errado a este respeito, uma vez que afirma que os registos#
,%
,:
e.
só irá funcionar comp
,P
,:put
e Ctrl- R).cf.
:help @
Não confunda
:@
(comando que executa comandos do Vim em um registro) e@
(comando no modo normal que executa comandos no modo normal em um registro).Exceção notável é
@:
. O registro de comando não contém os dois pontos iniciais nem o retorno de carro final. No entanto, no modo Normal,@:
fará o que você espera, interpretando o registro como um comando Ex, sem tentar reproduzi-lo no modo Normal. Portanto, se o seu último comando foi:e
, o registro contém,e
mas@:
recarregará o arquivo, não para o final da palavra.cf.
:help @:
Mostre o que você vai fazer no modo Normal antes de executá-lo:
@='dd'
Enter. Assim que você pressiona a=
tecla, o Vim muda para a avaliação da expressão: quando você digita uma expressão e pressiona Enter, o Vim calcula e o resultado age como um conteúdo de registro. Obviamente, o registro=
é somente leitura e one-shot. Cada vez que você começar a usá-lo, será necessário inserir uma nova expressão.cf.
:help quote_=
Corolário: Se você estiver editando um comando e perceber que deve inserir na linha de comando alguma linha do seu buffer atual: não pressione Esc! Use Ctrl- R
=getline(58)
Enter. Depois disso, você voltará à edição da linha de comando, mas ele inseriu o conteúdo da 58ª linha.Defina um padrão de pesquisa manualmente:
:let @/ = 'foo'
cf.
:help :let
Observe que, para fazer isso, você não precisa escapar
/
do padrão. No entanto, é necessário duplicar todas as aspas simples, é claro.Copiar todas as linhas que começam com
foo
, e posteriormente todas as linhas que contêmbar
a área de transferência, estes comandos de cadeia:qaq
(repõe a um registo de armazenamento de um macro vazio no seu interior),:g/^foo/y A
,:g/bar/y A
,:let @+ = @a
.Usar um nome de registro de capital faz com que o registro funcione no modo de acréscimo
Melhor, se
Q
não tiver sido remapeado pormswin.vim
, inicie o modo Ex comQ
, encadeie os "comandos de dois pontos" que são realmente melhores chamados "comandos Ex" e volte ao modo Normal digitandovisual
.cf.
:help :g
,:help :y
,:help Q
Espaço duplo seu arquivo:
:g/^/put _
. Isso coloca o conteúdo do registro do buraco negro (vazio ao ler, mas gravável, comportando-se como/dev/null
) linha a linha, após cada linha (porque toda linha tem um começo!).Adicionar uma linha contendo
foo
antes de cada linha::g/^/-put ='foo'
. Este é um uso inteligente do registro de expressão. Aqui,-
é um sinônimo para.-1
(cf.:help :range
). Uma vez que:put
coloca o texto após a linha, você deve explicitamente instruí-lo a agir sobre o anterior.Copie o buffer inteiro para a área de transferência do sistema:
:%y+
.cf.
:help :range
(para a%
parte) e:help :y
.Se você registrou incorretamente uma macro, pode digitar
:let @a='
Ctrl- R=replace(@a,"'","''",'g')
Enter'
e editá-la. Isso modificará o conteúdo da macro armazenada no registroa
e é mostrado aqui como você pode usar o registro de expressão para fazer isso.Se você fez
dddd
, você pode fazeruu
para desfazer. Comp
você pode obter a última linha excluída. Mas, na verdade, você também pode recuperar até 9 exclusões com os registros@1
através@9
.Melhor ainda, se o fizer
"1P
, o.
modo Normal será reproduzido"2P
e assim por diante.cf.
:help .
e:help quote_number
Se você deseja inserir a data atual no modo Inserir: Ctrl- R
=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@
no comando de modo normal que interpreta o conteúdo de um registro como pressionamentos de tecla no modo normal (exceto quando você usa o:
registro, que contém o último comando reproduzido sem os dois pontos iniciais: nesse caso, ele repete o comando como se você também tivesse digitado novamente os dois pontos e a tecla de retorno final)."
no modo normal, comando que ajuda a selecionar um registro para arrancar, colar, excluir, corrigir etc."
também é um nome de registro válido (o registro padrão ou sem nome) e, portanto, pode ser passado como argumento para comandos que esperam nomes de registrofonte
Para colar algo que é a área de transferência do sistema, você pode simplesmente usar SHIFT- INS.
Funciona no Windows, mas acho que também funciona bem no Linux.
fonte
:!rm -rf /<cr>
, ele será executado. Use registros em vez disso!shift-ins
é mais fácil do quectrl-R+*
? Isso é claro se você estiver no gvim. Se você está no terminal conectado a outra máquina e deseja colar algo da sua área de transferência, sabe algo melhor do queshift-ins
? porque os registros não funcionam nessa situação. Pense antes de comentar e fazer outras coisas (como voto negativo)."Gostaria de colar texto arrancado na linha de comando do Vim."
Embora a resposta mais votada esteja muito completa, prefiro editar o histórico de comandos.
No modo normal, digite:
q:
. Isso fornecerá uma lista de comandos recentes, editáveis e pesquisáveis com os comandos vim normais. Você começará em uma linha de comando em branco na parte inferior.Para o exato que o artigo pede, colando uma linha arrancada (ou arrancou qualquer coisa) em uma linha de comando, puxe seu texto e depois:
q:p
(entre no modo de edição do histórico de comandos e, em seguida, (p) coloque seu texto arrancado em um novo comando Edite à vontade, enterpara executar.Para sair do modo histórico de comandos, é o contrário. No modo normal na história comando, digite:
:q
+enterfonte
Para colar algo da área de transferência do sistema na linha de comando do Vim ("modo de comando"), use Ctrl+ Rseguido de +. Para mim, pelo menos no Ubuntu, o Shift+ Insnão está funcionando.
PS: Não sei por que Ctrl+ Rseguido por *, que é teoricamente o mesmo que Ctrl+ Rseguido por +, nem parece funcionar sempre. Pesquisei e descobri a +versão e ela parece funcionar sempre, pelo menos na minha caixa.
fonte
Vale a pena notar também que os registros de arrancamento são os mesmos que os buffers de macro. Em outras palavras, você pode simplesmente escrever todo o comando em seu documento (incluindo seu snippet colado), depois
"by
puxá-lo para ob
registro e executá-lo com@b
.fonte
Eu estava tendo um problema semelhante. Eu queria que o texto selecionado terminasse em um comando, mas não confie em colá-lo. Aqui está o comando para o qual eu estava tentando escrever um mapeamento:
Os documentos para este plug-in são exibidos apenas usando literais de string. O seguinte será interrompido se você tentar selecionar o texto que contém aspas duplas:
Para contornar isso, basta referenciar o conteúdo da macro usando
@
:Passa o conteúdo do registro sem nome e trabalha com minhas aspas duplas e edgecases multilinhas.
fonte
@
caractere para o comando vimux. pense@
como escapando da citação dupla a seguir e sendo tratado como um registro, e não como um caractere regular. O quevnoremap
eu defini está ativo no modo visual, então ele puxa o texto selecionado e o cola no comando vimux, enviando-o para um intérprete em execução em um painel adjacente. realmente ótimo para trabalhar em um script e testar pequenas partes dele com algumas teclas.OS X
Se você estiver usando o Vim no Mac OS X, infelizmente ele vem com uma versão mais antiga e não cumpre as opções da área de transferência. Felizmente, Homebrew pode facilmente resolver esse problema.
Instale o Vim:
brew install vim --with-lua --with-override-system-vi
Instale a versão da GUI do Vim:
brew install macvim --with-lua --with-override-system-vi
Reinicie o terminal para que ele entre em vigor.
Anexe a seguinte linha a
~/.vimrc
set clipboard=unnamed
Agora você pode copiar a linha no Vim
yy
e colá-la em todo o sistema.fonte
Para o contexto, essas informações vêm do comportamento pronto para uso, sem plugins, sem .vimrc Vim 7.4 no Linux Mint com as opções padrão.
Você sempre pode selecionar texto com o mouse (ou usar Vou ve colocar a seleção no registro "*) e colá-lo na linha de comando com Shift+ Ctrl+v .
Digitar Ctrl+ rna linha de comando fará com que seja solicitado um nome de registro. portanto, digitar :CTRL-r*colocará o registro de conteúdo * na linha de comando. Ele colará qualquer registro, não apenas "*. Veja
:help c_CTRL-R
.Além disso, o botão do meio do mouse colará na linha de comando.
Veja
:help->quote-plus
uma descrição de como o X Window lida com a seleção. Mesmo em um Vim simples e pronto para uso (novamente, no Vim 7.4 no Linux Mint, de qualquer maneira), qualquer seleção feita com o botão esquerdo do mouse pode ser colada na linha de comando com o botão do meio do mouse.Além disso, o botão do meio do mouse também colará o texto selecionado no Vim em muitos outros aplicativos do X Window, inclusive os da GUI (por exemplo, Firefox e Thunderbird ) e colar texto na linha de comando também é possível onde o texto foi selecionado em outros aplicativos .
Veja: help-> x11-selection para obter informações adicionais.
tl; dr
Tente a abordagem: CTRL-r primeiro e, em seguida, use Shift+ Ctrl+ vou o botão do meio do mouse, se precisar de algo mais.
É admitido que pode ser confuso.
fonte
"[a-z]y
: Copia texto para o registro [az]Use
:!
para ir para o comando editarCtrl+ R: Siga a identidade do registro para colar o que você copia.
É usado no CentOS 7.
fonte
Se você tiver dois valores agrupados em dois registradores diferentes (por exemplo, registrador
a
e registradorb
), basta definir uma variávelc
e executar a operação nela.Por exemplo,
:set c = str2float(@a) + str2float(@b)
e você pode colar o conteúdo dec
qualquer lugar.Por exemplo, enquanto estiver no modo INSERT,
CTRL + R
digite=
para entrar no registro de expressão e digite apenasc
após o sinal de igual e pressione ENTER. Concluído, agora você deve ter o total dea
eb
registros.Tudo isso pode ser gravado em uma macro e repetido!
A
str2float
função é usada se você estiver trabalhando com flutuadores; caso contrário, obterá números inteiros.Não tenho certeza se isso é idiomático, mas funcionou para o meu caso, onde eu precisava adicionar 2 números seguidos e repeti-lo por mais 500 linhas.
fonte