sábado, 7 de fevereiro de 2009

Opções para definir quando o Vim salva o swap file

Use:
set updatetime=4000
tempo em milisegundos em que se nada foi digitado o vim grava o texto em disco .

Use:
set updatecount=200
quantidade de caracteres digitados quando o vim salvará o texto em disco.

Recuperando um arquivo após um crash

Se aconteceu um crash durante uma edição, pode-se recuperar as mudanças não salvas.
O Vim mantém o swap file que guarda temporariamente as mudanças sendo feitas. O
Vim mantém o swap file até que se tenha gravado com sucesso o arquivo corrente. Após
isso ele é deletado.

Quando o Vim aborta no meio de uma edição, ele não consegue deletar o swap file.
Ao reiniciar e editar um arquivo o Vim verificar se existe um swap file
significa que o Vim abortou ou há uma outra sessão editando o arquivo.

O Vim emite um aviso e pede para você tomar uma decisão, entre elas recuperar o
arquivo.

A recuperação pode ser feita também na linha de comando:
vim -r a.txt
o vim lerá o swap file e o arquivo original.
O arquivo pode ser recuperado dentro do Vim com:
:recover a.txt
Se quiser descartar quaisquer mudanças que você fez no arquivo e tentar
recuperar use:
:recover! a.txt
Se estava editando um arquivo sem nome use:
vim -r ""
Como medida de segurança grave o arquivo recuperado com outro nome:
:w a.txt.rec
Compare com o arquivo original e verifique se é o que você esperava. O vimdiff é útil para isto.
Preste atenção se o arquivo original é mais recente (significa que ele foi salvo exatamente do crash do vim) e algumas linhas estão faltando (o vim não pode recuperar).

É normal que algumas poucas mudanças não são recuperadas. O vim grava em disco quando não se digita por 4 segundos ou depois de digitar 200 caracteres.

Envia texto e executa um comando de shell pelo vim

Para enviar o texto do arquivo para o comando wc do shell use:
:w !wc
o comando wc irá receber as linhas do vim e retornará com a contagem linhas, palavras e caracteres.

Intervalos e seleções visuais são aceitos.

Lendo a saída de um comando de shell no vim

Para ler o conteúdo do diretório corrente dentro do arquivo use:
:read !ls
no unix.
a saída é captura e inserida abaixo do cursor.

O comando suporta o uso de intervalos e o comando passado por ter argumentos:
:0read !date -u
insere a data e tempo corrente no formato UTC na 1ª linha.

Note a diferença:
!!
substitue a linha e:
:read !
insere.

Opções que influem no comando de filtragem do vim

Verifique os valores de:
:set shell - nome do shell que executará os comandos
:set shellcmdflag - flag passada ao shell para executar os comandos passados.
:set shellquote - aspas a serem usadas em torno do comando.
:set shellxquote - aspas a serem usadas em torno do comando e redireção.

Esses tipos configurações tem mais interesse no ambiente ms-windows.

Filtrando linhas do buffer para um programa externo

Você pode passar linhas no buffer para um programa do shell processar. Esse
programa é conhecido como 'filtro'.
A saída do filtro é enviada de volta ao Vim que a coloca no lugar das linhas enviadas.

Use o comando:
!{movimento}{filtro}
Por exemplo, classificando as linhas de 1 a 10:
Coloque o cursor na 1ª linha.
!10Gsort<Enter>
'!' diz que ocorrerá um filtro, '10G' passando a linha até a linha 10, 'sort' é
o filtro.
O Vim coloca o cursor na linha de comando com o intervalo correspondente ao
movimento:
.,.5!sort.
A saída do filtro substitui as linhas enviadas.

No modo visual, selecione o texto e pressione '!'. O Vim colocará na linha de
comando:
'<,'>!
O comando '!' sempre trabalha com linhas inteiras, mesmo que
você faça seleção de bloco por exemplo.

O comando:
!!{filtro}
Passa a linha corrente para o filtro e são substituídas ao retornar.

Por exemplo, colocar uma lista de arquivo de um diretório em um arquivo.
Posicione o cursor em uma linha vazia.
!!ls
Colocando a data do computador no arquivo:
!!date
Outra forma, usa intervalos diretamente:
:{intervalo}!{filtro}
Exemplo, classificando 5 linhas:
:1,5!sort

sexta-feira, 6 de fevereiro de 2009

Formatando texto no vim

Use o comando 'gq' para formatar texto.
A formatação se baseia no valor de:
:set textwidth
Para formatar texto no modo visual.
Posicione no início e selecione visualmente:
vG
gq
Pode formatar com comando movimento também:
gq{movimento}
Formata a linha corrente e as 4 linhas seguintes:
gq4j
Formata todo arquivo, se os parágrafos propriamente separados:
gg
gq
G
Pode usar objeto-texto 'ap' (a paragraph).
Formata um parágrafo (bloco de texto separado por linha vazia). Posicione no cursor e use:
gq
ap
formata um paragrafo.

Pode-se usar também movimento para o fim do parágrafo ('}'):
gq
}

Se os parágrafos não claramente separados, formate-os manualmente.
Vá para a 1ª linha que será formata e use:
gq
j
formatará a linha corrente e a seguinte.
Agora use:
.
para repetir o comando. Faça isso até o final do texto que deseja formatar.

Opção para definir o tamanho máximo de uma linha que pode ser inserida

A opção define o tamanho máximo da linha que pode ser inserida. Linhas maiores
são quebradas depois de um espaço:
:set textwidth=72
As novas linhas serão quebradas para ter no máximo 72 caracteres.
No entanto, linhas alteradas não são reformatadas automaticamente.

Gravando linhas no final de um arquivo

Se quiser anexar linhas no final de um arquivo existente use:
:.w >>a.txt
escreve a linha corrente (.) para o final do arquivo.
:%w >>a.txt
escreve o texto inteiro do buffer no final do arquivo.

Gravando um intervalo de linhas do arquivo

Use:
:.,$w temp
:.,$w! temp
1,10wq
para gravar o intervalo da linha corrente até o fim do arquivo.

Para gravar um seleção visual:
V
10j
:
'<,'> (automaticamente o Vim preenche com os delimitadores de seleção)
write joke.txt

Inserindo um arquivo abaixo do cursor

Posicione o cursor.
:read b.txt
o arquivo é colocado após a linha corrente.

Para colocar na 1ª linha use:
:0read patch

Juntando linhas no modo visual

Selecione visualmente:
<ctrl-v>
Junte as linhas:
J
Pode usar também seleção visual 'v' ou 'V'.
Um espaço será usado para separar as linhas. Se não quiser os espaços mudados use:
gJ
Se a linha terminar com '.','?' ou '!' é inserido 2 espaços após por default.
Altere isso com:
:set nojoinspaces

Indentando no modo visual

Selecione o bloco de texto:
<ctrl-v>
3j
Indente um nível com:
> 
Remova um nível de indentação com:
<
Uma indentação corresponde o número de espaços declarado na opção 'shiftwidth'.

Repita a indentação com:
.

Preenchendo um bloco de texto com um mesmo caracter no vim

Faça uma seleção visual do bloco:
<Ctrl-V>
3j
Preencha o bloco com o caractere:
r
x

Alterando um bloco visual para maiusculo ou minusculo no vim

Selecione visualmente o bloco de texto:
<ctrl-v>
3j

entre o comando:
~ - inverte entre maiusculo e minusculo.
u - torna minusculo.
U - torna maiusculo.

quinta-feira, 5 de fevereiro de 2009

Alterando no modo visual

Selecione o bloco (ou use a seleção visual 'v' ou 'V'):
<Ctrl-V>
3j
Altere:
c
o texto selecionado será deletado e o Vim entra no modo inserção.
Entre o texto. O texto será inserido aonde havia o bloco.
As linhas curtas do bloco não serão alteradas.

Outros comandos de alteração:
O comando 'C' deleta o texto até o final das linhas e insere o novo texto em
todas elas. As linhas curtas não são alteradas.
O comando 'r' deleta um carácter em todas linhas e insere o novo carácter em toda
elas. As linhas curtas não são alteradas.
O comando 'R' deleta todas linhas selecionadas e insere uma linha com o novo texto.

Inserindo texto no modo visual

Podemos inserir uma coluna de texto em várias linhas e tem um caso especial que permite colocar o mesmo texto no final das linhas.

Primeiro faça um bloco visual:
<ctrl-v>
3j
Inserindo antes de um bloco visual.
I
teste
<esc>
Se o bloco de linhas tiver linhas 'curtas' ou seja linhas que
não são atingidas pela seleção visual, o texto não será inserido nelas.
Inserido depois de um bloco visual:
A
teste
<esc>
Se tiver linhas curtas, o comando 'A' insere o texto nelas
também.
Assim, você pode escolher se insere texto ou não nas linhas curtas.

Há um caso especial:
$
A
texto
<Esc>
Com o '$' o texto será inserido no final de todas linhas do bloco.

Mudando várias linhas que são separadas uma das outras

Os comandos com intervalos tem uma deficiência: só mudam linhas que sejam
contíguas uma das outras.

Por exemplo, se quiser mudar todas linhas que tenham um determinado padrão você
terá que usar outro comando: o comando ':global'.

O comando ':global' executa 2 passos sobre um intervalo de linhas (default todo arquivo: 1,$).

Na 1ª passagem cada linha é comparada com um padrão e se tiver sucesso ela é
marcada. Na 2ª passagem, a cada linha marcada, se executa o comando.

Exemplo:
Selecionar todas as linhas que tenham o padrão (comentário C) e depois fazer uma substituição de string nessas linhas.

Faça isso:
:g+//+s+abc+cba+g
:g - localize, marque e execute
// - o string '//'
s - substitua
+ - separador usado no lugar de '/' para maior visibilidade.
O comando:
:global!
aplica o comando a todas linhas que 'não' tenham ocorrências com o dado padrão.

Especificando a quantidade de linhas como intervalo no vim

Se souber, pode-se especificar o número de linhas a serem alteradas como um intervalo.

Posicione o cursor na 1ª linha e digite:
3:
3 - número de linhas
: - linha de comando

O vim coloca na linha de comando:
:.,.+2
da linha corrente até a linha corrente mais 2 linhas.

Agora pode completar o comando.

Usando o modo visual como intervalos de linhas

Faça uma seleção visual:
V
jj
Agora quando iniciar uma linha de comando (:) o Vim colocará na linha
de comando:
:'<,'>
Essas marcas especiais são a linha inicial e final da seleção visual.

Agora pode-se digitar o comando que será aplicado à seleção visual.
:'<,'>s/abc/cba/g
O intervalo sempre será o de linhas, mesmo que a seleção visual seja de bloco ou de alguns caracteres.

Pode-se misturar marcas com posições de intervalo:
:'>,$
o intervalo vai do fim da seleção visual até o final do arquivo.

Usando marcas como intervalos do vim

Ao invés de lembrar de números de linha, use marcas.

Defina o início com:
mi

e o fim com:
mf

Use as marcas como intervalo:
'i,'fs/abc/cba/g

Usando deslocamentos de intervalo no vim

O intervalo do comando pode ser especificado como uma posição específica mais ou menos linhas.

Por exemplo:
:?^Título?,/^Título/-1s+abc+cba+g

/Título/-1
define um limite para a linha anterior contendo o string 'Título'.

Duas linhas após:
/Título/+2

Tres linhas após a linha corrente até a 5ª antes do fim do arquivo:
:.+3,$-5

Usando padrões como intervalos de linha do vim

As vezes voce quer limitar a ação do comando para um intervalo do arquivo. Mas número de linhas não se aplicam no caso.

Abaixo, há um comando substitute que troca strings entre duas seções começam com a palavra 'Título'.

Use padrões ou expressões regulares para definir os limites:
:?^Título?,/^Título/s+abc+cba+g

Aqui, o intervalo é definido com 2 padrões.
O início:
?^Título?
procura para trás uma linha com 'Título' no início.

O fim:
/^Título/
procura do cursor para frente uma linha com 'Título' no início.

O comando substitute usa '+' como separador ao invés de '/' para maior clareza.

Usando intervalo de linhas na linha de comando

Certos comandos podem receber um intervalo de linhas (range).

Consistem de um ou mais especificadores de linhas separados por ',' ou ';'.
';' a posição do cursor será definida como a do 1º especificador, ',' não altera
a posição do cursor:
4,/aqui/ da linha 4 até a ocorrência de 'aqui' depois da linha do cursor.
5;/aqui/ da linha 5 até a ocorrência de 'aqui' depois da linha 5.
O intervalo default é a linha corrente, com exceção de alguns commandos como
':write' e ':global' cujo default é o arquivo todo (1,$).

Os números de linha podem ser especificados com:

{número} um número absoluto de linha
. a linha corrente *:.*
$ a última linha do arquivo *:$*
% igual a 1,$ (o arquivo inteiro) *:%*
't a posição da marca t (minusculo) *:'*
'T a posição de marca T (maiúsculo); quando a marca está dentro de
                outro arquivo ela não pode ser usada em um intervalo
/{padrão}[/] a próxima linha aonde o padrão ocorre *:/*
?{padrão}[?] a linha anterior aonde padrão ocorre *:?*
\/ a próxima linha aonde o padrão anterior usado ocorre
\? a linha anterior aonde o padrão anterior usado ocorre
\& a próxima linha aonde o padrão anterior usado do substitute
                ocorre

Cada um pode ser seguido de '+' ou '-' e um número opcional. Esse número
(default = 1) é somado/subtraído do número da linha.

Também podem ser usados padrões encadeados:
/pat1//pat2/    Ache uma linha contendo 'pat2' depois da linha contendo 'pat1',
                sem mover o cursor.
A diferença com o separador ';' é que o cursor não é movido.
7;/pat2/        Ache una linha contendo 'pat2' depois da linha 7, deixando o
                cursor na linha 7.
0 é considerado 1 na maioria dos comandos. Em alguns é considerado 'antes da
linha 1' (:read).
Exemplos de intervalos usados com o comando ':substitute'.

Da linha 1 até a 5:
:1,5s/abc/cba/g
Somente na linha 11:
:11s/abc/cba/g
Somente a linha corrente:
:.w a.txt
Da linha corrente até o fim do arquivo:
:.,$s/abc/cba/g
Todas linhas do arquivo:
:%s/abc/cba/g
:1,$s/abc/cba/g
Você também especificar as linhas pelo conteúdo.

Da linha 1 até a primeira linha após a linha corrente com 'abc':
:1,/abc/print
Da primeira linha anterior a linha corrente contendo 'abc' até a linha 12:
:?abc?,12print
Pode usar também marcas.
As marcas podem ser colocadas no modo normal com o comando 'm'.
Por exemplo, marque a posição corrente:
ma
Marque outra linha com:
mb
Agora use o comando para imprimir as linhas entre as marcas:
:'a,'bprint

quarta-feira, 4 de fevereiro de 2009

Substituindo texto com confirmação no vim

Use:
:%s/abc/cba/cg

flags
c - com confirmação
g - todas ocorrências da linha.

Aparecerá uma questão:
substituir com cba (y/n/a/q/l/^E/^Y)?

respondendo
y - faz mudança
n - não faz esta mudança, pula para a próxima
a - faz todas mudanças e não precisa confirmar mais
q - não faz mais mudanças
l- faz só essa mudança e termina (last)
<ctrl-e> - avança uma linha
<ctrl-y>- recua uma linha

Substituindo texto pela linha de comando

Para substituir em todas linhas use o substitute:
{intervalo}substitute/de/para/{flags}
Eis um exemplo que atua em todas linhas do buffer:
:%s/abc/cba/g
% especifica um intervalo, no caso todas linhas. Se omitir, só muda a linha corrente.
flag 'g' - Diz para substituir todas ocorrências da linha. Se omitir, só muda a primeira ocorrência de cada linha.
Outras flags são:
p - imprime a linha da última mudança.
c - que confirma antes de fazer a mudança.
n - informa o número de ocorrências, sem fazer alteração.

O primeiro argumento é de fato, um padrão ou expressão regular.
Assim:
:%s/^abc/cba/g
só substitui um string abc que esteja no início da linha (^).

O delimitador '/' pode ser trocado por outro que não apareça no padrão.
Por exemplo '+':
:%s+abc+cba+g

Acumulando linhas dentro de um registrador

Você pode coletar (apendar) várias linhas de um texto dentro de um registrador.
Use:
"aY
para coletar a primeira linha.

Agora use o mesmo registrador 'y', mas com notação maiúscula. O Vim preserva o
conteúdo e acumula a nova linha:
"AY
Agora,você pode cola-las:
"ap
Isso também é válido para o comando delete.

Inserindo comandos no final de uma macro no vim

Digamos que voce usou :
qc
para gravar uma macro no registrador c.

Agora deseja incluir no final da macro uma pesquisa de palavra. Use:
qC
inicia a gravação no registrador c. A letra em maisculo indica que voce quer inserir no final.

Entre a nova edição:
/word<enter>

termina a gravação:
q

Agora execute a macro :
@a

Editando uma macro no vim

Se voce gravou uma macro e descobriu um erro nela, faça o seguinte para corrigi-la:
G
vai para o final do arquivo

o<esc>
cria uma linha vazia

"ap
cole o texto do registrador a, serão os comandos da macro.

edite a linha e corrija o erro.

0
vai para início da linha.

"ay$
copia a linha editada para o registrador a

dd
deleta a linha temporária.

Agora, re-execute a macro:
@a

Executando uma macro em vários locais diferentes no vim

Se voce tem uma macro, por exemplo, no registrador a e quer executa-la em vários locais do documento, faça:
@a
na primeira vez.

Salte para outros locais, e use:
@@

É mais fácil de digitar.

Repetindo uma série de comandos com uma macro no vim

Uma macro é uma sequencia de comandos armazenados em um registrador do vim.

Enquanto comando "." repete só o último comando de edição, a macro pode repetir
uma sequencia completa, incluindo movimentação de cursor. E como a macro usa
registradores para armazenar a macro, pode-se ter 26 (a-z) sequencias salvas ao
mesmo tempo.
O comando q{letra} registra as teclas pressionadas num registrator letra.
Para terminar pressione 'q'. Agora execute a macro com 'a{letra}'.

Exemplo para inserir a diretiva '#include' em linhas com somente o nome do header
(stdio.h, por exemplo):
qa
^
i#include “<Esc>
$
a”<Esc>
j
q
qa
Descrição linha a linha:
1.inicia a gravação da macro no registrador a.
2.salta para o início da linha
3.insere o strong '#include"' e sai do modo inserção.
4.salta para o fim da linha.
5.insere após o cursor '"' e sai do modo inserção.
6.desce uma linha
7.para a gravação da macro
Agora execute a macro no registrador a:
@a
ou execute 4 vezes:
4@a

terça-feira, 3 de fevereiro de 2009

Verificando se o vim tem suporte para uso do clipboard

Verifique se o vim tem suporte para o clipboard, com o comando:
:version

Deverá aparecer:
+xterm_clipboard
se não aparecer obtenha uma versão com essa opção ou recompile.

Opção para definir barra de título com a condição do arquivo no vim

Use:
:set title

O vim mostrará na barra de título, após o nome, a condição do arquivo:
- o arquivo não pode ser modificado.
+ o arquivo foi modificado.
= o arquivo é read-only
=+ o arquivo é read-only, porém o buffer foi modificado.
sem nenhuma condição - arquivo comum sem mudanças.

Lançando o vim com interface gráfica

No shell:
gvim a.txt
vim -g a.txt

Mudando a posição das abas no vim

Movendo a aba corrente para depois de uma aba:
:tabm N
aonde é N é o número da aba de referencia.

Use 0 para mover a aba para o início da lista de abas.

Fechando abas no vim

Fechar a aba corrente (tabclose):
:tabc
:tabc!

Fechar todas abas exceto a corrente (tabonly):
:tabo
:tabo!

Saltando para a aba no vim

Para a aba seguinte (goto tab):
<ctrl><pagedown>
gt

Para a aba anterior:
<ctrl><pageup>
gT

O comando vai e volta na sequencia de abas.

Clicando com o mouse no espaço após a última aba, seleciona cada aba em sequencia.

segunda-feira, 2 de fevereiro de 2009

Criando abas no vim

Uma aba (tab) contém uma janela. Ela permite usar melhor o espaço de tela.

Para criar uma aba e editar use:
:tabe b.txt

Para criar uma aba contendo o buffer corrente use:
:tab split
Executa um comando e cria uma aba com a janela criada pelo comando:
:tab help gt
cria uma aba com a janela contendo o help do comando gt