Vim: mudanças entre as edições
Linha 225: | Linha 225: | ||
Apaga todas as tags html/xml de um arquivo | Apaga todas as tags html/xml de um arquivo | ||
:%s/<[^>]*>//g | :%s/<[^>]*>//g | ||
Apaga linhas vazias | |||
:%g/^$/d | |||
Remove não dígitos (não pega números) | |||
:%s/^\D.*//g | |||
==Dividindo a janela== | ==Dividindo a janela== |
Edição das 13h10min de 10 de fevereiro de 2006
Introdução
" °v° ( O O ) " /(_)\ ====oOO==(_)==OOo===== " ^ ^
O Vim é um melhoramento do editor vi, um 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.
É 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, totalmente configuravel é, 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/
Para chamar a ajuda do vim use F1 Para navegar na ajuda do vim use CTRL-], e para voltar use CTRL+O
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.
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
Desfazendo
Pressione
u
Salvando
:w<enter> :sav! novo_nome (salvar como) :wq (salva e sai) :w! (salvar forçado)
Modos de Operação
Os Modos de Operação do Vim |
||
---|---|---|
Normal |
Neste modo podemos colar o que está no "buffer", uma espécie de área de transferência. Podemos ter um buffer para cada letra do alfabeto, também é possível apagar linhas, e colocar trechos no buffer. Quando se inicia o vim já estamos neste modo, caso esteja em outro modo basta pressionar 'ESC' |
Para acessar <esc> |
Insert |
Neste modo é feita a inserção de texto, para entrar neste modo basta pressionar a tecla i de insert ou a tecla a de append. |
Para acessar i,a |
Visual |
Neste modo podemos selecionar blocos verticais de texto. É exibido um destaque visual. É uma das melhores formas de se copiar conteúdo no vim. |
Para acessar <esc>v |
Comandos |
Neste modo digitamos comandos como o de salvar :w ou para ir para uma linha qualquer :100 |
Para acessar : |
Editando
Apagando linhas (modo normal)
dd - apaga a linha atual 5dd - apaga as próximas 5 linhas dgg - apaga até o início do arquivo dG - apaga até o final do arquivo d0 - apaga até o início da linha atual dw - apaga uma palavra diw - apaga uma palavra mesmo que não esteja no início dip - apaga o parágrafo atual d4b - apaga as quatro palavras anteriores dfx - apaga até o próximo x
Copiando linhas
yy - copia a linha atual 5yy - copia as próximas 5 linhas "add - deleta a linha atual para o registro a "ap - cola o registro atual
Edições complexas
Trocando palavras de lugar
coloque o cursor no espaço antes da 1ª palavra digite: deep
Outro modo de trocar palavras de lugar é usando expressões regulares
:%s/\(.\+\)\s\(.\+\)/\2 \1/ - troca palavras de lugar
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
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
''
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
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 zero
Para ir para o final de uma linha digite o caractere
$ cifrão
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>
Iniciar a inserção no fim da linha
A
Iniciar a inserção no começo da linha
I
Buscas e substituições
Para fazer uma busca certifique-se de que está em modo normal, em seguida pressione / e digite a palavra a ser buscada Usando alternativas
/end\(if\|while\|for\) buscará "endif", "endwhile" and "endfor".
Quebra de linha
Procurando por uma quebra de linha /quebra\nde linha
Procurando outras ocorrências da busca anterior
n N (em sentido inverso)
Inorando maiúsculas e minúsculas
/\cpalavra usando \c o vim buscará tanto "Palavra" quanto "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
Remove não dígitos (não pega números)
:%s/^\D.*//g
Dividindo a janela
CTLR + w + n Abre uma nova janela (divide) CTRL + w + s Divide o documento atula CTRL + w ++ Aumenta o espaço da janela atual CTRL + w +- Diminui o espaço da janela atual CTRL + w + w Alterna entre janelas CTRL + w + r gira janelas
veja também Mapeamentos
O arquivo de configuração do vim
O arquivo que você deve editar é o vimrc, não deixe de visitar este link!
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
para iniciar um registro faça:
qa
onde q inicia o registro e a é o próprio registro
partir do comando qa tudo que for digitado e todos os comandos
serão gravados no registro. Vamos à solução do problema proposto acima
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
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
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
:wall :qall
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
~/.vimrc
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
set nu
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
<c-x> onde 'c' corresponde a CTRL e 'x' a uma tecla qualquer <left> move o cursor para esquerda <right> move o cursor para a direita <c-m-a> CTRL+ALT+A
" Mover linhas com: Ctrl+(seta abaixo) ou (seta acima) " tem que estar em modo normal! map <C-Down> <esc>ddp<esc> map <C-Up> <esc>ddkP<esc>
Salvando com uma tecla de função!
" salva com F9 (observe que no modo insert tem que dar <esc>) map <F9> <esc>:w<cr> map <F2> <esc>:w<cr> "usando F9 salva e F10 sai do vim map <F10> <esc>:q<cr>
Convertendo as iniciais de um documento para maiúsculas
" MinusculasMaiusculas: converte a primeira letra de cada " frase p/MAIUSCULAS map ,mm :set noic<cr> :%s/((([.!?]s*|^s*)^|[.?!-] ) s*"?s*)([a-z� áéóú])/1U4/g<cr> "caso queira confirmação coloque uma letra 'c' no final da linha acima ...4/gc<cr>
fechamento automático de parênteses
" -------------------------------------- " Seta fechamento automático para parêntese " Set automatic expansion of parenthesis/brackets inoremap ( ()<esc>:call BC_AddChar(")")<cr>i inoremap { {}<esc>:call BC_AddChar("}")<cr>i inoremap [ []<esc>:call BC_AddChar("]")<cr>i " inoremap " ""<esc>:call BC_AddChar(""")<cr>i " " mapeia CTRL+j para pular fora de parênteses colchetes etc... inoremap <C-j> <esc>:call search(BC_GetChar(), "W")<cr>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:robstack[strlen(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 { {}<left> imap ( ()<left> imap [ []<left>
" pular fora dos parênteses, colchetes e chaves, mover o cursor " no modo insert imap <c-l> <esc><right>a imap <c-h> <esc><left>a
Data Automática
" =============== 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, "ultima modificação: " . strftime("%a %d/%b/%Y hs %H:%M")) call append(3, "Autor: Sérgio Luiz Araújo Silva") normal($) endfun map ,cl :call InsertChangeLog()<cr>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, "# ultima modificação:" . 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()<cr>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()<cr>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 <F12> :<C-u>source $HOME/.vimrc <BAR> echo "Vimrc recarregado!"<CR>
Redimensionar janelas
" Redimensionar a janela com " ALT+seta � direita e esquerda map <M-right> <ESC>:resize +2 <CR> map <M-left> <ESC>:resize -2 <CR>
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 <S-l> <C-o>:call GoToLine()<CR> nmap <S-l> :call GoToLine()<CR>
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 <F7> <esc>mz:%s/s+$//g<cr>`z
"o mz cria um marca "e o `z retorna à marca
"Abre o vim-vim explorer
map <F6> <esc>:vne .<cr><bar>:vertical resize -30<cr><bar>:set nonu<cr>
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 <C-M-t> :%s/<[^>]*>//g <cr>
" Quebra a linha atual no local do cursor com F2
nmap <F2> a<CR><Esc>
" join lines -- Junta as linhas com Shift F2
nmap <S-F2> A<Del><Space>
Complementação com tab
"Word completion "Complementação de palavras set dictionary+=/usr/dict/words set complete=.,w,k "====== complementação de palavras ==== "usa o tab em modo insert para completar palavras function! InsertTabWrapper(direction) let col = col('.') - 1 if !col || getline('.')[col - 1] !~ '\k' return "\<tab>" elseif "backward" == a:direction return "\<c-p>" else return "\<c-n>" endif endfunction inoremap <tab> <c-r>=InsertTabWrapper ("forward")<cr> inoremap <s-tab> <c-r>=InsertTabWrapper ("backward")<cr>
Configurando a verificação ortográfica no vim
Retirado do site: http://twiki.im.ufba.br/bin/view/GAVRI/TutorialDeVim
Para configurar verificação ortográfica no vim - em português do Brasil! - siga os seguintes passos:
1. Instale os pacotes ispell (verificador ortográfico) e ibrazilian (dicionário de português do Brail para o ispell) na máquina (a depender da distribuição de GNU/Linux que você utilize, o modo exato de fazer isso certamente é variado). 2. Instale o plugin do vim chamado vimspell, disponível em http://www.vim.org/script.php?script_id=465: * crie - caso já não exista - um diretório .vim dentro do seu diretório HOME, e um subdiretório dele com nome plugin . * Faça o download do script do plugin no endereço acima e salve-o no diretório ~/.vim/plugin .
Para utilizar a verificação ortográfica, utilize o comando :SpellSetLanguage brazilian (para dizer ao verificador ortográfico para utilizar o dicionário para português do Brasil), e o comando :SpellCheck para que o vim destaque as palavras grafadas incorretamente colocando-as em vermelho e sublinhadas.
Dica 1: na versão visual do vim (gvim, versão em modo gráfico, com menus), as opções de verificação ortográfica ficam no menu Plugin/Spell.
Dica 2: parece haver um problema com a verificação em português por default. Para resolver isso, adicione a seguinte linha no seu arquivo ~/.vimrc:
au! BufNewFile,BufRead * let b:spell_language="brazilian"
Dica 3: para fazer com que as teclas F7 e F8 ajudem na verificação ortográfica, adicione as seguintes linhas no seu arquivo ~/.vimrc:
map <F7> :SpellCheck<CR> map <F8> :SpellProposeAlternatives<CR>
O comando SpellProposeAlternatives lista sugestões de correção para a palavra que está sob o cursor (em modo de comando). Para usar essas teclas também é necessário estar em modo de comando.
Dica 4: para habilitar verificação ortográfica automática -- quando o cursor ficar parado por 1 segundo em modo de comando -- para alguns tipos de arquivos, adicione a seguinte linha no seu arquivo ~/.vimrc:
let spell_auto_type="tex,doc,mail"
A string contendo tex,doc,mail pode ser substituída pela listas de tipos de arquivo que você deseja que tenham verificação ortográfica automática.
Dica 5::: alterando o idioma da verificação
Note que o idioma padrão será o idioma configurado como padrão pelo ispell.
1. instale o dicionário do ispell para o idioma desejado. 2. liste no seu .vimrc os idiomas disponíveis, na variável spell_language_list. Por exemplo:
let spell_language_list="brasileiro,american,castellano"
Para alterar o idioma padrão, utilize o comando SpellSetLanguage. Por exemplo, pra alterar o idioma para inglês:
- SpellSetLanguage american
Nota: assim como outros softwares que provêm verificação ortográfica, a verificação automática é imperfeita. Felizmente, é muito mais comum que a verificação marque como incorreta uma palavra correta do que não marcar uma palavra que esteja realmente incorreta. Em geral termos técnicos de áreas específicas e vocábulos de outros idiomas são destacados como incorretos erroneamente.
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.