Como colar texto arrancado na linha de comando do Vim

Respostas:

1157

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(registro yarrancado : quando você usa no modo normal, sem especificar um registro, o texto arrancado vai para lá e também para o registro padrão),
  • 1para 9(mudando os registros de exclusão, quando você usa comandos como cou d, 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, "),
  • aa zpara seu próprio uso (capitalizado Apara Zsão para acrescentar aos registos correspondentes).
  • _(age como /dev/null(Unix) ou NUL(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 via Qou :, 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 registerspara a referência completa.

Você pode, a qualquer momento, usar :registerspara exibir o conteúdo de todos os registros. Sinônimos e atalhos para este comando são :display, :rege :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 0x08backspace, 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 :putcomando, como muitos comandos Ex, funciona apenas na linha.

    cf. :help :put

    Você também poderia ter feito: :call setreg('"', @", 'V')então p. A setregfunçã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 @xonde xestá o nome do registro no VimL) e transforma-o no modo especificado no terceiro argumento, Vpara linha, nada para caractere e literal ^Vpara bloco.

    cf. :help setreg(). As funções reversas são getreg()e getregtype().

  • Se você gravou uma macro com qa... q, :echo @aserá informado o que você digitou e @areproduzirá a macro (provavelmente você a conheceu, muito útil para evitar tarefas repetitivas)

    cf. :help q,help @

    Corolário do exemplo anterior: Se você tiver 8gona á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 inserida ddestiver 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 com p, P, :pute 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, emas @: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êm bara á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 Qnão tiver sido remapeado por mswin.vim, inicie o modo Ex com Q, encadeie os "comandos de dois pontos" que são realmente melhores chamados "comandos Ex" e volte ao modo Normal digitando visual.

    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 fooantes 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 :putcoloca 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 registro ae é mostrado aqui como você pode usar o registro de expressão para fazer isso.

  • Se você fez dddd, você pode fazer uupara desfazer. Com pvocê pode obter a última linha excluída. Mas, na verdade, você também pode recuperar até 9 exclusões com os registros @1através @9.

    Melhor ainda, se o fizer "1P, o .modo Normal será reproduzido "2Pe 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 registro
Benoit
fonte
205
Não existe um distintivo "Proporção de comprimento de 100/1 entre resposta e pergunta?" :)
Benoit
8
É uma ótima resposta, mas faltam 1400 palavras para 900 palavras. :)
19
Esta resposta mudou a maneira como eu uso o vim. Obrigado Benoit
P. Myer Nore
11
Não se esqueça: reg, que listará todos os registros e seu conteúdo
eugenevd
3
Nas versões recentes do vim, exclusões menores que uma linha entram no "registro de pequenas exclusões" em vez de nos registros numerados. Referências: Vi e Vim , Vi e Vim , Reddit
Christian Long
48

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.

skeept
fonte
7
Sim, também funciona no Linux. Testado no GNOME no Vim e no GVim.
Teoulas 27/10
3
Na verdade, isso alimenta a área de transferência para o Vim como entrada do teclado; portanto, se você estiver no modo normal e colar :!rm -rf /<cr>, ele será executado. Use registros em vez disso!
27612 lereron
4
@lericson Não disse na minha resposta que isso é útil para algo que está no teclado do sistema? Eu não entendo o voto negativo. E, por exemplo, a sério? Você realmente tem isso na área de transferência? E você não acha que digitar shift-insé mais fácil do que ctrl-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 que shift-ins? porque os registros não funcionam nessa situação. Pense antes de comentar e fazer outras coisas (como voto negativo).
skeept
Penso que é desinformação e agi com base nesse julgamento.
lericson
1
Não funciona para mim. Acabei de receber '<S-Insert>' adicionado à minha linha de comando. Talvez esteja faltando alguma coisa. (Ubuntu 19.04 / 2: 8.1.0320-1ubuntu3.1).
Max Waterman
39

"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+enter

Wandspiegel
fonte
1
se você já está modificando um comando existente e não pressionou 'q:', pressione ctrl + f e isso permitirá a edição do histórico de comandos.
argila
14

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.

Proto
fonte
2
A diferença entre Ctrl-r + e Ctrl-r * é que a primeira é a área de transferência comum, mas no Linux existe um segundo tipo de área de transferência chamada "primária" que representa o texto selecionado mais recentemente (o botão do meio é colado a partir dele) . Porém, isso não está disponível no Windows ou no MAC #
Matias Thayer
13

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 "bypuxá-lo para o bregistro e executá-lo com @b.

naught101
fonte
1

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:

:call VimuxRunCommand("python")

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:

vnoremap y:call VimuxRunCommand("<c-r>"")<cr>

Para contornar isso, basta referenciar o conteúdo da macro usando @:

vnoremap y:call VimuxRunCommand(@")<cr>

Passa o conteúdo do registro sem nome e trabalha com minhas aspas duplas e edgecases multilinhas.

Conrad.Dean
fonte
Eu acho que seu último exemplo está faltando a"(@ ') Talvez você quis dizer VimuxRunCommand.'.
kd8azz
Isso enviaria o @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 que vnoremapeu 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.
usar o seguinte comando
1

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 yye colá-la em todo o sistema.

anônimo
fonte
1

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-plusuma 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.

wmmso
fonte
0
  1. "[a-z]y: Copia texto para o registro [az]

  2. Use :!para ir para o comando editar

  3. Ctrl+ R: Siga a identidade do registro para colar o que você copia.

É usado no CentOS 7.

yang
fonte
O que significa "Costumava ao CentOS 7." ?
Peter Mortensen
0

Se você tiver dois valores agrupados em dois registradores diferentes (por exemplo, registrador ae registrador b), basta definir uma variável ce executar a operação nela.

Por exemplo, :set c = str2float(@a) + str2float(@b)e você pode colar o conteúdo de cqualquer lugar.

Por exemplo, enquanto estiver no modo INSERT, CTRL + Rdigite =para entrar no registro de expressão e digite apenas capós o sinal de igual e pressione ENTER. Concluído, agora você deve ter o total de ae bregistros.

Tudo isso pode ser gravado em uma macro e repetido!

A str2floatfunçã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.

Rafael
fonte