Saltar para o conteúdo

Vim/Usando registros

Origem: Wikilivros, livros abertos por um mundo aberto.
< Vim

O vim possui nove tipos de registros, cada tipo tem uma utilidade específica, por exemplo você pode usar um registro que guarda o último comando digitado, pode ainda imprimir dentro do texto o nome do próprio arquivo, vamos aos detalhes.

  1. O registro sem nome ""
  2. 10 registros nomeados de "0 a 9"
  3. O registro de pequenas deleções "-
  4. 26 registros nomeados de "a até z" ou de "A até Z"
  5. 4 registros somente leitura
  6. O registro de expressões "=
  7. Os registro de seleção e arrastar "*, "+ e "~
  8. O registro "buraco negro"
  9. Registro do último padrão de busca "/


O registro sem nome ""

[editar | editar código-fonte]

Armazena o conteúdo de ações como:

 d ............ deleção
 s ............ substituição
 c ............ um outro tipo de modificação
 x ............ apaga um caractere
 yy ........... copia uma linha inteira

Para acessar o conteúdo deste registro basta usar as letras p ou P que na verdade são comandos para colar abaixo da linha atual e acima da linha atual (em modo normal)

Registros nomeados de 0 a 9

[editar | editar código-fonte]

O registro zero armazena o conteúdo da última cópia 'yy', à partir do registro 1 vão sendo armazenadas as deleções sucessivas de modo que a mais recente deleção será armazenada no registro 1 e os registros vão sendo incrementados em direção ao nono.

Deleção menores que uma linha não são armazenadas nestes registros, caso em que o vim usa o registro de pequenas deleções ou que se tenha especificado algum outro registro. Para saber mais exceções para este registro leia o manual "change.txt" à partir da linha 1011.

:help registers

Registro de pequenas deleções

[editar | editar código-fonte]

Quando você deleta algo menor que uma linha o vim armazena os dados deletados neste registro.

Registros nomeados de 'a até z' ou 'A até Z'

[editar | editar código-fonte]

Você pode armazenar uma linha em modo normal assim:

   "ayy

Desse modo você guardou o conteúdo da linha no registro 'a' caso queira armazenar mais uma linha no registro 'a' use este comando

    "Add

Neste outro caso apaguei a linha corrente adicionando-a ao final do registro 'a'.

Registros somente leitura ":, "., "% e "#

[editar | editar código-fonte]
":  ...................... armazena o último comando 
".  ...................... armazena uma cópia do último texto inserido
"%  ...................... contém o nome do arquivo corrente
"#  ...................... contém o nome do arquivo alternativo

Uma forma prática de usar registros em modo insert é usando Control-r

Observação: lembre-se que no vim o circunflexo representa (nos atalhos) a tecla control.

 ^r%  ............. insere o nome do arquivo atual
 ^r:  ............. insere o último comando digitado
 ^r/  ............. insere a última busca efetuada

Em modo insert você pode repetir a última inserção de texto simplesmente pressionando

  Control-a

Registro de expressões

[editar | editar código-fonte]
 "=

Este registro na verdade é usando em algumas funções avançadas

Registros de arrastar e mover

[editar | editar código-fonte]
  "*, "+ and "~ 

Use estes registros para armazenar e recuperar textos em modo gráfico veja 'quotestar' e 'quoteplus', quando a área de transferência não está disponível ou funcional.

Registro buraco negro "_

[editar | editar código-fonte]

Use este registro quando não quiser alterar os demais registros, por exemplo: se você deletar a linha atual,

   dd

Esta ação irá colocar a linha atual no registro numerado 1, caso não queira alterar o conteúdo do registro 1 apague para o buraco negro assim:

 "_dd

Registros de buscas "/

[editar | editar código-fonte]

Se desejar inserir em uma substituição uma busca prévia, você poderia fazer assim em modo de comandos:

Observação: veja que estou trocando o delimitador da busca para deixar claro o uso do registro de buscas "/"

  :%s,<control-r>,novo-texto,g

Manipulando registros

[editar | editar código-fonte]
:let @/=@+              : coloca no registro de buscas o conteúdo da Área de Transferência
:@+                     : Executa como comando o conteúdo da Área de Transferência (bom pra testar scripts)
:let @a=@_              : limpa o registro a
:let @a=""              : limpa o registro a
:let @a=@"              : salva registro sem nome *N*
:let @*=@a              : copia o registro para o buffer de colagem
:let @*=@:              : copia o ultimo comando para o buffer de colagem
:let @*=@/              : copia a última busca para o buffer de colagem
:let @*=@%              : copia o nome do arquivo para o buffer de colagem
:reg                    : mostra o conteúdo de todos os registros

Em modo insert

<C-R>-                  : Insere o registro de pequenas deleções (also insert mode)
<C-R>[0-9a-z]           : Insere registros 0-9 e a-z (also insert mode)
<C-R>%                  : Insere o nome do arquivo (also #) (also insert mode)
<C-R>=somevar           : Insere o conteúdo de uma variável qualquer (eg :let sray="ray[0-9]")


Você pode manter registros pré-carregados assim:

" Using a register as a map (preload registers in .vimrc)
:let @m=":'a,'bs/"
:let @s=":%!sort -u"

Outro exemplo: pré-carregando o nome do arquivo no registro 'n'

coloque em seu ~/.vimrc

 :let @n=@%

Como foi atribuído ao registro 'n' o conteúdo de @%, ou seja, o nome do arquivo, você pode fazer algo assim em modo insert:

   control-r-n

E o nome do arquivo será inserido

Listando os registros atuais

[editar | editar código-fonte]

Digitando o comando

 :reg

ou ainda

:ls

O vim mostrará os registros numerados e nomeados atualmente em uso

Listando arquivos abertos

[editar | editar código-fonte]

Suponha que você abriu vários arquivos txt assim:

vim *.txt

Para listar os arquivos aberto faça:

:buffers

Usando o comando acima o vim exibirá a lista de todos os arquivos abertos, após exibir a lista você pode escolher um dos arquivos da lista, algo como:

:buf 3

Para editar arquivos em sequência faça as alterações no arquivo atual e acesso o próximo assim:

:wn

O comando acima diz 'grave' --> w e próximo 'next' --> n

Dividindo a janela com o próximo arquivo da lista de buffers

[editar | editar código-fonte]
:sn

O comando acima é uma abreviação de 'split next', ou seja, dividir e próximo.

Como colocar um pedaço de texto em um registro?

[editar | editar código-fonte]
<esc> .................. vai para o modo normal
"a10j .................. coloca no registro 'a' as próximas 10 linhas '10j'

Para usar você pode:

<esc> .................. para ter certeza que está em modo normal
"ap .................... registro a 'paste', ou seja, cole

Em movo inserte faça:

control-r-a

Como criar um registro em modo visual?

[editar | editar código-fonte]

Inicie a selecão visual com o atalho

 control-v

pressione a letra 'j' até chegar ao ponto desejado, agora faça

 "ay

pressione 'v' para sair do modo visual

Como definir um registro no vimrc?

[editar | editar código-fonte]

Bom, você pode criar uma variavel no vim assim:

:let var="texto"
:echo var

Pode também dizer ao vim algo como...

:let @d=strftime("%c")<enter>

Neste cado estou dizendo a ele que guarde na variável 'd' at d, o valor da data do sistema 'strftime("%d-%m-%Y %H:%M")'

Então cole isto no vimrc

 let @d=strftime("%d-%m-%Y %H:%M")<cr>

Pode mapear tudo isto

:let @d=strftime("%d-%m%Y %H:%M")<cr>
:imap ,d <cr>rd
:nmap ,d "dp

As atribuições acima correspodem a:

1 - guarda a data na variável 'd'
2 - mapemento para o modo insert 'imap' (digite ,d)
3 - mapeamento para o modo normal 'nmap' (digite ,d)

E digitar ,d normalmente

Desmistificando o strftime

" d=dia m=mes Y=ano H=hora M=minuto

e inserir em modo normal assim:

"dp

ou usar em modo insert assim

Control-r-d

Como selecionar blocos verticais de texto?

[editar | editar código-fonte]
 Control-v

agora use as letras h,l,k,j como setas de direção até finalizar podendo guardar a seleção em um registro que vai de 'a' a 'z' exemplo:

 "ay

Em modo normal você pode fazer assim para guardar um parágrafo inteiro em um registro

 "ayip

O comando acima quer dizer

 para o registro 'a'  "a
 copie 'y'
 o parágrafo atual 'inner paragraph'