Dicas de movimentação e identação no GVim

Das coisas que mais me deixam frustados na face da terra, além de pegar código desidentado ou identado de forma errada, é ouvir coisas do tipo ‘no eclipse é mais fácil, só dar CTRL+…’, ‘ah, porque no notepad++ da pra fazer isso mais fácil…’.

Essa semana eu escutei algo do tipo: ‘No notepad++, CTRL+SHIFT+UP move a linha atual pra cima, o GVim podia ter um comando que fizesse isso.’ (Citada pelo reclamão-mor, Luan). Indignados, eu e Emanuel (sim, ele me ajudou) gastamos mais ou menos 1 hora de trabalho ajeitando umas HOTKEYS para ninguém reclamar. (Chefe, eu sei que tu lê o Blog, mas dá um desconto, vai?). Eis o que surgiu:

Identação de Código

Garanto que não foram uma ou duas pessoas que já tentaram identar uma seleção com TAB no GVim (identar no modo visual). Pois é, ‘não é como o notepad++, o notepad++ deixa e blá blá blá’. Esta parte foi toda do Emanuel (créditos):

1
2
3
4
5
vnoremap < <gv
vnoremap > >gv
vmap  <TAB> >
vmap  <S-TAB> <
imap  <S-TAB> <ESC><<i

Assim, colocando o script acima no .gvimrc, e testemos. Selecionando o texto, ele deve ajeitar a identação usando TAB (para direita) ou SHIFT+TAB (para esquerda) ou usando os famosos e não menos práticos < e >. Detalhe: Ele não desfaz a seleção. Então, pode se dar 4 tabs seguidos sem precisar re-selecionar o texto (como funcionaria se não tivesse o gv).

Movimentação de Texto

Bom, tudo começou no mover linha para cima ou para baixo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
"" Move bloco de texto selecionado pra cima
function! MoveUp()
    let end=line("'>")
    let start=line("'<")
    if (start > 1)
        let dif=end - start
        exec "'<,'>d"
        exec "normal kP"
        exec "normal " . (start-1) . "GV" . (end-1) . "G" 
    else
        exec "normal " . (start) . "GV" . (end) . "G" 
    endif
endfunction 
" Move bloco de texto selecionado para baixo
function! MoveDown()
    let end=line("'>")
    let start=line("'<")
    if (end < line("$")-1)
        let dif=end - start
        exec "'<,'>d"
        exec "normal p" exec "normal " . (start+1) . "GV" . (end+1) . "G"
    else
        exec "normal " . (start) . "GV" . (end) . "G"
    endif
endfunction
" Duplica um bloco de texto
function! Duplicate()
    let end=line("'>")
    let start=line("'<")
    let dif=end - start exec "'<,'>y"
    exec "normal " . end . "G" exec "normal $p"
    exec "normal " . (start+dif+1) . "GV" . (end+dif+1) . "G"
endfunction
" Move bloco de texto selecionado pra cima 
vnoremap <C-S-UP> :<C-U>call MoveUp()<CR>
" Move bloco de texto selecionado pra baixo
vnoremap <C-S-DOWN> :<C-U>call MoveDown()<CR>
" Duplica o bloco de texto selecionado
vnoremap <C-D> :<C-U>call Duplicate()<CR>

Pois bem, virou um monstro. O script acima mapeia 3 funcionalidades de alguns editores de textos. Ao selecionar um bloco de texto, vamos supor que sejam 10 linhas, CTRL+SHIFT+CIMA te permitem que todo o código seja movido 1 linha acima, o inverso com CTRL+SHIFT+DOWN. O CTRL+D duplicaria as 10 linhas selecionadas. Mas nos 3, o texto selecionado continua selecionado.

E você?

Bom, que funcionalidade de outros editores de texto você sente falta no GVim? Só não me venha com CTRL+S, CTRL+C e CTRL+V!!! Use o notepad++ neste caso ^_____^.

Posts Relacionados

Por favor, se você deseja opinar, criticar ou até mesmo mandar uma receita de bolo, deixe um comentário! Ou fique atento aos feeds.

Comentários

Gustavo, gostaria de participar da criação do livro sobre o vim em português, já tem 100 páginas prontas e suas idéias cairiam super bem! http://code.google.com/p/vimbook

Gustavo, o assunto agora é o design do seu blog, é muito bom, apesar de saber mexer com css html etc, ainda apenho muito. Conte-nos um pouco sobre seu aprendizado na nobre arte do design.

1 hora né???

AHAHAHAHA

Boa Garoto!

Seguem duas dicas:

1 – Postagem no meu blog sobre como ter uma calculadora científica no vim: http://vivaotux.blogspot.com/2009/03/calculadora-cientifica-com-o-vim.html

2 – Ao posicionar o cursor sobre uma palavra (modo normal) pode-se usar o atalho “[Shift-i” para exibir as linhas que contém aquela palavra.

No modo de comando :g/palavra/#
o legal é que funciona mesmo sem habilitar :set nu

cara muito bom, tava procurando essas dicas de identar um bloco de código e funcionou sem problemas no vim puro. Valeu !

Sim, eu puxo o saco do GVim pq eu prefiro. Mas só não funciona o Vim puro o que precisa obrigatoriamente do X =)

Na última madrugada estava sem sono e resolvi aprender mais sobre o vim, olha só o que surgiu :)

:%s/palavra/\=@a/g …. \=@a registro a

deletar linhas vazias
:v/\S/d

:Sex ……… abre o file explorer em nova janela
:sp name .. abre name em uma nova janela
‘. ………. salta para a linha onde houve a última modificação
:map , …… lista os mapeamentos começados com virgula
:set browsedir=buffer …. seta o diretório atual como padrão
ctrl-r Ctrl-w coloca palavra atual em busca ou comando
Ctrl-r Ctrl-A coloca palavra palavram busca ou comando big-word
:scriptnames …… exibe os plugins carregados

Deixe um comentário

(obrigatório)

(obrigatório)