sábado, 14 de fevereiro de 2009

O browser de diretórios do vim

O vim tem um plugin, Netrw, que permite navegar por uma árvore de diretórios.

Use um destes :
:e .
vim ~/meudir
para abrir o browser.

O vim mostra:
O nome e a versão do plugin .
O nome do diretório sendo navegado.
O método de ordenação (por nome, data e tamanho)
Como os nomes deverão ser ordenados (diretórios, *.c, *.h,etc)
Como obter ajuda e um resumo dos comandos disponíveis.
A listagem dos arquivos, incluindo ../ que permite navegar no diretório pai.

Use os comandos do modo normal para se movimentar pela árvore.

Para editar vá para o nome do arquivo e pressione:
<enter>

Para voltar para o browser use um destes:
:edit .
:Explore
<ctrl-o>

Para abrir um diretório, vá para ele e pressione:
<enter>

O mesmo vale para abrir o diretório pai (../) ou use '-' sem precisar ir até ele.

Use F1 para mostra o help estilo vim de comandos que podem ser usados.

Formato do modeline do vim

O formato geral de um modeline é:
qualquer-texto vim:set {opção}={valor} ... : qualquer-texto

'qualquer-texto' indica que pode ser colocado qualquer texto antes e depois da parte que o vim usará. Isso permite que o modeline se pareça como um comentário no contexto do arquivo como em :
/* modeline */
um comentário de um programa-fonte c.

A parte " vim:" permite que o vim identifique a linha como um modeline. Note o espaço precedente.

Entre os dois pontos (:) vai um comando 'set'.
Ele funciona do mesmo jeito que o comando ':set' exceto que dois pontos deve ser escapados para evitar ser interpretados como fim do modeline.

Exemplo:
// vim:set textwidth=72 dir=c\:\tmp: use c:\tmp aqui

O primeiro backslash (\) faz com que o ':' faça parte do comando set. O texto após o 2º ':' é sempre ignorado, aqui foi usado para um comentário.

Opção para ativar ou desativar o modeline no vim

Use:
:set nomodeline
para desativar

:set modeline
para ativar

Poderia fazer isso caso esteja como root no Unix (ou administrator no Windows) ou quando voce não confia nos arquivos sendo editados. Já foi alertado sobre vulnerabilidades de usar modeline no vim.

Opção para definir até onde o vim deve procurar modelines

A opção:
:set modelines=10
define que as primeiras 10 linhas ou as 10 últimas linhas serão inspecionadas para procurar por modelines.

Usando modeline para salvar as opções do vim que um arquivo deve usar

Views e sessões de edição de um arquivo não funcionam bem quando queremos compartilhar opções de um arquivo com outras pessoas.

Para associar opções de configuração do vim com um determinado arquivo use o modeline.
O modeline é uma linha inserida dentro do arquivo, que diz ao vim quais são os valores das opções.

Por exemplo, definindo uma indentação em múltiplos de 4 espaços num programa-fonte 'c'. Insira essa linha como uma das 5 primeiras ou últimas do arquivo :
/* vim:set shiftwidth=4: */
o Vim ao ler o arquivo e o comentário, definirá a opção shiftwidth com valor 4. Quando for editar outro arquivo, a opção volta para o valor inicial.

Salvando com um nome as propriedades de uma janela de um arquivo no vim

Em uma janela com um arquivo aberto salve as suas propriedades para uma view com nome:
:mkview ~/.vim/main.vim
e restaure a janela com o arquivo:
:source ~/.vim/main.vim

Isto pode ser usado para rapidamente mudar a edição de um arquivo para outro arquivo com todas opções que voce salvou.

Salvando as propriedades de uma janela de um determinado arquivo no vim

Enquanto uma sessão guarda a aparência do vim como um todo, views permite salvar as propriedades de uma janela.

Um uso é quando se quer editar um arquivo de um modo específico, por exemplo, com número de linhas e folds definidos.
A view pode ser salva em um arquivo e depois restaurada.

De fato, quando se salva uma sessão ela salva a view de cada janela.

Para salvar a view da janela corrente use:
:mkview
o vim decide aonde salvar a view.

Mais tarde, quando editar o mesmo arquivo, restaure a view com:
:loadview

Se quiser agora ver o arquivo sem 'number' e com todos os folds abertos salve a janela com:
:mkview 1

e carregue com:
:loadview 1

Voce pode salvar até 10 views por arquivo (uma se número e 1-9).

sexta-feira, 13 de fevereiro de 2009

Usando o mesmo arquivo de sessão no Unix e no Windows no vim

Se for editar nos dois sistemas use estas opções para pode usar os arquivos de sessão em ambos:
:set sessionoptions+=unix,slash

O vim usará o formato unix nos arquivos de sessão. O Windows é capaz de ler este formato.
Da mesmo forma o Windows é capaz de ler '/' (slash) para separar nomes como faz o Unix.

Salvando layout de janelas usando sessões do vim

Monte seu layout de janelas e salve com:
:makesession ~/.vim/mine.vim

Agora pode-se iniciar o vim com este layout:
vim -S ~/.vim/mine.vim

Usando sessões durante troca de projetos no vim

Digamos que voce está salvando as sessões do vim na pasta ~/.vim.

Se voce estiver trabalhando num projeto e decide mudar para outro, faça o seguinte:
:wall
grava todos arquivos modificados.

:mksession! ~/.vim/projatual.vim
salva a sessão corrente, permitindo restaurar a sessão do projeto projatual.

:source ~/.vim/projantigo.vim
restaura uma sessão salva do projeto projantigo.

Opção para configurar o que será salvo numa sessão do vim

Para definir o que será salvo com o comando 'mksession' use a opção:
:set sessionoptions+=resize
O valor default para salvar e restaurar são:
blank - as janelas vazias.
buffers - ocultos e descarregados, não somente os em janela.
curdir - o diretório corrente.
folds - folds criados manualmente, folds fechados/abertos e opções de folds locais.
help - a janela de help.
options - todas opções e mapeamentos.
tabpages - todas abas
winsize - o tamanho das janelas.

Salvando e restaurando uma sessão de edição

Se quiser salvar a lista de arquivos, marcas, layout de janelas, variáveis globais, opções, etc use:
:mksession vimbook.vim
ele criará uma arquivo de sessão.

Para restaurar essa sessão use:
source vimbook.vim
Para iniciar o vim no linha de comando com uma sessão específica use:
vim -S vimbook.vim

O que é salvo é determinado pela opção 'sessionoptions'.

Salvando e lendo um arquivo viminfo

O 'viminfo' é salvo automaticamente ao sair do Vim e lido automaticamente ao
entrar no Vim.
Se quiser, gravar explicitamente o 'viminfo':
:wviminfo
:wviminfo! ~/tmp/viminfo
Se já existir um viminfo, o vim irá regravar sobre ele se usar '!', caso contrário o vim irá mergear com o viminfo existente.

Para ler manualmente um viminfo alternativo chamado de 'arquivo' use:
:rarquivo!
O '!' significa que toda informação do 'arquivo' lido é
usada. Sem o '!', informações conflitantes do arquivo lido são discartadas.

Esses comandos podem ser usados para salvar vários arquivos viminfo para uso posterior em um diretório só para eles.

Voltando ao ponto de saída da sessão anterior no vim

Use:
'0

O vim cria uma marca na última posição do cursor cada vez que sai.
A última é '0 depois '1 até '9.

Use:
:marks
para ver aonde a marca aponta.

quinta-feira, 12 de fevereiro de 2009

Opção para salvar e restaurar informação de uma sessão anterior do Vim

Toda vez que se sai do vim, o estado da sessão de edição é salva no arquivo
'viminfo'.

Os seguintes itens são salvos:
O histórico da linha de comandos, pesquisas e linha de entrada.
O texto nos registradores.
Marcas para vários arquivos.
A lista de buffers.
As variáveis globais.
Use a opção:
:set viminfo=string
Aonde o string especifica o que e quanto deve ser salvar.
A sintaxe do string é uma opção seguida por um argumento. Os pares
opção/argumento são separadas por vírgulas.

A opção:
'1000
especifica até quantos arquivos terão as marcas locais (a-z) salvas.
A opção:
f1
especifica se marcas globais serão salvas ou não. '1' significa que sim.
A opção:
r/mnt/floppy
diz para não salvar marcas em media removível (diskettes por exemplo). Pode ser
especificadas várias medias se necessário.
A opção:
<10 (ou \"10)
define quantas linhas devem ser salvas por cada registrador. Por default todas
as linhas são salvas.
A opção:
:100
especifica quantas linhas serão salva no histórico de linhas de comando.
A opção:
/100
define o tamanho do histórico de pesquisa.
A opção:
h
desabilita o uso de 'hlsearch' de uma sessão anterior, caso tenha sido
habilitada.
A opção:
@
define o número de linhas salvas quando a função 'input' foi chamada.
A opção:
%
salva a lista de buffers e restaura na próxima sessão do Vim. Se nenhum número é
informado todos os buffers são salvos.
A opção:
!
salva e restaura variáveis globais que comecem com maiúsculo e não tenham letras
minusculas no nome (por exemplo: SALVE, C_E_P).
A opção final:
n{nome}
especifica um nome diferente do default para o viminfo.
O local e nome default é '$HOME/.viminfo'.

Um valor exemplo considerando alguns defaults como adequados:
:set viminfo=’1000,f1,r/mnt/floppy,:100,/100,%,!

Quando o Vim é reiniciado, o 'viminfo' é lido e essa informação restaurada.

Abrindo o command prompt do shell dentro do Vim

O comando seguinte abre um command prompt do shell dentro do Vim:
:shell
Como o gvim não é um emulador de terminal as vezes não funciona como esperado. Tente desligar a opção:
:set guipty

Suspendendo e retornando o vim no shell

Isso só é válido para o vim modo texto rodando num terminal Unix. No modo gráfico, a aplicação é somente minimizada.

O vim pode ser suspenso, serem executados alguns comandos do shell e retornado quando preciso.

No terminal, com o vim em fg, use:
<ctrl-z>
o vim fica suspenso.

Execute comandos de shell normalmente.

Traga o vim para execução com:
fg
Caso
<ctrl-z>
não funcione use dentro do vim:
:suspend

quarta-feira, 11 de fevereiro de 2009

Editando e executando comandos do histórico do vim

Se quiser editar um comando que está no histórico use:
q:
e uma pequena janela será aberta.
Ela contém o histórico da linha de comando, e uma linha de comando vazia.

O janela entre em modo normal, podendo mover o curso com 'hjkl' e todos comandos de edição. Pode-se buscar comandos com '?' ou '/'.

Selecione a linha e pressione <enter> para executar o comando.
A janela de linha de comando se fechará.
O comando editado entrará no final do histórico.

Usando o histórico de comandos e de pesquisas

Para ver o histórico de comandos digite ':' e use as flechas up e down.
Para ver o histórico de pesquisas use '/' ou '?' e as mesmas flechas.

Para listar use:
:history
para ver comandos
:history /
para ver pesquisas.

Opção para ignorar certos padrões de arquivo no auto-completar do vim

Use:
:set wildignore=*.o,*.obj para ignorar arquivos com estes prefixos.

Opção para dar menor prioridade para certos sufixos de arquivo

A opção:
:set suffixes
define uma lista de sufixos de arquivos que os colocam
em mais baixa prioridade quando ocorre várias ocorrências em wildcards.

Normalmente, são sufixos de arquivos de backup, temporários, etc.

Opção para um menu com as possibilidade auto-completar no vim

Use:
:set wildmenu
e o vim mostrará um menu com as possibilidades para completar para serem escolhidas.

Autocompletando com a maior palavra possível

Se existem várias possibilidades, usando
<Ctrl-L>
faz com que o vim complete com o maior string não ambíguo.

Listando as possibilidades de autocompletar a linha de comando

Se há mais de uma forma de completar a linha de comando ao se digitar:
<Ctrl-D>
o vim irá exibir uma lista das possibilidades.

Autocompletando nomes de opção na linha de comando do vim

O autocompletar do vim é sensível ao contexto. Por exemplo:
:set i<tab>
trará
:set icon
um nome de opção.

Se houver mais, <tab> subsequentes, irão percorre-las.

Auto-ompletando nomes de arquivo em comandos de linha de comando

Faça o vim completar nomes de arquivos usando a tecla <tab>.
Use:
:e a<tab>
e o vim completará com:
:e a.txt
Se houver mais possibilidades, o vim irá mostra-las a cada <tab>.

As abreviações de comandos da linha de comando

Os comandos podem ser abreviados. Para ver qual é a abreviação chame o help do comando.
Exemplo:
:substitute
:s
Os nomes de opção também podem ser abreviados:
:set autoindent
:set ai
Recomenda-se não usar abreviações em scripts para evitar dúvidas.

Editando a linha de comando do vim

Além das teclas básicas edição (backspace, flechas,etc) há outras:
<Ctrl-w>
apaga uma palavra.
<Ctrl-u>
apaga a linha.
<Ctrl-u>
<Esc>
cancela o modo linha de comando.

Usando o Grep para localizar texto em vários arquivos

Use o comando:
:grep erro_msg *.c
o vim irá procurar o string 'erro_msg' em todos arquivos c e será capturado a sua saída.

Será aberto o primeiro arquivo localizado e o cursor irá para a 1ª linha que contém o string.
Para ir para a próxima (não importando em qual arquivo) use:
:cnext
Use:
:clist
para ver todas linhas encontradas e o arquivo em que estão.
A opção 'grepformat' diz ao Vim como parsear do Grep (é o mesmo formato da opção
'errorformat').

O comando:
:grep
faz uso do comando externo grep (unix).
Para mudar isso use a opção:
:set grepprg
Esta opção contém a linha de comando para ser usada.
Os caracteres '%' e '#' são expandidos para os nomes do arquivos corrente e
alternado.
No Unix, 'grepprg' tem o default de:
grep -n
No Windows, o default de:
findstr /s

Usando o grep para editar arquivos com um determinada palavra

Pode-se usar uma combinação de grep e Vim para localizar todos arquivos que
tenha uma determinada palavra. O comando ':grep' faz algo semelhante.
No terminal use:
vim `grep -l aaa *.txt`
O comando 'grep' procura numa lista de arquivos terminados com '.txt' a palavra 'aaa'.
O argumento '-l' pede para listar só os nomes dos arquivos que tem o string, e não as linhas.
A palavra em si é uma expressão regular.
O comando fica entre 'backticks'. Isso diz ao shell para rodar o comando e retornar o resultado para a linha de comando.

No resultado final Vim recebe uma lista de arquivos e eles podem ser percorridos com:
:next
:first
Agora, dentro do vim, localizamos os strings.

Eliminando espaços no final das linhas no vim

Para remover espaços em branco no final de cada linha use:
:%s/\s\+$//
em todas linhas, localize um ou mais espaços seguidos do final de linha, substitua por nada.

terça-feira, 10 de fevereiro de 2009

Buscando uma man page do shell a partir de uma palavra

O comando 'K' chama um programa para pesquisar a palavra sob o cursor. O default
é o 'man' do shell.
Isto equivale a rodar o comando dentro do Vim:
:!man {palavra}
A desvantagem é que o código e o manual não podem ser visto ao mesmo tempo.

Para mostrar o texto e o man page em janelas separadas faça o seguinte.

Carregue o plugin man:
:runtime! ftplugin/man.vim
se for usar frequentemente coloque no .vimrc.

Agora abra uma man page de um comando em uma janela:
:Man echo
uma seção da man page:
:Man 3 echo
Pode navegar para outra man page no texto (formato palavra(1)) usando:
<ctrl-]>
Para ler uma man page da palavra sob o cursor use:
\K
A palavra é definida pela opção 'iskeyword'.

Mostrando o número da palavra dentro do texto

Use:
g<Ctrl-G>
A saída mostra:
 'palavra 16 de 24'
a palavra sob o cursor e o número de palavras.
Para contar o número de palavras só de um pedaço do texto faça uma seleção visual e aplique o comando.

Invertendo a ordem das linhas de um arquivo

Para inverter as linhas de um arquivo (a 1ª linha se torna a última e vice-versa) use:
:g/^/m 0

O comando :global varre todo arquivo procurando início de linha e marcando-os. Desse modo, todo arquivo é marcado.
Agora em cada linha marcada é executado o comando :move. Ele move a linha para baixo da linha 0, se tornando a 1ª linha do buffer.
No final a última linha será a primeira.

Isto vale para um intervalo de linhas.

Mova o cursor para uma linha acima da 1ª linha do intervalo e marque-a com 't':
mt

Mova para a última linha do intervalo e use:
:'t+1,.g/^/m 't
no intervalo (marca + 1 linha até a linha corrente) localize e marque linhas com inicio de linha.
a cada linha marcada move-a para abaixo da marca 't'.

segunda-feira, 9 de fevereiro de 2009

Classificando um bloco de linhas de um arquivo

Use o comando sort do shell.
Queremos classificar um bloco de linhas terminadas por uma linha vazia (sem espaços inclusive).

Posicione o cursor na 1ª linha e use:
:.,/^$/-1!sort
no intervalo entre a linha corrente e uma linha anterior à linha vazia, filtre-as para o comando sort do shell.

Trocando a posição de strings em uma linha com :substitute

Digamos que se tem:
sobrenome, nome
e se deseja:
nome sobrenome
Use um comando substitute:
:%s/\([^,]*\), \(.*\)/\2 \1/
Descrição:
Encontre zero ou mais caracteres que não sejam ',' seguido de ','. Salve a
sub-ocorrência.

Continue o regex, seguido de um espaço seguido de zero ou mais caracteres.
Salve a segunda sub-ocorrência.

Substitua pelo 2º sub-ocorrência seguida de um espaço seguida pela 1ª
sub-ocorrência.

As sub-ocorrências podem ser referenciadas como \1 e \2 na expressão regular.
Elas são conhecidas como 'backreferences'.

domingo, 8 de fevereiro de 2009

Substituindo uma palavra por outra em vários arquivos no vim

Use uma macro para isso.

Inicie o vim com uma lista de argumento contendo todos arquivos a serem alterados:
vim *.cpp

O vim inicia com o primeiro arquivo aberto.

Inicie a gravação da macro no registrador q:
qq

Substitua a palavra:
:%s/\<GetResp\>/GetAnswer/ge

Grava e vá para o próximo arquivo:
:wnext

Pare a gravação da macro:
q

Execute a macro no registrador q:
@q
verifique se não há erro.

Agora execute a macro para os demais arquivos:
999@

A macro, por definição, para de executar quando encontra um erro. Assim, ao não ter mais arquivos ela encerra como se deseja.

No entanto, se um dos arquivos não tem o string, ocorrerá um erro e a macro irá parar antes do tempo.
A flag 'e' no comando substitute previne isso, se não encontrar não dá erro.

Substituindo uma palavra por outra e, opcionalmente, com confirmação

Use:
:%s/\<quatro\>/4/g
em todas linhas, substitua, a palavra que
comece com q, seguido de quatro e terminada com o. Todas ocorrencias da linha.

Se quiser ver antes de alterar, use:
:%s/\<quatro\>/4/gc
substituir com confirmação.

Desativando a mensagem de introdução do vim

Quando o vim inicia sem um nome de arquivo ele mostra uma mensagem explicativa.
Desabilite-a com:
:set shortmess+=I

Respondendo ao diálogo do swap file (arquivo de troca) já existente no vim

Se o vim encontrou um swap file existente ele irá perguntar o que fazer.

Abrir em modo somente-leitura.
Use se pretender só ver o arquivo e sabe que ele está sendo editado por outra pessoa.

Editar mesmo assim.
Use com cautela, pois se tiver outra pessoa editando o arquivo poderá acabar com 2 versões, sendo que a última que gravar sobreporá as edições da outra.

Recuperar.
Se voce soube que o swap file tem mudanças que voce quer recuperar.

Sair.
Sai do vim pois voce sabe que tem outra pessoa editando o arquivo.

Deletar.
Se o arquivo é mais novo que o swap file

Um swap file não pode ser lido no vim

Se o swap file tiver 0 bytes na listagem do diretório, então ocorreu um crash porém o arquivo não teve alterações.

Se o problema é que não se tem permissão de leitura para o swap file pode ser que alguém na rede esteja editando ou voce o editou com um login diferente. Converse com a pessoa editando ou entre no login original para acessar o swap file.

O erro E325 e a presença de um swap file no vim

Esse erro aparece porque o vim detectou que já existe um swap file para o arquivo. Há 2 causas.

Múltiplas edições em andamento:
Na mensagem aparece uma indicação de que um outro processo no mesmo computador está editando o arquivo. Isso não é detectado se há uma edição via rede ou em um computador não-unix.
Se continuar editar poderá acabar com 2 versões , sendo que a última que gravar irá sobrepor a outra, resultando em perda de mudanças.
O melhor é encerrar o vim.

Ocorreu um crash do vim ou do computador:
Se a data do swap file é mais recente e a linha 'Modificado: sim' aparece então voce tem uma sessão interrompida que valeria a pena ser recuperada.
Se o arquivo é mais novo que o swap file, então provavelmente voce tem um arquivo que foi salvo exatamente antes do crash.

Definindo o diretório aonde swap file será gravado

Geralmente o Vim grava o swap file no mesmo diretório do arquivo. Use a opção
'directory' para mudar isso.
:set directory=dir,dir,...
O Vim usa o primeiro diretório que ele pode gravar da lista.

Localizando um swap file do vim

No processo de recuperação de arquivo será necessário localizar o swap file.
No shell, vá para o diretório do arquivo e emita:
vim -r
O vim listará os swap files que localizar, olhando também para outros possíveis diretórios aonde poderia estar.
Escolha e use o mais recente que tiver.