Jedi Tux

Indetação no Vim – Tabs e Espaços

Posted in Dicas, Linux, Vim by Fernando Basso on 11 de janeiro de 2012
======================================
= Indentação no Vim - Tabs e Espaços =
======================================

= Introdução =
--------------

Há duas maneiras de indentar um código fonte:
  1. com tabs reais, também chamado de hard tabs.
  2. com espaços no lugar de tabs (sim, o vim pode ser configurado para
     substituir uma tabulação por um certo número de espaços).

Há vantagens e desvantagens em cada um dos métodos. Há alguns artigos que
discutem o assunto na web, embora parece que mais pessoas preferem Espaços
no lugar de Hard Tabs, mas isso é pura questão de gosto, e cada caso é um
caso.

Basicamente temos as opções:
 1.     'tabstop' - altera a largura da tabulação (Tabs reais).
 2.   'expandtab' - causa espaços serem usados/inseridos no lugar de
                    caracteres Tab.
 2. 'softtabstop' - configura detalhadamente a quantidade de espaço a serem
                    inseridos quando a tecla Tab é pressionada.
 3.  'shiftwidth' - afeta o uso de ">>", "<<", modo normal, "Ctrl-t" e
                    "Ctrl-d" no Modo Insert, além de ter influência em como
                    indetação automática funciona.

Para iniciar , execute isso no vim:
    :set list 
    :set listchars=tab:T_ 

A partir de agora, toda vez que o vim "enxergar" um Tab real, ele vai
mostrar algo como "T_____" no lugar do tab, para que o Tab fique 
visualmente percebível.

Pra desabilitar basta fazer:
    :set nolist 


= Indentação com Hard Tabs Apenas =
-----------------------------------

Por padrão, o vim vem configurado com:
  tabstop = 8 
  softtabstop = 0 
  shiftwidth = 8 
  noexpandtab 

Independente da sua configuração, digite esta linha para testar
(simplesmente coloca os valores default):
    :set tabstop=8 softtabstop=0 shiftwidth=8 noexpandtab 
 
O que acontece então?
 1. Com essa configuração, pressionar a tecla Tab no modo insert insere um
    caractere Tab real, com largura de 8 colunas. 
 2. Nesse caso, o  deleta o caractere Tab (deleta 8 colunas), o
    que visualmente parece que vários espaços foram deletados ao mesmo tempo.
 3. No modo Normal, usar >> e <> e <> e <> e << insere ou deleta *4* espaços. O mesmo
    occorre ao se pressionar Ctrl-t e Ctrl-d no modo Insert.

= Espaços = Caso 4 =
--------------------

Mas (note o NOexpandtab): 
    :set tabstop=8 softtabstop=4 shiftwidth=4 noexpandtab 

Agora, 'noexpandtab' não está habilitado, e portanto, pressionar 
insere um Tab real (e não espaços no lugar do Tab). Se pressionar Tab, e
'tab=8', um Tab terá largura de 8 colunas.

Como você sabe, ">>", "<>" duas vezes.
Você vai notar que ele se transforma em um Tab real. Isso porque "tabstop=8"
e "shiftwidth=4", etão, 4 + 4 = 8. Se "tabstop=12", por exemplo, então
pressionar ">>" 3 vezes se gera uma Tab real, porque 4 + 4 + 4 = 12.  

Isso tudo acontece porque 'softtabstop' tem precedência sobre 'tabstop'.
Então, quando pressionamos, por exemplo, "Ctrl-t" uma vez, ele insere 4
espaços, mas quando pressionamos "Ctrl-t" uma segunda vez, ele diz "Hmm,
isso está igual a "largura" do 'tabstop', e então os 8 espaços são
deletados e um Tab real é inserido. Quando usamos , "Ctrl-d" ou
"<<", o processo inverso ocorre.


= Misturando - Caso 5 =
-----------------------

Vamos deixar 'tabstop' igual 4, com 'expandtab' desabilitado:
    :set tabstop=4 softtabstop=4 shiftwidth=4 noexpandtab 

 1. Agora, como 'tabstop' está igual 'shiftwidth' e 'expandtab', quando
    , ">>" ou "Ctrl-t" for pressionado, uma Tab real será inserida
    pois o Vim notou que as configurações estão iguais. Quando as
    configurações estão iguais.

NOTE que tabs reais e espaços antigos no arquivo continuam sendo o que eram.
O que pode mudar é o tamanho das Tabs reais, mas não o fato de serem Tabs
reais ou não. O que já era Tab real continua sendo Tab real, e o que era
(grupos) de espaços continuam sendo (grupos) de espaços (grupos de espaços
que por venturam tenham sido inseridos em lugar de Tabs reais).

= Possíveis Escolhas =
======================

= Hard Tabs (Tabs Reais) =
--------------------------
Quem prefere trabalhar com Tabs reais, uma boa escolha é deixar 'tabstop'
igual 'shiftwidth', pois eles trabalharão de maneira consistente e
homogênea. Espaços não serão usados.

= Espaços em vez de Tabs Reais =
--------------------------------
Deixar 'softtabstop' igual 'shiftwidth' assegura que ">>", "<<",
"Ctrl-t" e "Ctrl-d" adicionem e removam Tabs (não reais, pois agora é
substituída por espaços) com o mesmo comportamento de se adicionar e deletar
tabs pressionando a tecla  e . Ou seja, todos eles vão
adicionar ou remover o mesmo número de espaços - vão funcionar de forma
homogênea. Pode-se também, nesse caso (e alguns acham aconselhável), deixar
'tabstop' com o mesmo valor de 'shiftwidth' e 'softtabstop'.

-------------------------------------------------------------------------------

= Notas Finais =
---------------------

Saiba que o Vim permite configurar tudo isso de acordo com o 'filetype'. Por
exemplo, é possível configurar que arquivos "html" utilizem 2 espaços no
lugar do Tab, um arquivo em "C" utilize 4 espaços no lugar de um Tab, e
ainda, quando um arquivo "bash" for editado, um Tab real de 6 colunas seja
usado. Ou seja, quando o arquivo é aberto, o vim usa as configurações
predefinidas automaticamente.

Alguns exemplos.

Vamos criar os diretórios necessários:
    mkdir --parents ~/.vim/after/ftplugin/ 

Para HTML:
Criar o um arquivo chamado "html.vim" dentro do último diretório criado:
    vim ~/.vim/after/ftplugin/html.vim 

E coloque o seguinte conteúdo dentro do arquivo:
    set softtabstop=2 expandtab shiftwidth=2 


Para CSS:
Criar o arquivo css.vim, no mesmo diretório que do exemplo anterior:
    vim ~/.vim/after/ftplugin/css.vim 

E cole o seguinte conteúdo:
    set softtabstop=4 expandtab shiftwidth=4 


Para "bash", com Hard Tabs:
    vim ~/.vim/after/ftplugin/bash.vim 
E cole:
    set tabstop=6 softtabstop=6 shiftwidth=6 noexpandtab 


= Dica final =
--------------

Se você optar por usar Espaços no lugar de tabs, há uma maneira de inserir
Tabs reais sem ter que mudar temporariamente a configuração. Isto é
conseguido inserindo-se caracteres não imprimíveis literalmente. 

No vim, isso é muito fácil. Basta pressionar "Ctrl-v" no modo Inserte, e
então pressionar a tecla Tab em seguida. Passo-a-passo:

            vim --> abre o vim no terminal (poderia ser o gvim).
              i --> entra no modo insert na posição onde está o cursor.
         Ctrl-v --> pressionar a combinação "ctrl-v". Vai aparecer um
                    caractere parecido com um "^". Neste momento, o Vim está
                    esperando você digitar o caractere que termina a
                    sequência, no nosso exemplo, um .
           --> pressione Tab.
  "hello world" --> escreva "hello world" por que esse é um encantamento que
                    garante que você aprenda o conteúdo. Sempre foi assim em
                    todas as linguagens, e essa é a razão. São palavras
                    mágicas.

Como mesmo exemplo você poderia inserir um caractere  ou 
literalmente no texto.

Aqui está o arquivo que fiz no Vim, mas convertido para html. Tive que renomear para .pdf para fazer o upload. Depois de baixar, troque a extensão para .html novamente e abra no seu navegador favorito. Está bem colorido, facilitando a leitura.
Indentando_Código_Fonte_no_VIM

Referências:
------------
    
  No Vim:
    :help 'softtabstop'
    :help 'tabstop'
    :help 'shiftwidth'
    :help 'expandtab'

    http://vimcasts.org/

    http://vim.wikia.com/wiki/Indenting_source_code




Simular margem no vim para ler o :help

Posted in Bash, Dicas, Linux, Vim by Fernando Basso on 1 de janeiro de 2012

Simular margem no vim para ler o :help

Uma coisa que me incomoda quando estou lendo o :help no vim é que o texto fica “grudado” na borda esquerda da janela do vim (ou gvim). Então, o que costumo fazer é habilitar os números de linha com :set number. para ter algo no lado esquerdo da janela funcionando como uma espécie de margem.

Tem dois detalhes que me incomodam. Um é que não adiante colocar set number no vimrc porque help é um filetype no vim, então, as configurações do filetype help (que usa set nonumber) sobrescreve o set number do vimrc. Outra coisa é que ter números de linhas para ler o help pode não agradar muito ou fazer muito sentido. Fortunadamente, há uma maneira de simular uma margem, sem que fique aparecendo os números.

Entendendo o processo

Quando usamos a opção set number, o vim usa um espaço ao lado esquerdo da janela para mostrar esses números, e também nos fornece os grupos de cor chamados LineNr que é justamente para definir a cor que aparece naquela parte onde os números são mostrados, tanto o background como o foreground.

Pois bem, se configurarmos LineNr para ter a mesma cor de background que do resto do vim não veremos diferença de cor entre o fundo do texto normal e a cor da região usada para mostrar o números das linhas. Ainda mais, se configurarmos a cor que LineNr usa para mostrar os números propriamente ditos para a mesma cor do background, não vamos ser capazes de ler/ver número algum, pois a cor do texto será exatamente igual a cor de fundo. Os números ainda estão lá, mas não dá pra notar.

O que vamos fazer então é criar (se já não existir) o diretório ~/.vim/after/ftplugin. O comando abaixo se encarrega disso, e se os diretórios já existem, ele simplesmente não faz nada:

mkdir --parents ~/.vim/after/ftplugin

Precisamos criar também, (se já não existir) o arquivo help.vim dentro de ~/.vim/after/ftplugin/:

vim ~/.vim/after/ftplugin/help.vim

Agora, vamos descobrir quais as cores que o nosso colorscheme está usando para o background. Os grupos de cores para isso são ctermbg (background no terminal) e guibg (background no gvim). Para descobrir as cores configuradas para os grupos mencionados, execute os seguinte comando:

:highlight Normal

Isso vai mostrar as cores configuradas para ctermfg, ctermbg, guifg, entre outras coisas.

Para ter certeza da cor que o gvim usa como background (há fatores que podem fazer com que o vim no terminal use cor x, e o gvim use cor y para determinado grupo) é mais seguiro abrir o gvim e rodar o mesmo comando para ver o que ele mostra sobre si próprio para guifg e guibg.

NOTE que o comando é digitado no modo de comando do vim. Entramos no modo de comando quando, estando no modo normal pressionamos : (chegamos no modo normal pressionando <Esc> ou CTRL-[).

Finalmente, no ~/.vim/after/ftplugin/help.vim colocamos o configuramos os backgrounds e foregournds para o vim e gvim com os valores das cores conforme foram mostrados com o comando anterior.

set number
highlight LineNr ctermfg=235 ctermbg=235 guifg=#dfd6c1 guibg=#242424

Veja, a cor do ctermfg, ctermbg, guifg e guibg são iguais (fg = FackGround, bg = BackGround). E lembre-se que essa cor é igual a cor do background da janela normal do vim. Isso cria a impressão que há uma margem.

De agora em diante, toda vez que você abrir um :help no vim, terma uma “margem” no lado esquerdo da janela. Pra mim pelo menos, parece tornar a leitura mais confortável.

Colocando em uma função (opcional)

Podemos também deixar a configuração padrão do vim ficar como é quando abrimos um :help, e colocar o código que criamos em uma função, e criar uma outra função que desabilita a margem.

A função que habilita:

function! CriaMargem()
 set number
 highlight LineNr ctermfg=235 ctermbg=235 guifg=gray16 guibg=gray16
endfunction

Para criar a função que desabilita a margem, vamos descobrir a as cores que são definidas para LineNr por padrão. Certifique-se de que não tenha chamado a função acima e não tenha aberto um :help usando o nosso truque, senão o comando abaixo não vai mostrar as cores originais. Em todo caso, rode o comando (novamente, no modo de comando):

:hightlight Normal

E coloque as cores que aparecerem aí na função que desabilita a margem (volta as cores padrão para que possamos ver os números):

function! MargemOff()
 highlight LineNr ctermfg=180 ctermbg=242 guifg=#cdaa7d guibg=bg
endfunction

Essas funções também vão dentro do help.vim que criamos. Chame as funções assim no vim:

:call CriaMargem()

e

:call MargemOff()

Pode usar <Tab> para autocompletar.

Note que colocando essas funções no ~/.vim/after/ftplugin/help.vim, elas só estarão disponíveis quando você estiver lendo um :help no vim. Portanto, não adianta esta editando um html, C, ou perl e querer chamar essas funções. Se quiser que elas fiquem disponíveis para outros filetypes, coloque-as no ~/.vimrc.

Supondo que deixamos elas no help.vim, vamos deixar CriaMargem() habilitada por padrão. Para tal, basta chamar a função de dentro do próprio help.vim. Aqui vai o exemplo completo:

" Habilita a simulação de margem.
function! CriaMargem()
 set number
 highlight LineNr ctermfg=235 ctermbg=235 guifg=gray16 guibg=gray16
endfunction
" Mostra set mumber normalmente.
function! MargemOff()
 highlight LineNr ctermfg=180 ctermbg=242 guifg=#cdaa7d guibg=bg
endfunction

” Vamos deixar a função habilitada por padrão.

autocmd BufEnter * call CriaMargem()

Com certeza deve ter como colocar tudo em uma única função, tornando o código mais profissional, mas no momento em que escrevo, é o que deu pra fazer sem perder muito tempo.

Tagged with: , , , ,

Expressões regulares no Vim – Update 1

Posted in Vim by Fernando Basso on 31 de dezembro de 2011

Expressões Regulares no Vim

Boa parte do que está aqui é uma adapatação do :help usr_27.txt (arquivo de ajuda integrada do Vim).

Básico

Início e fim de linha

 :help 03.9 (Simple search patterns)

Use as opções :set incsearch e :set hlsearch para praticar. Para “resetar as cores”, :nohlsearch. Crie um arquivo com pedaços de texto que torne possível praticar as dicas aqui apresentadas.

O caractere ^ faz correspondência ao início da linha. O caractere $ corresponde ao fim da linha.

Econtra “teste” somente se estiver no final da linha:

 /teste$

Encontra teste somente se estiver no início da linha;

 /^teste

Encontra “teste” somente se ele for a única coisa da linha. Não pode haver espaços nem antes e nem depois de “teste”:

 /^teste$

Qualquer caractere uma vez

O . (ponto) corresponde a qualquer caractere – uma vez.

Corresponde a “abc”, “azc”, “aYz”, “a b”, “a-b”, etc:

 /a.b

Escapar caracteres especiais

Se queremos encontrar literalmente um ponto, devemos escapar o ponto, pois no vim ele é um caractere especial.

Se fizer somente

 /.

vai corresponder a todos os caracteres, até mesmo espaços em branco. Para encontrar somente o ponto literalmente:

    /\.

Escapando o . ele se torna um reles mortal e perde todos os seus superpoderes de caractere especial.

RegExp nível intermediário

:help usr_27.txt

Ignorando maiúsculas e minúsculas

Por padrão, o vim é sensível à caixa da letra. Portanto, “else”, “ELSE”, Else” são palavras diferentes. Para que o vim ignore a caixa da letra (case):

 :set ignorecase

Agora, tanto faz procurar por “else”, “ELSE”, ou “Else”, pois o vim vai tentar encontrar a palavra não importa quais letras nes estejam maiúsculas ou minúsculas.

Para voltar a se importar com o case da letra:

 :set noignorecase

Há também a opção smartcase, que é “ignorecase” por padrão, mas se você realizar a procura com pelo menos uma letra maiúscula o vim detecta e passa a ser sensível ao case automaticamente.

 :set ignorecase smartcase

Para fazer procura sensível à caixa em uma pesquisa apenas, usamos \C (maiúsculo):

 /\Cteste
 /\CTeste

O primeiro só combina com “teste”, todas minúsculas. O segundo só combina com “Teste” com o primeiro “T” maiúsculo.

Para tornar a pesquisa insensível ao case use \c (minúsculo):

 /\cteste

Encontra “teste”, “TESTE”, “teSTE”, etc.

A vantagem de usar \c e \C é que eles ficam no histórico junto com o ‘pattern’ da pesquisa.

NOTA: O uso de \ depende da opção magic. :help ‘magic’.

Offsets de linhas

Quando fazemos uma busca, o cursor para na linha da busca. Se queremos parar duas linhas após o elemento procurado:

 /teste/2

Offset de caracteres

Parar o cursor no último caractere do elemento procurado (e = end):

 /teste/e 

Coloca o cursor 3 caracteres após o último caractere do elemento procurado:

    /teste/e+3

Coloca o cursor no penúltimo caractere do elemento procurado:

 /teste/e-1

Coloca o cursor na segunda no terceiro caractere do elemento buscado (b = beggin):

 /teste/b+2

É b+2 por que b já é o primeiro caractere, então + 2 dá 3.

Estes offsets serão mais úteis quando estudarmos o conteúdo do :help pattern.txt.

1 Vim Básico

Posted in Vim by Fernando Basso on 8 de setembro de 2009

Vi Improved para aqueles que já ouviram falar mas não tiveram um motivo para dar os primeiros passos, ou para aqueles que já tentaram abrir o vim mas não souberam nem por onde começar, e acabaram clicando no x e fecharam o terminal. Vai ser bem prático em com dicas de coisas úteis que usamos no dia-a-dia.

Instalando

Geralmente o que vem instalado nas distribuições GNU/Linux é o bom e velho vi, ou então uma versão do vim mais compacta, sem as funcionalidades como syntax colorida. Basta um aptitude install vim (debian e derivados), emerge vim (gentoo), pacman -S vim (archlinux), etc…

Iniciando – Criando Um Novo Arquivo.

Abra um terminal de digite: vim <Enter>. Pronto! O arquivo está criado e você já está usando o vim. :)

Modos de Operação

O vim tem três modos:
1. Modo de comando;
2. Modo de inserção;
3. Modo visual.

Quando você abre o vim, está está em modo de comando. Neste modo, as teclas não são usadas para inserir texto. Pressione i para entrar no modo insert e então poderá inserir o seu conteúdo.
Para salvar o seu arquivo você deve voltar para o modo de comando digitando <Esc> ouCtrl + [. Agora digite :w teste.txt <Enter>. Isto vai salvar o seu arquivo como nome teste.txt no diretório atual. Finalmente pressione :q <Enter> para sair do vim.

Passo a Passo


1. Abra o terminal
2. Digite vim <Enter>
3. Pressione i para entrar no modo insert
4. Digite Estou aprendendo VIM.
Vim é muito poderoso.
Nada ver discutir Vim vs Emacs.
Cada um usa o que gosta.
Eu gosto do Vim.

5. <Esc> ou ctrl + [ para voltar ao modo de comando
6. Digite :w teste.txt <Enter>
7. :q <Enter> para sair.

OBS: Daqui em diante, não vou mais falar quando pressionar o enter. Você sabe quando é necessário dar um <Enter> ou não.

Abrindo Um Arquivo Já Existente

Vamos abrir o mesmo arquivo que acabamos de criar. Digite vim teste.txt . (Não esqueça de completar com tab). Agora use as teclas L H para movimentar o cursor para a esquerda e direita, e J K para movimentar o cursor para baixo e para cima. Pratique um pouco. Isto é feito em modo de comando.

Vá para o início do arquivo, pressione i, digite o seu nome, volte para o modo de comando. Como o seu arquivo já existia e já tinha um nome, o processo de salvar é mais simples. Você precisa apenas digitar :w e depois :q. Ou então, mais fácil ainda, simplesmente digite :wq em um único comando.

Passo a Passo 2


1. vim teste.txt
2. Movimente-se pelo arquivo usndo H L J K
3. Pressione i
4. Digite seu nome
5. Volte para o modo de comando.
6. :wq

Conclusão

Isto foi só um início muito básico. Prometo que nos próximos posts teremos coisas mais interessantes do que apenas abir e salvar um arquivo. Não fique chateado como fato ter que ficar mudando o modo de operação (comando, insert). Isto é natural do vim, e logo você vai ver o poder que isto lhe traz na questão de se movimentar pelo arquivo, como também para manipular o seu conteúdo.

May the force be with you. Always.