Dicas de Vim (VI)

1. Lendo manpage

$ man assunto | col -b | vim -

No gvim (modo Ex)

:new|read!man tar|col -b

2. Abrir todos os arquivos que contenham uma determinada palavra

$ vim `fgrep -l <palavra> *.ext`

3. Mapeamento para inserir linha com repetição de char

:map - <Esc>o<Esc>78a-<Esc>
:let @q="*"|normal i" ^[76"qp

4. Mapeamento para Ctrl-key

exemplo01: mapeando a tecla Ctrl-t

:map ^V^T  iOla Mundo

exemplo02: mapeando a tecla Ctrl-a

:map ^V^A  iOla Mundo

exemplo03: mapeando a tecla Ctrl-a

:map <c-a> iOla Mundo

exemplo04: mapeando a tecla Ctrl-a

:map <char-1>  iOla Mundo

5. Filtrando comandos internos

Exemplo01:

1,10m$|g/Essas/ p

Exemplo02: move bloco de texto para última linha do arquivo e substitui 'Essas' por 'Aquelas' dentro do bloco.

1,10m$|s/Essas/Aquelas/g

6. Contando os padrões encontrados na edição

:let i=0|%g/{padrao}/let i=i+1
:echo i

7. Mapeamento

Qual o mapeamento de <F4> ?

:map <F4>

Quais os mapeamentos dos comandos que iniciam por ; ?

:map ;
           mapea       modo     limpar          exemplo
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           map          n       unmap           map <F5> :Ex<cr>
   +-----> map!/imap    i       unmap!          imap ff  File folder
   |       iabb[rev]    i       una[bbreviate]  iabbr oi oiMundo
   +-----> cmap         lc      cunmap          cmap oi echo "oi mamae"
   |       cab          lc      cuna            cab oi  echo "Oi"
   |       --------------------------------------------------------
   |
   +--------------- não é necessário <spaço> e/ou [enter] após comando.

  n/c - modo normal ou modo de comando
  i   - modo de inserção
  lc  - modo de linha de comando
  v   - modo visual
  R   - Reposição
  B   - Busca

sintaxe : comando-Mapeador {key[[key]...]} {comando[s]}

Formato define-mapeia ou mapeamento referenciado, sintaxe:

nnoremap    \{nomeExterno}              {comando[s]}
{map-modo01} {combinação-tecla[s]02}   \{nomeExterno}
{map-modo02} {combinação-tecla[s]03}   \{nomeExterno}
{map-modo03} {combinação-tecla[s]04}   \{nomeExterno}

exemplo:

nnoremap \key :let @m="oi gente"<cr>:put m<cr>
nmap <F5> \key
imap <F5> <c-o>\key

8. Abreviacoes

ab         - mostra todas as abreviações
abc[lear]  - limpa todas as abreviações
iab        - mostra todas as abreviações do modo de inserção
iabc[lear] - limpa todas as abreviações do modo de inserção
cab        - mostra todas as abreviações do modo de comando
cabc[lear] - limpa todas as abreviações do modo de comand

9. Movimentação por links

movimentação '{char}

para linkar :<range> mark {char}

10. Lendo man page ou help de programas externos

read !man dc|col -b
read !bc --h

11. Convertendo formato entre janelas

convertendo do formato horizontal para o vertical.

de

W|W|W

para

W
W
W
:windo wincmd K

convertendo do formato vertical para o horizontal.

de

W
W
W

para

W|W|W
:windo wincmd H

12. Numerando linhas selecionadas

usando um comando linux externo:

:'<,'>!cat -n
:3,10!cat -n|tr '^I' '-'

usando Vim-Script:

  • com variável
    a) let  i=0|'<,'>g/^/let i=i+1|s//\=i/g
    b) let  i=0|'a,'eg/^/let i=i+1|s//\=i/g
    c) let  i=0|2,200g/^/let i=i+1|s//\=i/g
    
  • com registro
    a) let  @s=0|'<,'>g/^/let @s=@s+1|s//\=@s/g
    b) let  @s=0|'a,'eg/^/let @s=@s+1|s//\=@s/g
    c) let  @s=0|2,200g/^/let @s=@s+1|s//\=@s/g
    
  • com funcoes do Vim
    a) '<,'>s/^/\=(line('.') - line("'<") + 1)/g"
    b) 's,'qs/^/\=(line('.') - line("'s") + 1)/g"
    c) '20,46s/^/\=(line('.') - 20 + 1)/g"
    
  • com minhas próprias funcoes
    a) '<,'>s/^/\=INC(1)/g"
    
  +====================+====================+====================+
  |    valor           |  :echo (valor)     | :echo strlen(valor)|
  +====================+====================+====================+
  | 987654321 % 10     |           1        |      1             |
  | 987654321 % 100    |          21        |      2             |
  | 987654321 % 1000   |         321        |      3             |
  | 987654321 % 10000  |        4321        |      4             |
  | 987654321 % 100000 |       54321        |      5             |
  | 987654321 % 1000000|      654321        |      6             |
  +--------------------+--------------------+--------------------+
             :let c=3|let s=20|exec "normal i+^[
".c."i".Espaco(s,'-')."+"
              insere a linha da tabele acima

13. invertendo linhas em arquivo

:'<,'>g/^/m '<
:25,67g/^/m 25

14. Executando comando externo no modo de comando

a)

no modo de comando de linha

:let @a=".!seq 5"

executando o comando contido no registro a:

@a

b)

no modo de comando de linha

:let @s=":%!sort -u"

executando o comando contido no registro s:

@s

15. Metacaracteres especiais

  meta   exemplo              Casamentos
+~~~~~+~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
|     |                 |
| \@= | Buf\(Read\)\@=  | BufReadPost, BufRead, BufReadPre,BufReadPost
|     |                 |
|     |                 | siguinificado:casa 'Buf' se 'Buf' sucedido
|     |                 | por 'Read'
+-----+-----------------+------------------------------------------------+
|     |                 |
| \@! | Buf\(Read\)\@!  | BufWritePost, BufNewFile, BufWritePre
|     |                 |
|     |                 | siguinificado:casa 'Buf' se 'Buf' não for
|     |                 | sucedido por 'Read'
+~~~~~+~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
|     |                 |
|\@<! | \(Read\)\@<!Post| BufWritePost, FileWritePost, FileAppendPost
|     |                 |
|     |                 | siguinificado:casa 'Post' se 'Post' não for
|     |                 | precedido por 'Read'
+-----+-----------------+------------------------------------------------+

16. Capturando saída de comando externo como string

let a=system('ls')
echo  matchstr(system('cygpath -m /'), "^.*\\ze\n") . '/'
echo  substitute(system('gcc -v'),'\s\+','\n','g')

17. Comandos duplos

  • indentexpr, indentexpr:
    setlocal indentexpr=GetPascalIndent()
    setlocal indentkeys+==end,=else,=type,=var,=Begin
    
  • grepprg, grepformat:
            setlocal grepprg=lid\ -Rgrep\ -s
            setlocal grepformat=%f:%l:%m
    
  • makeprg, errorformats:
          let &l:makeprg
         set makeprg=make\ #<.o
         set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
         set makeprg=latex\ \\\\nonstopmode\ \\\\input\\{$*}
         let &mp = 'latex \\nonstopmode \\input\{$*}'
         set makeprg=gcc\ -o\ $*\ $*
         set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\
    ]%\\@=%m
    

18. Fechando blocos de código

let  &foldmarker="if,endif"|echo &foldmarker

19. Isere string em linha especifica

:call setline(5,strftime("%d.%m.%Y  %X"))

20. Isere string em linha especifica

     :let id="valor"
     :put =expand(id)

     :let @g="Eu amo o VIM"
     :exe 'normal 20"gp'
     :exe "normal 200\p"
     :exe "normal \iOi Caroline"
     :'<,'>s/^/\='U'.Espaco(9,'k')/g
     :'<,'>s/^/\='<'.Espaco(9,'-').'>'/g
     :let m="<right>"|exe 'normal '.10.'i'.m

21. Deletando

: {linha} delete {contador}

por exemplo

: n delete 5

irá deletar as linhas n,n+1,...,n+5

22. tipos de variáveis

aviso aos navegantes: &texwidth é o valor armazenado em texwidth

   :set texwidth 78
   :let b:a=texwidth      ERRADO
   :let b:a=&texwidth     CERTO
   echo (b:a)
   78

   :let &texwidth=25      CERTO
   :set texwidth
   45

         selecione 12 < colune < 18 e linha <10
   exe '/\%>' . '12c' . '\&.*' . '\%<18c' . '\&.*' . '\%<10l'

23. gravando o histórico da linha de comandos em um arquivo

$fc -l cp > ultimos-comandos vi lastcommands$ source lastcommands
  |
  |
  +------ O comando fc edita o shell com seu editor preferido.

  um exemplo interessante é escrever na linha de comando `fc`
  $fc

  $fc -s     -- executa o último comando editado na linha de comando
  $fc -s gcc -- executa o último comando `gcc` editado na linha de comando

24. salvando como

para tanto usamos o comando w (write)

exemplo:

:2,8w nome_noivo_Arquivo.txt

salvando da linha 2 a 8 no arquivo nome_noivo_Arquivo.txt

exemplo2:

:g/pattern/ .+2 !>> nome_noivo_Arquivo.txt

salva as linhas que casarem com a combinaço pattern, sendo assim as mesmas 2 pontos abaixo.

25. Alteração em tempo de execução

vi -c":%s/include/Bala da GOMA/g"   max.c

26. codificando

map <F12> ggVGg?

27. Folding

Folding :

   i. Folding Markers := <{ >}
  ii. Close One Fold := zc
 iii. Open One Fold := zv
  iv. Open All Fold := zn
   v. Close All Fold := zm

Move Around :

   i. First Line := :0
  ii. Last Line := :$
 iii. Move To Line := :XX (XX is for Line Number)

28. para os espertos

  nmap <c-s> :w<CR>
  vmap <c-s> <esc><c-s>
  imap <c-s> <esc><c-s>

The F2 series of mappings are different; they only write if needed (performing an update) AND return you to where you were: insert mode, visual selection etc.

  nmap <f2> :update<cr>
  vmap <f2> <esc><f2>gv
  imap <f2> <c-o><f2>
— EOF —

Aprenda mais sobre Vim