Introdução
'Vim' é um editor extremamente configurável, criado para permitir a edição de textos de forma eficiente; o Vim é um melhoramento do editor vi, um tradicional editor dos sistemas [Unix]. Possui uma série de melhoramentos em relação a este último. O próprio slogan do vim é IMPROVED VI. Ou seja, vi melhorado.
Vim também é tão conhecido e respeitado entre programadores, e é tão útil para programação, que muitos o consideram uma verdadeira IDE.
É capaz de reconhecer mais de 400 sintaxes de linguagens de programação e marcação. mapeamento para teclas, macros, abreviações, busca por expressões regulares, entre outras facilidades. Conta com uma comunidade bastante atuante e é, ao lado do [Emacs] um dos editores mais usados no mundo [GNU], mas pode ser também instalado no Windows e Mac.
site oficial: http://www.vim.org/
Usando comandos externos no vim
:%!cat -s
:%:%!sort
!sort -t "@" -k2
:%!uniq -c
Para chamar o vim digite num terminal:
<code>vim meu_texto.txt</code>
Para chamar a ajuda do vim digite:
:help
!Um wiki para o vim
Trata-se do potwiki http://www.vim.org/scripts/script.php?script_id=1018
!!Como usar o potwiki
<verbatim>
<Leader> é igual a - veja :help leader
ww - abra a sua HomePage
wi - abre o Wiki index
wf - segue uma WikiWords (can be used in any buffer!)
we - edite um arquivo Wiki
\ - Fecha o arquivo
<CR> - segue WikiWords embaixo do cursor <CR> é igual a Enter
<Tab> - move para a próxima WikiWords
<BS> - move para os WikiWords anteriores (mesma página)
wr - recarrega WikiWords
!Ajuda do vim
Para navegar na ajuda do vim use CTRL-], e para voltar use CTRL+O.
Se você estiver realmente desesperado, digite:
:help!
!File encoding
A codificação dos caracteres é muito importante
veja exemplos<br>
set encoding=utf-8<br>
set termencoding=utf-8<br>
set fileencoding=utf-8<br>
set guifontset=-misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1<br>
! Movendo-se no Vim
Para mover-se no vim use:
k
h l
j
ou seja, a letra ''k'' é usada para subir no texto
a letra ''j'' para descer, a letra ''h'' para mover-se
para a esquerda e a letra ''l'' para mover-se para a
direita. A idéia é que se consiga ir para qualquer lugar do texto sem tirar as mão do teclado.
Para entrar em Modo de Edição pressione
i ................inicia o modo insert na posição atual
I ................inicia o modo insert no início da linha atual
a ................inicia o modo insert após o caractere atual
A ................inicia o modo insert no final da linha atual
o ................inicia o modo insert na linha abaixo
O ................inicia o modo insert uma linha acima
Para retornar ao modo normal pressione ESC
! Modos de Operação
!! Os Saltos
Para ir para o começo do arquivo digite:
gg
Para ir para o fim do arquivo digite:
G
Para ir para o começo de uma linha digite o caractere
0
Para ir para o final de uma linha digite o caractere
$
Para ir para a próxima ocorrência de uma letra faça:
f<letra> - sentido inverso F<letra>
Para colocar o cursor uma letra antes da desejada
t<letra> - sentido inverso T<letra>
Para saltar para a próxima ocorrência da palavra onde está o cursor:
*
Para saltar para a última ocorrência da palavra onde está o cursor:
#
Iniciar a inserção no fim da linha
A
Iniciar a inserção no começo da linha
I
Pode-se fazer combinações, por exemplo:
fx..........move até o próximo x
dfx.........deleta até o próximo x
! Deletando uma parte do texto
O comando "d" deleta uma parte do texto, copiando o conteúdo para a memória.
dd - apaga a linha atual
5dd - apaga 5 linhas (também pode ser: d5d)
dw - apaga uma palavra
5dw - apaga 5 palavras (também pode ser: d5w)
dl - apaga uma letra (sinônimo: x)
5dl - apaga 5 letras (também pode ser: d5l ou 5x)
d^ - apaga da posição atual até o início da linha (sinônimo: d0)
d$ - apaga da posição atual até o final da linha (sinônimo: D)
dgg - apaga da posição atual até o início do arquivo
dG - apaga da posição atual até o final do arquivo
Depois do texto ter sido colocado na memória, digite "p" para "colar" o texto em uma outra posição.
!! Outros comandos:
diw - apaga uma palavra mesmo que o cursor não esteja posicionado no início dela
dip - apaga o parágrafo atual
d4b - apaga as quatro palavras anteriores
dfx - apaga até o próximo x
!! Copiando sem deletar
O comando "y" ("yank") permite copiar uma parte do texto para a memória sem deletar.
Existe uma semelhança muito grande entre os comandos "y" e os comandos "d":
yy - copia a linha atual (sinônimo: Y)
5yy - copia 5 linhas (também pode ser: y5y ou 5Y)
yw - copia uma palavra
5yw - copia 5 palavras (também pode ser: y5w)
yl - copia uma letra
5yl - copia 5 letras (também pode ser: y5l)
y^ - copia da posição atual até o início da linha (sinônimo: y0)
y$ - copia da posição atual até o final da linha
ygg - copia da posição atual até o início do arquivo
yG - copia da posição atual até o final do arquivo
Digite "p" para "colar" o texto em uma outra posição.
! Trabalhando com registradores
Você não precisa copiar e colar diferentes partes do texto para uma mesma área de transferência.
Para isso, você pode usar os '''registradores'''.
Os registradores são indicados por aspas seguido por uma letra. Exemplos: "a, "b, "c, etc.
Como copiar o texto para um registrador? É simples: basta especificar o nome do registrador antes:
"add - deleta uma linha, copiando seu conteúdo para o registrador a
"byy - deleta uma linha, copiando seu conteúdo para o registrador b
"ap - "cola" o conteúdo do registrador a
"bp - "cola" o conteúdo do registrador b
"x3dd - deleta 3 linhas, copiando seu conteúdo para o registrador x
"xp - "cola" o conteúdo do registrador x
"ayy - copia uma linha, sem deletar, para o registrador a
"a3yy - copia 3 linhas, sem deletar, para o registrador a
"ayw - copia uma palavra, sem deletar, para o registrador a
"a3yw - copia 3 palavras, sem deletar, para o registrador a
! Edições complexas
Trocando palavras de lugar: coloque o cursor no espaço antes da 1ª palavra e digite:
deep
Trocando letras de lugar:
xp
Trocando linhas de lugar:
ddp
!! Indentando
>> - Indenta a linha atual
^T - Indenta a linha atual em modo insert
^D - Remove indentação em modo insert
>ip - indenta o parágrafo atual
!! Trabalhando com registradores
Você não precisa copiar e colar diferentes partes do texto para uma mesma área de transferência.
Para isso, você pode usar os '''registradores'''.
Os registradores são indicados por aspas seguido por uma letra. Exemplos: "a, "b, "c, etc.
Como copiar o texto para um registrador? É simples: basta especificar o nome do registrador antes:
"add - deleta uma linha, copiando seu conteúdo para o registrador a
"byy - deleta uma linha, copiando seu conteúdo para o registrador b
"ap - "cola" o conteúdo do registrador a
"bp - "cola" o conteúdo do registrador b
"x3dd - deleta 3 linhas, copiando seu conteúdo para o registrador x
"xp - "cola" o conteúdo do registrador x
"ayy - copia uma linha, sem deletar, para o registrador a
"a3yy - copia 3 linhas, sem deletar, para o registrador a
"ayw - copia uma palavra, sem deletar, para o registrador a
"a3yw - copia 3 palavras, sem deletar, para o registrador a
!! Edições complexas
Trocando palavras de lugar: coloque o cursor no espaço antes da 1ª palavra e digite:
deep
Trocando letras de lugar:
xp
Trocando linhas de lugar:
ddp
!! Indentando
>> - Indenta a linha atual
^T - Indenta a linha atual em modo insert
^D - Remove indentação em modo insert
>ip - indenta o parágrafo atual
!! Desfazendo
Se você cometer um erro, não se preocupe! Use o comando "undo":
u desfaz a última mudança (pode ser repetido para diversos comandos)
U desfaz todas as mudanças na última linha editada
CTRL-R refaz as mudanças desfeitas (isto é, um "undo do undo").
Para mais ajuda sobre "undo":
:help undo
! Salvando
* A maneira mais simples de salvar um arquivo, é usar o comando ":w".
* Para especificar um novo nome para o arquivo, simplesmente digite ":w novo_nome" (ou ":sav! novo_nome").
* Para sair do editor, salvando o arquivo atual, digite ":x" (ou ":wq").
:w<enter>
:w novo_nome (salvar com um novo nome)
:wq (salvar e sair)
:x (salvar e sair)
:w! (força o salvar)
Para maiores informações, digite:
:help writing
! Usando marcas
As marcas são um meio eficiente de se pular para um local
no arquivo. Para criar uma, estando em modo normal faça:
ma
Onde ''m'' indica a criação de uma marca e ''a'' é o nome da
marca. Para pular para a marca ''a'' faça:
`a
Para voltar ao ponto do último salto
<pre> ''</pre>
!! Marcas Globais
Durante a edição de vários arquivos defina uma marca global com o comando
mA
Onde 'm' cria a marca e 'A' (maiúsculo) define uma marca 'A' acessível a quaquer momento com o comando
'A
Isto fará o vim dar um salto até a marca A mesmo que esteja em outro arquivo, bastando apenas que o mesmo
esteja aberto. Para abrir varios arquivos uma solução seria:
vim *.txt
Para ir para o próximo arquivo:
:bn
Para ir para o arquivo anterior
:bp
! Buscas
Para fazer uma busca certifique-se de que está em modo normal,
pressione "/" e digite a expressão a ser procurada.
Para encontrar a primeira ocorrência de "foo" no texto:
/foo
* Para encontrar as próximas ocorrências, tecle "n".
* Para encontrar as ocorrências anteriores, tecle "N".
'''Dica'''
Um meio mais rápido para encontrar a próxima ocorrência de uma palavra sob o cursor, tecle "*". Para encontrar uma ocorrência anterior da palavra sob o cursor, tecle "#". (Para isso, o cursor deve estar posicionado sobre a palavra que deseja procurar)
! Substituições
Para fazer uma busca, certifique-se de que está em modo normal,
em seguida digite use o comando ":s", conforme será explicado.
Para substituir "foo" por "bar" na linha atual:
:s/foo/bar
Para substituir "foo" por "bar" da primeira à décima linha do arquivo:
:1,10 s/foo/bar
Para substituir "foo" por "bar" da primeira à última linha do arquivo:
:1,% s/foo/bar
Ou simplesmente:
:% s/foo/bar
O comando ":s" possui muitas opções que modificam seu comportamento.
!! Exemplos
Busca usando alternativas:
/end(if|while|for)
buscará "endif", "endwhile" and "endfor".
Observe que é necessário "escapar" os caracteres (, | e ),
caso contrário eles serão interpretados como caracteres comuns.
Quebra de linha
/quebrande linha
Ignorando maiúsculas e minúsculas
/cpalavra
usando c o vim encontrará "palavra", "Palavra" ou até mesmo "PALAVRA"
Procurando palavras repetidas
/<(w*) 1>
Multilinha
/Hello_s+World
buscará Hello (em uma linha) e World na próxima linha
Buscar linhas de até 30 caracteres de comprimento
/^.{,30}$
Apaga todas as tags html/xml de um arquivo
:%s/<[^>]*>//g
Apaga linhas vazias
:%g/^$/d
ou
:%s/^[ t]*n//g
Remover duas ou mais linhas vazias entre parágrafos<br>
diminuindo para uma só linha vazia.
:%s/(^n{2,})/r/g
Remove não dígitos (não pega números)
:%s/^D.*//g
trocando palavras de lugar é usando expressões regulares
:%s/(.+)s(.+)/2 1/ - troca palavras de lugar
Inserir número de linhas no arquivo
:%s/^/=line('.'). ' '
Retirar todas as tags html/xml de um arquivo
:%s/<[^>]*>//g <cr>
Para maiores informações sobre buscas e substituições:
:help /
:help :s
O vim trabalha com o coneceito de múltiplos buffers. Cada buffer é um arquivo carregado para edição. Um buffer pode estar visível ou não, e é possível dividir a tela em janelas, de forma a visualizar mais de um buffer simultaneamente.
!Janelas
!! Dividindo a janela
CTRL + w + s Divide a janela atual em duas (:split)
CTRL + w + o Faz a janela atual ser a única (:only)
!! Abrindo e fechando janelas
CTRL + w + n Abre uma nova janela, sobrepondo a atual (:new)
CTRL + w + q Fecha a janela atual, e termina após a última (:quit)
CTRL + w + c Fecha a janela atual (:close)
!! Manipulando janelas
CTRL + w + w Alterna entre janelas (salta de uma para outra)
CTRL + w + r Rotaciona janelas na tela
CTRL + w + + Aumenta o espaço da janela atual
CTRL + w + - Diminui o espaço da janela atual
!!Maiores informações:
:help buffers
:help windows
Veja também [[Vim: Outros_Mapeamentos|Mapeamentos]]
! Repetição de Comandos
Para repetir a ultima edição saia do modo inset e pressione ponto (.)
.
Para repetição de comandos faça:
1. Posicionando no local desejado;
2. Indique o número de repetições no teclado numérico, ex: 3;
3. Entrar em modo de inserção;
4. Digitar o texto;
5. Sair do modo de inserção (tecle ESC).
!! Usando registros
Imagine que você tem o seguinte trecho de código
stdio.h ~
fcntl.h ~
unistd.h ~
stdlib.h ~
e quer que ele fique assim:
#include "stdio.h" ~
#include "fcntl.h" ~
#include "unistd.h" ~
#include "stdlib.h" ~
É aí que entram os registros, que podem ser 26, um para cada letra do alfabeto<br>
para iniciar um registro faça:
qa
onde ''q'' inicia o registro e ''a'' é o próprio registro<br>
partir do comando qa tudo que for digitado e todos os comandos <br>
serão gravados no registro. Vamos à solução do problema proposto acima<br>
qa Inicia a gravação do registro - Macro
^ Move para o começo da linha.
i#include "<Esc> Insere a string #include " no começo
da linha.
$ Move para o final da linha.
a"<Esc> Adiciona (append) aspas (")
ao final da liha.
j Vai para a próxima linha.
q Para a gravação da macro.
Agora você só precisa posicionar o cursor na primeira letra de uma linha como esta<br>
stdio.h ~
e aplicar quantas vezes for necessário o registro, para aplicar 3x faça:
3@a
o comando acima aplica 3x o registro ''a''
Para editar a tabela crontab com o vim faça:
EDITOR="vim" crontab -e
Scripts vim
Usando um script para modificar um nome em vários arquivos:
Crie um arquivo chamado "subs.vi" contendo os comandos de substituição e o comando
de salvamento :wq
:%s/bgcolor="white"/bgcolor="#eeeeee"/g
:wq
Usando o comando bufdo
Com o comando :bufdo podemos executar um comando em um conjunto de arquivos de forma rápida. No exemplo a seguir abrirei todos os arquivos html do diretório atual, efetuarei uma substituição e em seguida salvo todos.
vim *.html
:bufdo :%s/bgcolor="white"/bgcolor="#eeeeee"/g
Após isto salve todos os arquivos e saia
O comando :wall salva "write" todos "all" os arquivos abertos com o comando vim *.html
Como editar preferências no vim
O arquivo de preferências do vim é ".vimrc", um arquivo oculto que pode ser
criado no home do usuário
Caso use o Windows o arquivo é:
Vejamos agora algumas modificações interessantes para o vim:
" linhas começadas com aspas são comentários
" e portanto serão ignoradas pelo vim
set
Os comandos 'Set' podem ser colocados no .virmc
Ou digitados como comandos
:set nu
set nu "habilita numeração de linhas
set showmode "mostra o modo em que estamos
set showcmd "mostra no status os comandos inseridos
set ts=4 "tamanho das tabulções
syntax on "habilita cores
set hls "destaca as busca em cores
mapeamentos
Mapeamentos permitem criar atalhos de teclas para quase tudo, vai depender de sua criatividade e do quanto conhece o vim. Outro detalhe importante os atalhos funcionam assim:
Os atalhos
onde ''c'' corresponde a CTRL e ''x'' a uma tecla qualquer
move o cursor para esquerda
move o cursor para a direita
CTRL+ALT+A
" Mover linhas com: Ctrl+(seta abaixo) ou (seta acima)
" tem que estar em modo normal!
map ddp
map ddkP
Salvando com uma tecla de função!
" salva com F9 (observe que no modo insert tem que dar )
map :w
map :w
"usando F9 salva e F10 sai do vim
map :q
Convertendo as iniciais de um documento para maiúsculas
" MinusculasMaiusculas: converte a primeira letra de cada
" frase p/MAIUSCULAS
map ,mm :set noic
:%s/((([.!?]s*^s*)^[.?!-] ) s*"?s*)(a-z� áéóú)/1U4/g
"caso queira confirmação coloque uma letra ''c'' no final da linha acima ...4/gc
fechamento automático de parênteses
" --------------------------------------
" Seta fechamento automático para parêntese
" Set automatic expansion of parenthesis/brackets
inoremap ( ():call BC_AddChar(")")i
inoremap { {}:call BC_AddChar("}")i
inoremap [:call BC_AddChar("]")i
" inoremap " "":call BC_AddChar(""")i
"
" mapeia CTRL+j para pular fora de parênteses colchetes etc...
inoremap :call search(BC_GetChar(), "W")a
" Function for the above
function! BC_AddChar(schar)
if exists("b:robstack")
let b:robstack = b:robstack . a:schar
else
let b:robstack = a:schar
endif
endfunction
function! BC_GetChar()
let l:char = b:robstackstrlen(b:robstack)-1
let b:robstack = strpart(b:robstack, 0, strlen(b:robstack)-1)
return l:char
endfunction
'Outra opção para fechamento de parênteses'
" Fechamento automático de parênteses
imap { {}
imap ( ()
imap [
" pular fora dos parênteses, colchetes e chaves, mover o cursor
" no modo insert
imap a
imap a
Data Automática
Caso esta função esteja configurada corretamente, a cada salvamento do arquivo
a data contida no cabeçalho será atualizada
" !! !! !! =!! DATA AUTOMÁTICA !! !! !! !! !! !! =
" insira na em seus arquivos = "ultima modificação:"
" em qualquer das três primeiras linhas
fun! SetDate()
mark z
if getline(1) =~ ".*ultima modificação:" |
\ getline(2) =~ ".*ultima modificação:"
\ getline(3) =~ ".*ultima modificação:"
\ getline(4) =~ ".*ultima modificação:"
\ getline(5) =~ ".*ultima modificação:"
exec "1,5s/\s*ultima modificação: .*$/ultima modificação: " . strftime("%c") . "/"
endif
exec "'z"
endfun
" abaixo a chamada a função de data que é chamada toda vez que você
" salva um arquivo preexistente
fun! LastChange()
mark z
if getline(1) =~ ".*Last Change:"
\ getline(2) =~ ".*Last Change:"
\ getline(3) =~ ".*Last Change:"
\ getline(4) =~ ".*Last Change:" |
\ getline(5) =~ ".*Last Change:"
exec "1,5s/\s*Last Change: .*$/Last Change: " . strftime("%c") . "/"
endif
exec "'z"
endfun
" coloquei duas opções (alteração e modificação), assim
" não tem perigo de você esquecer e o sistema
" não atualizar a data do salvamento, outra melhoria na função
" é que agora é válida para qualquer tipo de arquivo. se usar
" num html por exemplo insira um começo de comentário na linha
" da data e feche o comentário na próxima linha
" abaixo a chamada a função de data que é chamada toda vez que você
" salva um arquivo preexistente
au BufWritePre * call SetDate()
au BufWritePre * call LastChange()
"!! !! !! Fim da Data Automática !! !! !! !! ===
Change log
" =!! Cria um registro de alterações de arquivo !! ==
" ChangeLog entry convenience
" Função para inserir um status do arquivo
" cirado: data de criação, alteração, autor etc (em modo normal)
fun! InsertChangeLog()
normal(1G)
call append(0, "Arquivo")
call append(1, "Criado: " . strftime("%a %d/%b/%Y hs %H:%M"))
call append(2, "Last Change: " . strftime("%a %d/%b/%Y hs %H:%M"))
call append(3, "Autor: Sérgio Luiz Araújo Silva")
normal($)
endfun
map ,cl :call InsertChangeLog()A
"
" Cria um cabeçalho para scripts bash
fun! InsertHeadBash()
normal(1G)
call append(0, "#!/bin/bash")
call append(1, "# Criado em:" . strftime("%a %d/%b/%Y hs %H:%M"))
call append(2, "# Last Change: " . strftime("%a %d/%b/%Y hs %H:%M"))
call append(3, "# Nome da empresa")
call append(3, "# Propósito do script")
normal($)
endfun
map ,sh :call InsertHeadBash()A
Barra de status
" O trecho abaixo formata a barra de status com algumas opções interessantes!
" mostra o código ascii do caractere sob o cursor e outras coisas mais
set statusline=%F%m%r%h%w FORMATO=%{&ff} TIPO=%Y [ASCII=\%03.3b] [HEX=\%02.2B] POSIÇÃO=%04l,%04v%p%% TAMANHO=%L
set laststatus=2 " Sempre exibe a barra de status
Miscelanea
Uma função para inserir cabeçalho de scrip bash
para chamar a função basta pressionar ,sh em modo normal
" Cria um cabeçalho para scripts bash
fun! InsertHeadBash()
normal(1G)
call append(0, "#!/bin/bash")
call append(1, "# Criado em:" . strftime("%a %d/%b/%Y hs %H:%M"))
call append(2, "# ultima modificação:" . strftime("%a %d/%b/%Y hs %H:%M"))
call append(3, "# NOME DA SUA EMPRESA")
call append(3, "# Propósito do script")
normal($)
endfun
map ,sh :call InsertHeadBash()A
" Ao editar um arquivo será aberto no ultimo ponto em
" que foi editado
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$")
\ exe "normal g`\""
\ endif
"
" Permite recarregar o vim para que modificações no
" próprio vimrc seja ativadas com o mesmo sendo editado
nmap :source $HOME/.vimrc echo "Vimrc recarregado!"
Redimensionar janelas
" Redimensionar a janela com
" ALT+seta à direita e esquerda
map :resize +2
map :resize -2
Função para pular para uma linha qualquer
"ir para linha
" ir para uma linha expecífica
function! GoToLine()
let ln = inputdialog("ir para a linha...")
exe ":" . ln
endfunction
"no meu caso o mapeamento é com Ctrl-l
"use o que melhor lhe convier
imap :call GoToLine()
nmap :call GoToLine()
Outros Mapeamentos
Destaca espaços e tabs redundantes
Highlight redundant whitespace and tabs.
highlight RedundantWhitespace ctermbg=red guibg=red
match RedundantWhitespace /s+$| +ze /
"remove espaços redundantes no fim das linhas
map mz:%s/s+$//g`z
"o mz cria um marca
"e o `z retorna à marca
"Abre o vim-vim explorer
map :vne .:vertical resize -30:set nonu
Fazendo buscas e Substituições
Podemos usar [Expressões Regulares] em buscas do vim
veja um exemplo para retirar todas as tags html
"mapeamento para retirar tags html com Ctrl+Alt+t
nmap :%s/<^>*>//g
" Quebra a linha atual no local do cursor com F2
nmap a
" join lines -- Junta as linhas com Shift F2
nmap A
Inserindo número de linhas
"insere número de linhas no arquivo atual
map ,n :%s/^/\=line('.'). ' '
Meu .virmc
Um gerenciador de aquivos baseado no vim
no site http://vifm.sourceforge.net/ você encontra um programinha
muito bom para gerenciar arquivos. O mesmo é voltado para usuários do
vim, ou seja, os atalhos são parecidos.
Veja também
Comments (0)
You don't have permission to comment on this page.