Vim - Resumo e dicas JCFaria: joseclaudio.faria@gmail.com Data : 2013/12/06 - 20:18:00 --------------------------------------------------------- 1. MODOS 2. SALVANDO E SAINDO 3. MOVIMENTANDO 4. REPETIÇÃO DE COMANDOS 5. DELETANDO 6. MODO VISUAL 7. DESFAZENDO ALTERAÇÕES 8. COPIANDO 9. COLANDO 10. REGISTRADORES 11. BUSCAR 12. SUBSTITUIR 13. ABRINDO ARQUIVOS EM BUFFERS 14. TABS 15. DIVIDINDO A JANELA 16. CONFIGURAÇÕES BÁSICAS 17. MARCAS 18. MACRO 19. MISC 20. LATEX, BIBITEX e JabRef 21. CODIFICAÇÃO: VERIFICANDO E ALTERANDO (utf8, latin1) 22. ATALHOS (MÃO NA RODA) ESTANDO NO MODO DE INSERÇÃO 23. CORES (colorimento, syntax, highlighters) 24. IMPRESSÂO 25. MAPEAMENTO E REMAPEAMENTO --------------------------------------------------------- *** OBS: ^ é abreviação para CTRL *** 1. MODOS -------- O Vim é baseado em modos: Normal - o que é digitado são comandos Inserção - o que é digitado é o texto. Deverá estar visível uma linha na parte de baixo: -- INSERÇÃO -- Execução - o que é digitado são comandos. Após digitar : (dois pontos) irá aparecer na parte de baixo do editor uma linha para digitar o comando. Teste com :ls e ESC para sair Ao entrar no Vim, você estará sempre no modo Normal! 1.1. ENTRAR EM MODO DE INSERÇÃO ------------------------------- i - insere na posição atual, vem de 'insert' I - insere no começo da linha a - acrescenta na posição atual, vem de 'append' A - acrescenta ao final da linha o - insere na linha abaixo, já criando uma nova linha O - insere na linha acima, já criando uma nova linha cc - deleta a linha e entra no modo de inserção, vem de 'clear' C - deleta linha a frente do cursor e entra em modo de inserção, vem de 'clear' s - deleta caracter e entra no modo de inserção 'substitute' S - deleta linha e entra no modo de inserção 1.2. SAIR DO MODO DE INSERÇÃO ----------------------------- ESC ^[ 2. SALVANDO E SAINDO -------------------- :w - salva as alterações, abreviação de 'write' :w arquivo - salva as alterações no arquivo especificado, como 'Save as' :q - sai do Vim 'quit' :q! - força a saída sem salvar as alterações :wq - salva as alterações e sai 3. MOVIMENTANDO --------------- A forma mais comum para movimentar o cursor ainda é as setinhas do teclado, utilize-as à vontade. Todavia, com o tempo você vai perceber que as setinhas ficam longe demais das letras e que você precisa movimentar todo o seu braço para alcançá-las. Para evitar este esforço, tente o seguinte: j - baixo, sendo a tecla do seu indicador k - cima l - direita h - esquerda Observe a naturalidade do comandos de movimentação com a mão direita no teclado!!! Quando você está digitando uma linha longa e utiliza quebra de linha automática (wordwrap), ao movimentar para a linha de baixo você vai perceber que ele realmente vai para a próxima linha, e não para a posição abaixo do cursor. Para considerar o wordwrap, prefixe o movimento com g: gk - vai para a posição acima, considerando o wordwrap g[seta pra baixo] - vai para a posição abaixo, considerando o wordwrap g$ - vai até o final da linha, considerando o wordwrap 0 - volta ao começo da linha ^ - volta ao começo da linha (duas vezes já que se trata de um acento) $ - vai até o final da linha w - avança até a próxima palavra e - avança até o fim da palavra atual b - retorna ao início da palavra f[caractere] - pressione f seguido de algum caractere para posicionar o cursor na próxima ocorrência desse caractere (não digite os colchetes) t[caractere] - a mesma coisa para o t, mas posiciona um caractere antes do caractere pressionado (não digite os colchetes) gg - retorna à primeira linha (tecle o gê duas vezes mesmo) G - vai até a última linha :[núm. linha] - vai até a linha especificada (não digite os colchetes) ´´ - volta até onde você estava antes de pular de posição (´ espaço ´ espaço) Para quem ainda está se adaptando, as teclas seguintes também funcionam: Home, Page Up, Page Down e End! 3.1 SCROLLING ------------- ^e - uma linha abaixo no buffer ^e5 - 5 linhas abaixo no buffer ^y - uma linha acima no buffer ^y5 - 5 linhas acima no buffer ^f - página abaixo (foward) ^b - página acima (backward) 4. REPETIÇÃO DE COMANDOS ------------------------ Para repetir um comando, simplesmente prefixe-o com o número de vezes que deseja repetí-lo. Exemplo: 3w - avança três palavras 10k - sobe dez linhas 2t¿ - coloca o cursor antes da segunda aspas 3i[escreve e dá ESC] - o que você digitar será inserido 3 vezes (não digite os colchetes e não se esqueça de dar ESC) 5. DELETANDO ------------ Inserção - utilizamos o backspace e o delete para as correções triviais Normal - podemos fazer exclusões mais elaboradas, combinando o delete com os comandos que já vimos acima. x/X - apaga o caracter sob o cursor/antes do cursor D - paga da posição atual até o fim da linha J - junta duas linhas (não importa a posição do cursor, 5J irá juntar cinco linhas contíguas) dd - apaga toda a linha dj - apaga 2 linhas abaixo dk - apaga 2 linhas acima dw - apaga até o fim da palavra dt¿ - apaga da posição atual até o fechamento das aspas 5db - apaga cinco palavras para trás ^w - em Modo de Inserção (diferente dos comandos acima em Modo Normal), funciona como o backspace, mas apaga até o começo da palavra (seria o mesmo que db em modo normal) d[algum comando de posicionamento] - combina o comando com qualquer outro comando de posicionamento, veja os exemplos abaixo: 6. MODO VISUAL -------------- No Vim utilizamos o Modo Visual, com a tecla 'v' seguida de algum comando de movimentação: v - inicia ou termina o Modo Visual, utilize por exemplo as setinhas para marcar o texto V - inicia o Modo Visual, mas para toda a linha ^V - inicia o Modo Visual colunado vw - inicia o Movo Visual e marca a próxima palavra v$ - inicia o Movo Visual e marca até o fim da linha v% - estando com o cursor em cima de um delimitador, "{}[]()", inicia o modo visual e seleciona tudo que estiver entre dois delimitadores, eles inclusive vib - estando entre dois delimitadores em uma posição qualquer, "{}[]()", inicia o modo visual e seleciona o conteudo entre dois delimitadores vi" - inicia o modo visual e seleciona o conteudo entre duas " " vi' - inicia o modo visual e seleciona o conteudo entre duas ' ' vu - torna minúsculo o caracter/seleção vU - torna maiúsculo o caracter/seleção vwu - marca a palavra e utiliza o comando u para deixá-la em minúsculo vwU - a mesma coisa para deixá-la em maiúsculo ggVG - volta até o início do arquivo (gg), inicia o Modo Visual de Linhas (V) e seleciona até o final do arquivo (G) É possível utilizar o u e U em qualquer tipo de seleção! 7. DESFAZENDO ALTERAÇÕES ------------------------ u - desfazer (vem de undo) ^r - refazer (vem de redo) 8. COPIANDO ----------- Para copiar um texto no Vim você pode utilizar a seleção seguida do comando de cópia, ou utilizar a cópia combinada a algum comando de movimentação: yy - copia toda a linha (o y vem do termo yank, algo como arrancar em português) Y - copia toda a linha yw - copia até o fim da palavra y2j - copia mais duas linhas abaixo "+y - copia para a área de transferência (ficando disponível para outros aplicativos) v[faz alguma seleção]y - copia a seleção realizada (não digite os colchetes) 9. COLANDO ---------- p - cola a partir da posição atual (o primeiro caractere colado fica após o cursor) P - cola na posição atual (o primeiro caractere colado fica onde está o cursor) [p - colar antes ]p - colar depois "+gp - colar da área de transferência (disponível de outros aplicativos) Em casos onde toda uma linha foi copiada, o pê minúsculo cola abaixo e o maiúsculo acima. Uma forma alternativa e eficiente de colar o conteúdo da área de transferência (outro aplicativo) é usar o atalho do console (CTRL+SHIFT+V) no meu caso. 10. REGISTRADORES ----------------- Boas dicas em: http://pt.wikibooks.org/wiki/Vim/Usando_registros ***Os acostumados em CTRL-C e CTRL-V perceberão que os métodos acima não permitem a troca de conteúdo com outros programas. Isso acontece porque ao copiar o texto com y, o conteúdo é colocado em um registrador anônimo (disponível somente no Vim). :registers (ou :reg) lista o conteúdo dos registradores Este recurso lhe dá, adicionalmente, a flexibilidade de ter diversos itens copiados simultaneamente. Para especificar o registrador onde você deseja disponibilizar o conteúdo copiado, prefixe o comando com aspas duplas (") seguido do registrador (qualquer letra ou número). Além das cópias explícitas com y, os registradores também são usados obscuramente pelo próprio Vim. Quando você deleta um texto, ele vai para o registrador anônimo, podendo nesse caso funcionar como um recurso de recortar. 10.1. DETALHES DOS REGISTRADORES -------------------------------- 0 - tem o último texto copiado 1 a 9 - ficam os textos deletados (1 o mais recente, 9 o mais antigo) - sinal de menos, fazendo referência a algo pequeno, ficam os textos de menos de uma linha que tenham sido deletados. A exceção é o underscore, que não coloca o conteúdo em nenhum registrador ¿_dd - desta forma a linha deletada não vai para nenhum registrador 10.2. MANIPULANDO REGISTROS --------------------------- :let @a=@_ ..... limpa o registro a :let @a="" ..... limpa o registro a :let @a=@" ..... salva registro sem nome *N* :let @*=@a ..... copia o registro para o buffer de colagem :let @*=@: ..... copia o ultimo comando para o buffer de colagem :let @*=@/ ..... copia a última busca para o buffer de colagem :let @*=@% ..... copia o nome do arquivo para o buffer de colagem :reg ..... mostra o conteúdo de todos os registros 10.3. COPIAR ------------ ¿myy - copia toda a linha no registrador "m" ¿mY - copia toda a linha no registrador "m" ¿jye - copia até o fim da palavra no registrador "j" ¿+yy - copia toda a linha na área de transferência (o sinal de mais deve ser digitado mesmo, ele é o registrador) ggVG¿+y - vai até o início do arquivo (gg), inicia o Modo Visual de Linhas (V), vai até a última linha (G) e copia para a área de transferência (¿+y) 10.4. COLAR ----------- ¿+P - cola da área de transferência (o sinal de mais deve ser digitado) ¿mp - cola do registrador eme 5¿mp - cola do registrador eme cinco vezes (teclar SPC após ") ^r+registro - cola no modo de inserção ^r++ - cola o conteudo da área de transferência no modo de inserção (Ctrl+r+Shift++) 11. BUSCAR ---------- /txt - (txt = termo a ser buscado) n - localiza a próxima ocorrência N - localiza a ocorrência na direção contrária * - localiza palavra sob o cursor *** funcionalidades :set hlsearch ..... destaca todos os termos encontrados (highlight) :set nohlsearch ..... como tantas outras opções do Vim, o prefixo ¿no¿ desabilita a funcionalidade Para ignorar a diferença entra maiúsculas e minúsculas, basta incluir \c no termo da busca: /\ctxt - realiza uma busca case insensitive do termo digitado /\Ctxt - cê maiúsculo força a diferenciação de maiúsculas e minúsculas :set ignorecase ..... configura todas as buscas como case insensitive É possível utilizar expressões regulares como padrão de busca! 12. SUBSTITUIR -------------- A substituição de termos segue basicamente o padrão de expressões regulares, no formato s/antes/depois/. Ao substituir um termo por outro no Vim, precisamos ainda especificar onde a alteração deve ser realizada; para alterar um termo em todo documento, utilizamos o simbolo de porcentagem: :%s/antes/depois/ ..... substitui a primeira ocorrência dos termos localizados em todas as linhas Os primeiros dois pontos iniciam um comando e o símbolo de porcentagem especifica onde a busca deverá ocorrer (nesse caso, em todo o documento). A barra funciona apenas como delimitador, o que é comum para quem está familiarizado com expressões regulares. Caso o termo localizado apareça mais de uma vez na mesma linha, somente a primeira ocorrência é substituída, sendo necessário o uso da flag de Global Matching: :%s/antes/depois/g .... com a letra g no final, especificamos a flag necessária para alterarmos todas as ocorrências do termo em todas as linhas do documento :%s/antes/depois/gc .... com as letras gc no final, especificamos as flags necessárias para alterarmos todas as ocorrências do termo em todas as linhas do documento, porém, com confirmação de alteração ou não de cada ocorrência Da mesma forma que utilizamos a porcentagem para abranger todo o documento, podemos especificar intervalos de linhas: :1,10s/antes/depois/g ..... altera todas as ocorrências entre as linhas 1 e 10 Nesses casos eu prefiro primeiro realizar a seleção com Modo Visual de Linhas e em seguida aplicar a seleção. Tente o seguinte: Vkkk:s/antes/depois/g - iniciamos o Modo Visual de Linhas (V), subimos três linhas (kkk), começamos um comando (:) e realizamos a substituição (s/antes/depois/g) As substiuições também suportam metacaracteres de expressões regulares, inclusive backreferences para recuperar o que foi casado em um grupo. Este assunto é um tanto quanto longo e merece melhor atenção em algum post futuro ou lendo o próprio manual. Se existir uma seleção não se pode informar % antes do s ... :'<,'> s/antes/depois/gc 13: ABRINDO ARQUIVOS EM BUFFERS ------------------------------- Uma vez dentro do Vim, você pode carregar outros arquivos no que é chamado de Buffer. :edit arquivo ..... carrega o arquivo especificado em outro buffer :e arquivo ..... por comodidade, basta utilizar a abreviação gf ..... abre o arquivo especificado no texto onde está o cursor. Exemplo: ~/.vimrc (tecle gf com o cursor em cima) :buffers ..... lista os buffers abertos, indicando o número do buffer e o caminho do arquivo :ls ..... sinônimo para listar os buffers abertos :buffer[número] ..... troca para o buffer do número especificado (não digite os colchetes) :b[número] ..... troca para o buffer do número especificado (não digite os colchetes) Como lembrar os números é impraticável, você pode digitar parte do nome do arquivo (o suficiente para que ele seja o único encontrado). Vamos supor que você esteja com os arquivos consulta.php e consulta.tpl abertos em seus respectivos buffers: :b php ..... para abrir o buffer do arquivo consulta.php (abreviação de :buffer) :b tpl ..... para abrir o buffer do arquivo consulta.tpl O acionamento dos buffers não está relacionado às extensão dos arquivos, apenas ao fato do padrão digitado identificar unicamente cada buffer. Imagine agora os arquivos Conexao.inc.php e Alunos.inc.php: :b Con ..... para abrir o buffer do arquivo Conexao.inc.php :b Alu ..... para abrir o buffer do arquivo Alunos.inc.php Os termos ¿Con¿ e ¿Alu¿ já foram suficientes para identificar o buffer desejado. Se ao invés de um arquivo você especificar um diretório para o comando :edit, o Vim abrirá uma lista de arquivos e diretórios para que você possa navegar e localizar o arquivo desejado. Utilize a tecla Enter para abrir o arquivo. :bd ..... para fechar o buffer corrente (abreviação de :bdelete) :bd[número] ..... para fechar o buffer especificado (não utilize os colchetes) 14. TABS -------- :tabedit file ..... abre arquivo em outra tab ^PageUp/PageDown - navegação entre as tabs (antes/depois). (incompatível com tmux) gt - próxima gT - prévia nt - vai para tab 'n' :tabmn ..... move tab para posição n :tabm0 ..... move a tab atual para a posição 0 15. DIVIDINDO A JANELA ---------------------- :split ..... divide a janela na horizontal :sp ..... divide a janela na horizontal :vsplit ..... divide a janela na vertical :vs ..... divide a janela na vertical :split arquivo - abre o arquivo após dividir a janela horizontalmente (o mesmo para :vsplit na vertical) ^w[movimento] - para focar outra janela; o movimento significa as setas direcionais ou uma das teclas hjkl (não digite os colchetes) ^wq - para fechar a janela atual (o arquivo continua aberto no buffer) ^w= - configura as janelas com o mesmo tamanho (se estiver utilizando o plugin Tabbar, terá um resultado estranho, já que as abas têm sua própria janela) ^w- - diminui o tamanho da janela focada ^w+ - aumenta o tamanho da janela focada 16. CONFIGURAÇÕES BÁSICAS ------------------------- Finalizando, um breve comentário sobre as configurações que uso: :colorscheme slate ..... troca o esquema de cores para um de fundo escuro (especialmente agradável na versão gráfica) :syntax on ..... habilita o highlight de sintaxe, praticamente a única coisa que eu utilizava para programar em outras IDEs mais completas :set tabstop=4 ..... configura a largura visível de tabulações com \t :set expandtab ..... utiliza espaços ao invés de \t para tabulação :set shiftwidth=4 ..... configura o número de espaços na tabulação :set smarttab ..... habilita facilidades na tabulação, útil para mim ao dar backspace para remover tabulações com espaço :set number ..... mostra o número das linhas As configurações são relativas à execução do Vim, algumas individuais por buffer. Para não ter que refazer as configurações toda vez que abrir o Vim, basta colocá-las no arquivo ~/.vimrc. No arquivo, não é necessário colocar os dois pontos a cada comando. Por muito tempo utilizei o GVim, versão gráfica do Vim, e mantinha algumas configurações extras pra ele no ~/.gvimrc: :set guioptions-=m ..... para remover a barra de menu :set guioptions-=T ..... para remover a barra de ferramentas :set guifont=Monospace\ 8 ..... porque a fonte padrão é enorme! Atualmente tenho usado o Vim no terminal mesmo, para poder desfrutar de um fundo transparente ou com alguma imagem legal :) 17. MARCAS ---------- To set a mark, type m followed by a letter. For example, ma sets mark a at the current position (line and column). If you set mark a, any mark in the current file that was previously identified as a is removed. If you set mark A, any previous mark A (in any file) is removed. edit Deleting marks If you delete a line containing a mark, the mark is also deleted. If you wipeout a buffer (command :bw), all marks for the buffer are deleted. The :delmarks command (abbreviated as :delm) may be used to delete specified marks. ------------------------------------------------------------------------------ Command Description ------------------------------------------------------------------------------ :delmarks a ..... delete mark a :delmarks a-d ..... delete marks a, b, c, d :delmarks abxy ..... delete marks a, b, x, y :delmarks aA ..... delete marks a, A :delmarks! ..... delete all lowercase marks for the current buffer (a-z) ------------------------------------------------------------------------------ 18. MACRO --------- qletra - para inciar o modo de gravação (ex: qm) q - encerra gravação da macro @letra - executa a macro (ex: @m) As macros ficam visíveis nos registadores do Vim. 19. MISC -------- 19.1. Dividindo a janela ------------------------ ^ws - divide a janela atual em duas (:split) ^wo - faz a janela atual ser a única (:only) Caso tenha duas janelas e use o atalho acima ^wo lembre-se de salvar tudo ao fechar, pois apesar de a outra janela estar fechada o arquivo ainda estará carregado, portanto faça: :wall ..... salva todos 'write all' :qall ..... fecha todos 'quite all' 19.2. Abrindo e fechando janelas -------------------------------- ^wn - abre uma nova janela, sobrepondo a atual (:new) ^wq - fecha a janela atual, e termina após a última (:quit) ^wc - fecha a janela atual (:close) 19.3. Manipulando janelas ------------------------- ^ww - alterna entre janelas (salta de uma para outra) ^wj - desce uma janela j ^wk - sobe uma janela k ^wr - rotaciona janelas na tela ^w+ - aumenta o espaço da janela atual ^w- - diminui o espaço da janela atual 19.4. File Explorer ------------------- Para abrir o gerenciador de arquivos do vim use: :Vex ..... abre o file explorer verticalmente :e. ..... abre o file explorer na janela atual após abrir chame a ajuda Para abrir o arquivo sob o cursor em nova janela coloque a linha abaixo no seu ~/.vimrc let g:netrw_altv = 1 Caso queira pode mapear um atalho "no caso abaixo F2" para abrir o File Explorer. map :Vex Maiores informações: :help buffers :help windows 19.5. Dicas ----------- Caso esteja editando um arquivo e nele houver referência a outro arquivo tipo: /etc/hosts Você pode usar este comando para abrir uma nova janela com o arquivo citado ^wf Mas lembre-se que posicionar o cursor sobre o nome do arquivo (veja também mapeamentos) 19.6. Conhecendo o tipo de arquivo ---------------------------------- :set filetype? - para conhecer o tipo do arquivo. Muito útil para criar arquivos 'snippets' (trechos) para o plugin snipmate 20. LATEX, BIBITEX e JabRef --------------------------- Integração do programa JabRef com o (g)Vim. Estando o (g)Vim em modo de inserção (ou não) é possível inserir uma citação a partir do JabRef no (g)Vim. Para isso inicie o (g)Vim como abaixo: vim --servername vim nome_do_arquivo.tex gvim --servername vim nome_do_arquivo.tex Para ficar permanente é necessário criar/editar o arquivo .bashrc no home: alias vim='vim --servername vim' 21. CODIFICAÇÃO: VERIFICANDO E ALTERANDO (utf8, latin1) ------------------------------------------------------- :set fileencodings ..... ver o tipo de codificação :set fileencodings=utf8 ..... alterar a codificação para utf8 :set fileencodings=latin1 ..... alterar a codificação para latin1 22. ATALHOS (MÃO NA RODA) ESTANDO NO MODO DE INSERÇÃO ----------------------------------------------------- ^o - o vim entra em um modo de inserção especial "(inserção)" permitindo uma única tarefa nos outros modos (normal e comando), após isso, imediatamente retorna ao modo de INSERÇÂO normal ^x^l - abre uma janela popup permitindo escolher qualquer linha já existente no arquivo ^y - repete, caracter por caracter, a linha acima a do cursor ^e - repete, caracter por caracter, a linha abaixo da do cursor ^w - apaga (na linha) a última palavra digitada anterior ao cursor ^u - apaga (na linha) da posição do cursor até o início da linha ^t - indenta linha atual ^d - desidenta linha atual 23. CORES (colorimento, syntax, highlighters) --------------------------------------------- No Debian os esquemas de cores ficam armazenados na pasta: /usr/share/vim/vim73 (ou vim74)/colors Existe um excelente plugin com muitas opções de cores: Colour-Sampler-Pack Nele minha meu esquema de cores preferido é: jellybeans, pois se adapta muito bem tanto no terminal (Vim) quanto sob Gvim. 24. IMPRESSÂO ------------- :harcopy :ha :ha=3 25. MAPEAMENTO E REMAPEAMENTO ----------------------------- Mapeamentos são um ponto importante do vim, com eles podemos controlar ações com quaisquer teclas, mas antes temos que saber que: ----------------------------------------------------- Tecla : Tecla mapeada ----------------------------------------------------- : Enter : Escape : normalmente \ : | pipe : Palavra sob o cursor : Arquivo sob o cursor < : Arquivo sob o cursor sem extensão : Conteúdo do arquivo sob o cursor : Salta um caractere para esquerda : Equivale clicar em 'seta acima' : A tecla (ALT = M) mais a tecla F4 : Control f : Backspace : Espaço : Tab -----------------------------------------------------