sexta-feira, 3 de setembro de 2010

VIM / VI - Comandos úteis

Nas versões atuais de linux, o editor que vem instalado é o VIM (Vi IMprooved), o vi melhorado, não o vi propriamente dito. Mesmo assim o comando vi ainda é usado, sendo um link para o vim. Por este motivo irei me referir ao VIM, tanto como VI quanto como VIM.

O VIM/VI, é um editor de texto em linha de comando, que mesmo parecendo simples, é uma grande e poderosa ferramenta.
A primeira vista ele pode parecer um "monstro de sete cabeças", mas na verdade não é tão difícil usá-lo e, após se acostumar com os seus comandos básicos, ele pode se tornar um grande aliado.

Nota: Quando for me referir à uma tecla especial ou  valor informado por usuário em um comando, colocarei entre colchetes []. Exemplo: [ctrl] irá se referir à tecla ctrl (control). Isto serve para evitar possíveis confusões.

Tópicos:
      Modos de uso (comando e inserção).
      Apagando
      Desfazendo alterações
      Copiar, recortar e colar
      Movimentando-se
      Localizar
      Substituir
      Comandos diversos
      Trabalhar com vários arquivos
      Configurações úteis


Os modos de uso

Basicamente o VIM tem dois modos de operação. O modo de inserção e o modo de comando. No modo de comando, as teclas assumem papéis especiais, suas combinações servem para executar comandos e operações. O modo de inserção, como o nome já diz, serve para editar e inserir texto. Vamos ver a seguir como alternar entre estes comandos.

Abrir

Para abrir um arquivo com o VI basta digitar:

vi nome_do_arquivo

ou

vim nome_do_arquivo

Nota: caso o nome do arquivo não existe, o vi abrirá um arquivo em branco como [new file] e ao salvar ele criará o novo arquivo.

Existem alguns parâmetros que podem ser passados ao abrir o arquivo, mas estas informações não serão mostradas aqui, para mais detalhes veja a man page do vim.

Salvar, editar e sair

Para salvar um arquivo digite:
:w
Para salvar as alterações em um novo arquivo diferente do original, basta acrescentar o nome desejado:
:w novo_arquivo
Para inserir conteúdo de outro arquivo:
:r nome_do_outro_arquivo
Para abrir um outro arquivo para edição depois de abrir o vi:
:e arquivo
Para salvar e sair:
:wq
ou
:x
ou
ZZ (tome cuidado, pois ao contrário do :wq ou :x, este é muito mais fácil de ser digitado por engano)
Para sair sem salvar as alterações:
:q!

Modo de Inserção

Agora vem os comandos para entrar de diferentes formas no modo de inserção, para voltar ao modo de comando aperte a qualquer momento a tecla ESC (escape).

i - entra no modo de inserção começando a digitação à esquerda do cursor.
I - entra no modo de inserção começando a digitação no início da linha.
a - entra no modo de inserção começando a digitação à direita do cursor.
A - entra no modo de inserção começando a digitação no final da linha.
o - começa a digitação em uma nova linha após a atual.
O - começa a digitação em uma nova linha antes da atual.
r - substitui o carácter atual (sob o cursor) pelo novo digitado.
R - entra em modo de inserção substituindo os próximos caracteres  conforme digita-se (equivale à tecla insert nos editores gráficos).
[n]cw - Funciona igual ao R, com a diferença que substitui apenas [n] palavras, após continua inserindo sem substituir.
[n]cc - O mesmo que o cw, mas ao invés de definir o número de palavras, defini-se o número de linhas.

Apagando

x - apaga carácter sob o cursor.
X - apaga carácter à esquerda do cursor.
dw - apaga da posição atual até o final da palavra.
db - apaga da posição atual até o inicio da palavra.
dd - apaga linha inteira.
[n]dd - apaga [n] linhas a partir da atual.
dt[carácter] - apaga até [carácter].
D - apaga  da posição atual até o final da linha.
d$ - apaga da posição atual até o final da linha.
d0 - apaga da posição atual até o início da linha.
dG - apaga da posição atual até o final do arquivo.
dgg - apaga da posição atual até o início do arquivo.
d[n]b - apaga até [n] palavras anteriores.
df[palavra] - apaga até palavra especificada.

Desfazendo alterações

u - desfaz última alteração.
U - desfaz última alteração na linha atual.

Copiar, recortar e colar

y - copia carácter atual.
[n]yy - copia o número de linhas especificado, partindo da atual. Se não informado número copia apenas a atual.
p - cola a última coisa copiada ou apagada.
"[letra][n]yy - copia linha ou linhas para buffer correspondente. Exemplo: para copiar uma linha para o buffer d digite: "dyy
"[letra][n]dd - apaga [n] linhas a partir da atual, movendo as para o registrador [letra] (Recortar).
"[letra]p - cola conteúdo do buffer correspondente.

Nota: usar os buffers permite copiar conteúdo entre arquivos, copiar conteúdos diferentes simultaneamente e também evita que os dados se percam ao apagar algo.

Nota 2: em teclados internacionais (aqueles sem o ç e com teclas posicionadas diferente), configurados para pt-br ou qualquer idioma que use acentuação, será necessário digitar duas vezes " ou  "[espaço], porque senão ao invés de digitar o comando "ayy você estará digitando äyy.


Movimentando - se

h - move para a esquerda
H - move para a primeira linha mostrada na tela.
l - move para a direita.
L - move para a última linha mostrada na tela.
j - move para baixo.
k - move para cima.
w - move para a próxima palavra (considera pontuação uma palavra).
W - move para a próxima palavra (considera pontuação como parte da palavra).
b - move para a palavra anterior (considera pontuação uma palavra).
B - move para a palavra anterior (considera pontuação parte da palavra).
e - move para o fim da palavra (não inclui pontuação)
E - move para o fim da palavra (considera pontuação parte da palavra)
$ - move para o final da linha.
0 - move para o inicio da linha.
^ - move para o inicio da linha (se seu teclado estiver configurado para aceitar acentos, deve ser apertada duas vezes a tecla para aceitar o comando).
gg - move para o inicio do arquivo.
[n]G - move para linha de número especificado.
G - move para última linha do arquivo.
f[carácter ou texto] - move o cursor para a primeira ocorrência, na linha atual, do carácter ou texto informando.
[ctrl]e - move a tela para cima, sem modificar a posição atual do cursor.
[ctrl]y - move a tela para baixo, sem modificar a posição atual do cursor.


Obs: se for digita um número e um comando de movimentação, como h,j,k ou l o cursor repetirá o comando tantas vezes quanto informado, ou seja digitando 22j o cursor descerá 22 linhas. Isto serve também para outros comandos como inserção, delete, copia,etc.

Nota: as teclas direcionais, a tecla ENTER e a barra de espaço, muitas vezes também funcionam para movimentação, mas dependendo do teclado ou em alguns clientes ssh, eles apenas inserem carácteres especiais. Aconselho a se acostumar a usar as teclas de movimentação do VI, pois após acostumar a usá-las, a movimentação nos textos se torna muito mais rápida e fácil.


Localizar

f[palavra] - Localiza a primeira ocorrência posterior da palavra ou carácter na mesma linha.
F[palavra] - Localiza a primeira ocorrência anterior da palavra ou carácter na mesma linha.
; - repete busca por palavra na mesma linha (mesmo sentido).
, - repete busca por palavra na mesma linha (sentido inverso).
/[pesquisa] - Busca primeira ocorrência de [pesquisa] posterior a posição atual.
?[pesquisa] - Busca primeira ocorrência de [pesquisa] anterior a posição atual.
n - repete busca no mesmo sentido.
N - repete busca no sentido contrário.

Substituir

[n]s - substitui [n] caracteres por novo texto digitado.
[n]S - substitui [n] linhas por novo texto digitado.
:[intervalo]s/[x]/[y]/[opções] - substitui a ocorrência de [x] por [y].
     
   Intervalos:    [n linha inicial][n linha final] - intervalo definido.
                         ..[n linha final] - da linha atual até a linha de número definido.
                            ..$ - da linha atual até o fim do arquivo
                            % - em todo arquivo.
    Opções:        g - todas as ocorrências na linha.
                         c - pede confirmação para cada substituição.

    Exemplo:
        Substituir todas as ocorrências de vini no arquivo para vinicius, sem confirmação.

            :%s/vini/vinicius/g

        Substituir todas ocorrências da linha atual até a linha 42 de it para ti, pedindo confirmação.

            :..42s/it/ti/gc

& - repete último comando de substituição.

Comandos diversos

. - repete comando anterior.
J - junta duas linhas.
K - procura por palavra atual no manual.
V - seleção de linhas visual (use os comandos de movimentação expandir a seleção).
v - seleção de letras visual (use os comandos de movimentação para expandir a seleção).
~ - muda caso da letra atual ou seleção.
:sh - abre o shell. Após fechar o shell, retorna ao vim.
!![comando] - insere saída do comando no arquivo.

Trabalhar com vários arquivos ao mesmo tempo

Você pode abrir dois arquivos em visualização compartilhada ou normal.

Trabalhar com vários arquivos (normal):

Abrir

vi arquivo1 arquivo2

Comandos

:n - ir para o próximo arquivo da lista
:prev - voltar para arquivo anterior
:args - ver arquivos abertos

Modo tela dividida

Este modo é mais interessante, pois podemos ver todos os arquivos ao mesmo tempo

Abrir

vi -o arquivo1 arquivo2

Após o vi estar aberto, para abrir mais arquivos use:
:sp nome_do_arquivo
ou
:split nome_do_arquivo

Alternar entre arquivos

[ctrl]wj - Pula para o arquivo de cima.
[ctrl]wk - Pula para o arquivo de baixo.



Configuraçoes úteis

:set sw=[n] - Define o tamanho em caracteres da tabulação. Para usar a tabulação.
            [n]>> - Identa [n] linhas a partir da atual.
            [n]<< - Retira identação [n] linhas a partir da linha atual.

:set [opção] - para ativar algumas opções do vim.
        Opções:
                      ai - identação automática
                      ic - Ignorar caso numa busca (maiúscula/minuscula)
                      nu - Mostra numeração de linha.
                      sm - Ao fechar um parentese, chave ou colchete, é mostrado onde ele foi aberto. (Se não foi aberto soa um bip).

Para cancelar alguma opção digite:

    :set no[opção]

   Exemplo:
            :set nonu - desativa numeração de linhas.

Estas configurações se perdem ao reiniciar o vim. Para definir configurações padrões na inicialização, crie (ou modifique caso já exista) um arquivo com o nome ".exrc" na sua pasta home. Digite os comandos sem : .
Exemplo ~/.exrc :

   set sw=5
   set nu
   set sm

Este arquivo definirá a identação 5. Aparecer número de linhas e mostrar a combinação de parênteses.


Este é o final, ficou mais extenso do que eu imaginei, mas acho que já serve como uma boa base para usar o vim.
Para quem ainda não achou um uso para o vim, aqui vai algumas situações em que ele já me foi útil ou ainda é.

    * Configurações de arquivos de configuração em servidores.
    * Tratar arquivos csv muito grandes. Eles costumam travar a maioria dos editores. Já abri arquivos com mais de 1 milhão de linhas.
    * Substituições de ocorrências de palavras são relativamente rápidas, comparadas a editores gráficos.   
    * Digitar textos rápidos.
    * Criar posts =P
    * Nunca usei para programar (a não ser alguns ajustes rápidos em php), mas conheço gente que programa com o vim.

Uma alternativa para o vim, mais simples e talvez mais fácil de manipular é o mcedit, ele é muito similar àquele editor de texto que tinha no dos (telinha azul, letras brancas, comandos nas teclas de função F1,F2,F3,F4...). Eu particularmente não gosto de usá-lo, mas tenho um amigo que usa, e diz que é um ótimo quebra galho. Para quem quiser o mcedit pode ser encontrado nos repositórios da maioria das distribuições.
Para quem quiser saber mais a respeito do
mcedit (em Inglês) - http://linux.die.net/man/1/mcedit.

Isso é tudo pessoal! Espero ter ajudado.

:wq

Nenhum comentário:

Postar um comentário