Dicas de movimentação e indentaçã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):
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.
"" 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 ^_____^.





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 !
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
Sim, eu puxo o saco do GVim pq eu prefiro. Mas só não funciona o Vim puro o que precisa obrigatoriamente do X =)