Como uso registros vim?


926

Eu só sei de uma instância usando registradores é através da CtrlR*qual colo o texto de uma área de transferência.

Quais são os outros usos dos registradores? Como usá-los?

Tudo o que você sabe sobre os registros VI (vamos nos concentrar no vi 7.2) - compartilhe conosco.


22
I deu uma longa resposta na utilização de registos
Benoit

Respostas:


1185

Os registros no Vim permitem executar ações ou comandos no texto armazenado dentro deles. Para acessar um registro, digite "aantes de um comando, onde aé o nome de um registro. Se você deseja copiar a linha atual no registro k, pode digitar

"kyy

Ou você pode anexar a um registro usando uma letra maiúscula

"Kyy

Em seguida, você pode percorrer o documento e colá-lo em outro lugar usando

"kp

Para colar da área de transferência do sistema no Linux

"+p

Para colar da área de transferência do sistema no Windows (ou da área de transferência "realce do mouse" no Linux)

"*p

Para acessar todos os registros atualmente definidos, digite

:reg

165
E "+é um registro especial que se refere à área de transferência do sistema.
Aaron McDaid

17
No Windows, a área de transferência pode ser acessada com "*; então o comando para copiar até o final do arquivo se torna "*yG.
Aditya MP

44
No X (Linux, possivelmente também no OS-X), *está a área de transferência "destaque do mouse" e a área de transferência +do Ctrl-XCV.
dotancohen

20
Existe uma maneira de acrescentar ao registro da área de transferência (já que não há capital +)?
Naitsirhc

8
@dotancohen Tecnicamente ele é chamado seleção principal, mas eu acho "higlight mouse" é mais fácil para as pessoas obterem :)
kyrias

783

Fiquei satisfeito quando descobri o 0registro. Se você puxar o texto sem atribuí-lo a um registro específico, ele será atribuído ao 0registro, além de ser salvo no "registro padrão . A diferença entre o 0e "registros é que 0só é preenchida com texto arrancou, enquanto que o padrão de registro também é preenchida com o texto excluído usando d/ D/ x/ X/ c/ C/ s/ Scomandos.

Acho isso útil quando quero copiar um texto, excluir algo e substituí-lo pelo texto copiado. As etapas a seguir ilustram um exemplo:

  • Arranque o texto com o qual você deseja copiar y[motion]- esse texto é salvo "e 0registra
  • Exclua o texto que você deseja substituir d[motion]- este texto é salvo no "registro
  • Cole o texto arrancado com "0p

Onde "está o comando para usar um registro para o próximo comando.

Na etapa final, se você colasse do registro padrão (com p), ele usaria o texto que você acabou de excluir (provavelmente não o que você pretendia).

Observe que pou Pcola do registro padrão. O equivalente à mão longa seria ""p(ou ""P) e "0conterá o último puxão, conterá "1a última exclusão ou alteração.

Para mais informações, consulte :help registers.


17
pou Ppastas do registro padrão. O equivalente longhand seria ""p(ou ""P).
Nelstrom 02/10/2009

186
A propósito, da mesma forma que "0 mantém o último arranco", 1 mantém a última exclusão ou alteração.
precisa saber é o seguinte

6
"é o comando para usar um registro para o próximo comando. Então ""p, usaria o "registrador para o comando colar e "0pusaria o 0registrador.
Ramon Marco L. Navarro

5
0psignificaria ir para o primeiro caractere da linha atual e colar do conteúdo do registrador padrão ( "). "pseria um comando incompleto, pois você precisa especificar para que comando usar o registro p.
Ramon Marco L. Navarro

15
Da mesma maneira que "1 mantém a última exclusão", 2 mantém a segunda última exclusão ", 3 mantém a terceira última etc." até "9
James

330

Uma das minhas partes favoritas sobre registros é usá-los como macros!

Digamos que você esteja lidando com um arquivo de valor delimitado por tabulação como tal:

ID  Df  %Dev    Lambda
1   0   0.000000    0.313682
2   1   0.023113    0.304332
3   1   0.044869    0.295261
4   1   0.065347    0.286460
5   1   0.084623    0.277922
6   1   0.102767    0.269638
7   1   0.119845    0.261601

Agora você decide que precisa adicionar um sinal de porcentagem no final do campo% Dev (a partir da 2ª linha). Criaremos uma macro simples no mregistro (selecionado arbitrariamente) da seguinte maneira:

  1. Pressione:: qmPara iniciar a gravação da macro no mregistro.

  2. EE: Vá para o final da 3ª coluna.

  3. a: Insira o modo para anexar ao final desta coluna.

  4. %: Digite o sinal de porcentagem que queremos adicionar.

  5. <ESC>: Volte ao modo de comando.

  6. j0: Vá para o início da próxima linha.

  7. q: Parar gravação de macro

Agora podemos apenas digitar @mpara executar esta macro na linha atual. Além disso, podemos digitar @@para repetir ou 100@mfazer isso 100 vezes! A vida parece muito boa.

Nesse ponto, você deve estar dizendo: " Mas espere, o que diabos isso tem a ver com os registros ?"

Ponto excelente. Vamos investigar o que há no conteúdo do mregistro digitando "mp. Em seguida, obtemos o seguinte:

EEa%<ESC>j0

A princípio, parece que você abriu acidentalmente um arquivo binário no bloco de notas, mas, à segunda vista, é a sequência exata de caracteres em nossa macro!

Você é uma pessoa curiosa, então vamos fazer algo interessante e editar esta linha de texto para inserir um !antigo, em vez de chato %.

EEa!<ESC>j0

Então vamos colocar isso no nregistro digitando B"nyE. Então, só para chutar, vamos executar a nmacro em uma linha de nossos dados usando @n....

OMG, ADICIONOU A !

Essencialmente, executar uma macro é como pressionar a sequência exata de teclas no registro dessa macro. Se isso não for um truque legal de registro, eu como meu chapéu.


65
Isso é totalmente fundamental. Até agora, eu não havia notado que os registros são iguais aos buffers de macro. Isso significa que você pode simplesmente armazenar todas as suas macros em texto, puxá-las e executá-las. Muito legal e um pouco estranho. Very Vim.
precisa saber é o seguinte

1
É uma nota editorial menor, mas que combina com negrito ... Poderia ter sido consertado. É bastante desagradável no momento.
ashrasmun

1
Você pode usar em +vez de j0ir para o primeiro caractere que não está em branco na próxima linha.
Gokul

100

Outros registros úteis:

"*ou "+- o conteúdo da área de transferência do sistema

"/ - último comando de pesquisa

": - último comando.

Observe que, com as macros do vim, é possível editá-las, pois elas são apenas uma lista dos pressionamentos de tecla usados ​​ao gravar a macro. Assim, você pode gravar em um arquivo de texto a macro (usando "appara escrever a macro a ), editá-los e carregá-los em um registro com "ay$. Ótima maneira de armazenar macros úteis.


6
Vim padrão no OSX não inclui a "integração * Você pode instalar uma versão de homebrew-alt que faz Verifique com.. vim --version- -clipboardsignifica que você não tê-lo, +clipboardsignifica que você.
Xavier Shay

15
No X11, "*e "+são ainda mais "+legais : cola o último texto copiado ctrl+c(buffer de cópia) ou o atalho que você usa (ou right-click>copy). "*cola o último texto destacado com o mouse (buffer de seleção). Portanto, se você copiar algo com ctrl+ce destacar outro item com o mouse, poderá escolher qual colar. Isso não funciona no Windows, onde esses dois registros são sinônimos.
naught101

1
Abençoe-o, eu tenho procurado "*e "+por anos! Eu pensei que apenas o gvim tivesse acesso às pranchetas do sistema, mas aparentemente o vim comum também!
Tarrasch

@ Tarrasch Se você usar o console vim em vez do gvim, descobrirá muitas outras coisas. Eu acho que. visite #vim no freenode também!
trusktr

1
Como ativar se um tem -xterm_clipboardsobre vim --version. Qualquer pacote simples para instalar? (debian / apt-get). Obrigado.
Dr Beco

77

O registro do buraco negro _ é o /dev/nulldos registros.

Eu o uso no meu vimrc para permitir a exclusão de caracteres únicos sem atualizar o registro padrão:

noremap x "_x

e colar no modo visual sem atualizar o registro padrão:

vnoremap p "_dP

O segundo mapeamento também é muito útil. Veja aqui uma explicação: marcorucci.com/blog/#visualModePaste
mrucci 5/09/11

21
o mapeamento para xfica menos conveniente para transpor caracteres.
skeept

Pressionando x não apaga a última coisa que você puxou, onde encontrará está no registrador 0. Imprensa xa algumas vezes, então "0p para colar o material que você puxou.
trusktr

2
Para expandir a observação de skeept acima: com esse xmapeamento, você não pode mais executar o xp"comando" para alternar a corrente com o próximo caractere. Muito útil para correções de erros de digitação. Também temos Xpque trocar a corrente pelo caractere anterior.
Daniel Andersson

56

Se você quiser colar o conteúdo do registro em um comando ex-mode, pressione <C-r><registerletter>.

Por que você usaria isso? Eu queria fazer uma pesquisa e substituir por uma sequência longa, então a selecionei no modo visual, comecei a digitar a expressão de pesquisa / substituição :%s/[PASTE YANKED PHRASE]//ge continuei no meu dia.

Se você deseja colar apenas uma única palavra no modo ex, verifique se o cursor está nele antes de entrar no modo ex e pressione-o <C-r><C-w>no modo ex para colar a palavra.


6
Colar texto na :linha de comando é a melhor coisa que eu aprendi hoje
Shahbaz

1
Você também pode usar <CR> <registerletter> no modo de inserção
Floegipoky

1
Eu gosto de escrever regexes de localização / substituição primeiro com just /[write out your regex]<cr>e depois para substituir just s/<C-R>//replacement/. Dessa forma, você obtém o benefício de feedback ao vivo sobre sua regex antes de executar a substituição.
GabeIsman

44

Eu acho que o registro secreto do guru é a expressão = register. Pode ser usado para mapeamentos de criativos.

:inoremap  \d The current date <c-r>=system("date")<cr>

Você pode usá-lo em conjunto com o seu sistema como acima ou obter respostas das funções personalizadas do VimL etc.

ou apenas coisas ad hoc como

<c-r>=35+7<cr>

3
Confira o [vídeo de Derek Wyatt sobre o uso do registro de expressões] ( derekwyatt.org/vim/vim-tutorial-videos/… )
Jeromy Anglim

1
O link de @JeromyAnglim agora está aqui: derekwyatt.org/vim/tutorials/advanced/#expression-register
Djizeus

39

Um truque interessante é usar "1ppara colar a última exclusão / alteração (e, em seguida, usar .repetidamente para colar as exclusões subsequentes. Em outras palavras, "1p...é basicamente equivalente a "1p"2p"3p"4p.

Você pode usar isso para fazer a ordem inversa de algumas linhas: dddddddddd"1p....


aha isso é fantástico. O que eu realmente quero, porém, é o mesmo comportamento para arrancos
RyanM

18

Na página de ajuda do vim:

CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*
        Insert the contents of a numbered or named register.  Between
        typing CTRL-R and the second character '"' will be displayed
        <...snip...>
        Special registers:
            '"' the unnamed register, containing the text of
                the last delete or yank
            '%' the current file name
            '#' the alternate file name
            '*' the clipboard contents (X11: primary selection)
            '+' the clipboard contents
            '/' the last search pattern
            ':' the last command-line
            '-' the last small (less than a line) delete
            '.' the last inserted text
                            *c_CTRL-R_=*
            '=' the expression register: you are prompted to
                enter an expression (see |expression|)
                (doesn't work at the expression prompt; some
                things such as changing the buffer or current
                window are not allowed to avoid side effects)
                When the result is a |List| the items are used
                as lines.  They can have line breaks inside
                too.
                When the result is a Float it's automatically
                converted to a String.
        See |registers| about registers.  {not in Vi}
        <...snip...>

17
  • q5 grava edições no registrador 5 (o próximo q para de gravar)
  • : reg mostra todos os registros e qualquer conteúdo neles
  • @ 5 execute o registro 5 macro (edições gravadas)

15
Não gosto da tecla @ para iniciar macros (três pressionamentos de tecla). Então, mapeei o F2 para iniciar a macro armazenada no registro q: nmap <F2> @q eu uso o registro q, porque, para salvar uma macro para a reprodução do F2, basta clicar qq. macro rápida salvar e reproduzir.
Andrej Panjkov 11/08/19

16

Eu uso o registro padrão para grep para texto na minha janela vim sem ter que alcançar o mouse.

  1. arrancar texto
  2. :!grep "<CTRL-R>0"<CR>

12

Use registradores em comandos com @. Por exemplo:

echo @a
echo @0
echo @+

Defina-os no comando:

let @a = 'abc'

Agora "apvai colar abc.


8

Uma grande fonte de confusão é o registro padrão ". É importante saber como funciona. É muito melhor se o registro padrão for evitado na maioria das vezes. A explicação da documentação do Vim:

Vim fills this register with text deleted with the "d", "c", "s", "x" commands
or copied with the yank "y" command, regardless of whether or not a specific
register was used (e.g.  "xdd).  This is like the unnamed register is pointing
to the last used register.

Portanto, o registro padrão é realmente um ponteiro para o último registro usado. Quando você exclui ou arranca algo, esse registro aponta para outros registros. Você pode testar isso verificando os registros. Sempre há outro registro exatamente igual ao registro padrão: o registro de arrancamento ( "0), o primeiro registro de exclusão ( "1), o registro de exclusão pequeno ( "-) ou qualquer outro registro que foi usado para excluir ou arrancar.

A única exceção é o registro do buraco negro. O documento do Vim diz:

An exception is the '_' register: "_dd does not store the deleted text in any
register.

Normalmente, você é muito melhor fora usando diretamente: "0, "-e "1-"9registros padrão ou registos nomeados.


8

Um registro esquecido é o '.' registro de pontos que contém o último texto inserido, não importa como ele foi inserido, por exemplo, ct] (mude até]). Então você percebe que precisa inseri-lo em outro lugar, mas não pode usar o método de repetição de pontos.

 :reg .
 :%s/fred/<C-R>./

7

Meu registro favorito é o ':'registro. A execução @:no modo Normal permite repetir o comando ex anteriormente executado.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.