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




acidentes comando rm – trash-cli

Posted in Bash, Dicas by Fernando Basso on 7 de janeiro de 2012

Fiz esse arquivo no vim. Quem quiser pode baixar a versão que converti com o :TOhtml.
rm_accidents.smr
NOTA: O wordpress não me permitiu fazer upload do arquivo html, nem zip, então eu renomeei ele para .pdf para poder fazer o upload. Baixe o arquivo e renomeie a extensão para .html novamente antes de tentar abrir o arquivo.

=============================
= Rm - Previnindo Acidentes =
=============================


= Tópicos =
-----------
  - Comando rm não tem trash
  - Solução nº 1 - interactive mode
  - Solução nº 2 - um alias para o interactive mode
  - Solução nº 3 - trash-cli - lixeira na linha de comando

== Comando rm não tem trash ==
------------------------------

Cuidado!!! No terminal, na linha de comando, quando se digita
    rm segredo_mundial.txt
o segredo_mundial.txt já era. Não tem mais o que fazer.

===============================================================================

== Solução nº 1 - interactive mode ==
-------------------------------------

Sempre use a opção "-i", ou "--interactive" com o comando "rm" e torne isso
um hábito. Essa opção se prontifica a nos perguntar se realmente desejamos
deletar o arquivo.
    rm -i segredo_mundial.txt
    rm --interactive segredo_mundial.txt

CUIDADO com a flag "-f" ou "--force". Com ela, as opções "-" ou
"--interactive" se tornam inúteis, ou seja, eles são completamente
igonorados. 

Há um truque que pode ser aplicado. Digamos que temos um diretório
contendo arquivos muito importantes. Podemos criar um arquivo chamado "-i"
dentro desse diretório. Como o arquivo contém "-" no nome, não podemos
simplesmente fazer "touch -i", pois o comando "touch" vai pensar que estamos
passando a opção "-i" como argumento, e o comando "touch" nem tem uma opção
chamada "-i". As duas possíveis maneiras de criar o tal arquivo estão
exemplificadas abaixo:
    touch -- -i
ou
    touch ./-i


A partir de agora, se você fizer
    rm -Rf *
o shell vai expandir o "-i" na linha de comando, de tal forma que seu
comando na verdade se transforma em
    rm -Rf -i

Note que isso só funciona se você usar o "glob" (*). Se tentar deletar um
arquivo por vez, o arquivo "-i" não vai te ajudar. Vamos aprender outro
truque quando falarmos do programa "trash-cli".

Se quiser remover o arquivo "-i", não basta fazer rm -i porque o rm tem de
fato a opção "-i". Então "rm -i" é o comando "rm", seguido da opção "-i",
mas ainda falta dizer ao "rm" qual arquivo ou arquivos deletar, por que ele
não sabe que "-i" é um arquivo e não uma opção. Usamos uma técnica similar a
que usamos para criar o arquivo. As duas soluções possíveis são:
    rm -- -i
ou
    rm ./-i


===============================================================================
== Solução nº 2 - um alias para o interactive mode {{{
------------------------------------------------------

A solução número dois consiste em colocar o que apprendemos acima em um
"alias" (um "apelido", em Inglês). Vamos criar um alias que faz com que o
comando "rm" sempre seja executado com "rm --interactive".
    alias rm='rm --interactive'

Digite o comando acima em um terminal e tente remover um arquivo (não teste
com nada que seja importante). Para testar, rode apenas "rm arquivo.txt" e
você vai notar que ele pergunta se temos mesmo certeza de que queremos
deletar o arquivo em questão.

Se você gostou da ideia coloque o comando que cria o alias no ~/.bashrc.
Para que o alias entre em vigor, feche e abra o terminal novamente ou rode
o comando:
    source ~/.bashrc

A partir de agora, toda vez que você digitar "rm", o bash interpreta o alias
e na verdade vai executar "rm --interactive". 

===============================================================================
== Solução nº 3 - trash-cli - lixeira na linha de comando ==
------------------------------------------------------------

Instale o programa "trash-cli". Enquanto escrevo este documento, "trash-cli"
está disponível pelo AUR para o Arch Linux, mas pesquisas pela web fazem
acreditar de que já está nos repositórios oficiais de muitas distribuições.

O programa "trash-cli" vem com três comandos principais:
    1. trash-empty - esvazia a lixeira;
    2. trash-list - lista os arquivos da lixeira;
    3. trash-put - manda arquivos para a lixeira.

Para mais informações leia o help de cada uma das variações do trash-cli.

    trash-empty --help
    trash-list --help
    trash-put --help


O problema agora é criar o hábito de usar o "trash-cli" em vez do bom e
velho "rm". Sim, porque nós instalamos o programa, mas por força do hábito é
bem provável que continuemos usando o "rm" sem nem notar.

Vamos então usar um truque para, digamos, desabilitar o comando "rm". O
truque consiste em, novamente, criar um alias. Mas antes disso vamos falar
de comentários no bash (com poucos ajustes todas essas dicas funcionam em
ourtos SHELLs).

Um comentário no bash inicia com #. Rode o seguinte comando direto do
terminal:
    # echo 'Hello, world.'
Essa linha não vai executar nada. É um comentário apenas.
Tente esta outra:
    echo 'Hello, ' # world'.
O echo acima só vai mostrar "Hello, ". O resto da linha é comentário.


Então, a ideia é criar um alias que comente o "rm". É fácil:
    
    alias rm='# rm'

Pode colocar o alias no ~/.bashrc e rodar "source ~/.bashrc". A partir de
agora, toda vez que você digitar "rm", ele simplesmente nem sequer será
executado, pois agora ele foi "comentado". No então, há alguns pontos a
serem considerados:

   1. Se você executar outro SHELL a partir do shell que contém o alias, o
      outro shell não vai herdar o alias, portanto, "rm" desse outro shell
      vai funcionar normalmente.

   2. IMPORTANTE: você executou essas operações no terminal como usuário, e
      configurou o ~/.bashrc em nível de usuário. A conta do ROOT continua
      com as configurações default. Como o ROOT é um usuário ainda mais
      crítico no sistema, considere colocar essas configurações no
      /root/.bashrc.

================================================================================

Bash – comandos, argumentos e a importância das apas

Posted in 5584, Linux by Fernando Basso on 4 de janeiro de 2012

Intro

Interactive mode: modo de operação onde um prompt de comando espera que você digite um comando por vez.

Script: um arquivo que contém uma sequência de comandos para serem executados um após o outro.

Ao iniciar o Bash, bash –posix ou set -o posix se o Bash já está em execução coloca o Bash em modo POSIX.

No Arch Linux (e quase todas as outras distribuições), /bin/sh é um symlink para /bin/bash. Se o Bash é invocado com o nome “sh”, ele tenta imitar o comportamento de versões históricas do sh o melhor possível, enquanto conformando com o padrão POSIX. Neste modo, o Bash lê os arquivos de inicialização e então entra em modo de compatibilidade com o padrão POSIX.

/etc/profile é lido por todos todo Bourne-compatible shell no login. Ele configura o ambiente e carrega configurações específicas a certas applicações (/etc/profile.d/*.sh).

.profile é lido pelo Bash quando um shell com login interativo é iniciado.

.bashrc é lido pelo Bash quando um interativo non-login shell é iniciado, por exemplo, quando alguém abre um console virtual (x terminal) a partir de um Window Manager ou Desktop Environmen (Openbox, LXDE, Gnome, KDE, etc.). Este arquivo é útil para configurar o ambiente de shell específico do usuário.

Leia mais: https://wiki.archlinux.org/index.php/Bash

Comandos e Argumentos

 O Bash lê linhas do terminal (usuário digitando comandos) ou de arquivos. Cada linha é uma comando – uma tarefa para ser executada.

 IMPRTANTE: O Bash divide cada linha em palavras. Palavras são separadas por espaços.

 A primeira palavra em uma linha/comando é o nome do comando. Todas as outras (palavras) são os argumentos que são passados para o comando especificado.

 echo This is a test echo → é o nome do comando;

this → é um argumento.

is → outro argumento.

a → mais outro argumento.

test → ainda mais um argumento – e o último, no exemplo.

 MAS:

echo"This is a test"

echo → é o nome do comando.

“This is a test” → é um único argumento.

 As aspas não são parte do argumento. O Bash as remove antes de lidar com o argumento.

 CUIDADO: Digamos que temos dois arquivos em um diretório. Os arquivos são:

“The secret voice in your head.ogg”

“secret”

 “secret” contém um segredo muito importante que pode salvar o mundo.

E agora você faz:

 rm The secret voice in your head.ogg

 O Bash vai pensar que você passou seis argumentos, e um deles é “secret” – seu venerado arquivo. Você recebeu erros porque o comando rm não conseguiu remover/encontrar os arquivos “The”, “voice”, “in”, “your”, e “head.ogg” (já que eles não são arquivos por si próprios), exceto “secret”, é que sim um arquivo. É por isso quo Bash reclamou dos outros mas não reclamou de “secret”. Agora o pior: o arquivo chamado “secret” já era. Para sempre se foi (não tem lixeira na linha de comando), e a música (que é o que queríamos deletar) ainda está lá. A maneira correta é usar apas:

 rm “The secret voice in you head.ogg”

Assim, você está agrupando todas as palavras em um único argumento. Descanse em paz. O “segredo” está seguro agora.

 Veja este próximo caso.

 [ é um comando, similar ao comando test. Se testarmos alguma coisa assim:

 [-f file.txt]

 …está errado. -f não deve estar “colado” ao [. Devemos separá-los. [ é o nome do comando, portanto uma palavra. -f é a segunda palavra (um argumento), file é a terceira palavra (outro artumento) e o ] é o ultimo argumento – que é mandatório toda vez que usamos [. Esta é a maneira correta (note os espaços):

 [ -f file.txt ]

 A propósito, uma maneira mais aconselhável ainda é colocar o nome do arquivo entre aspas (você já viu o que pode acontecer se um nome de arquivo contém espaços, e não o protejemos com aspas).

 [ -f “my file” ]

É boa prática sempre usar apas.

 Uma dica rápida: use o perl-rename para mudar todos os espaços nos nomes dos arquivos por underscores:

 perl-rename ‘s/ /_/’ ./*.txt

 …para arquivos .txt (mude a extensão para outros tipos de arquivos), ou

 perl-rename ‘s/ /_/’ ./*

 …para todos os arquivos do diretório.

 NOTA: No Arch Linux, no nome é perl-rename. prename em outras distros – não confunda com rename, que é um comando bem simplificado e não faz o que o exemplo mostra. (Se não me engano já vi uma distro em que rename era na verdade o um symlink para o perl-rename).

Este conteúdo é basicamente um tradução livre do (excelente) site:

http://mywiki.wooledge.org/BashGuide

Este conteúdo não é, de forma alguma, mérito meu, mas sim dos proprietários do site acima mencionado.

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: , , , ,