sergioaraujo

 

Vim

Page history last edited by Anonymous 2 yrs ago

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

: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

Caso use o Windows o arquivo é:

~\_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

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.