Jedi Tux

18 de outubro de 2012

OpenSource-WebDevDesign – Canal na Freenode

Arquivado em: Sem categoria — Fernando Basso @ 22:55
Tags: , , , , , ,

Canal IRC para Desenvolvedores e Designers Web – Gimp, Inkscape, HTML/CSS/JavaScript e outros.

O objetivo desse canal é ser um ponto de troca de experiências e conhecimento para web designers e web developers, focando software livre, como gimp, inkscape, e linguagens de programação voltadas ao tema. Uma das políticas é que nada relacionado a TI é off-topic.
Busco parceiros e a ajuda outros sites relacionados aos assuntos propostos acima para colaborarem e ajudarem no canal. Não tenho intenção de ser o “dono” do canal. Não há necessidade de um “moderador”, já que praticamente não há off-topic. O que é necessário é bom senso e respeito a opinião e ao conhecimento dos demais, seja ele extenso ou limitado.

/join #Opensource-WebdevDesign

28 de setembro de 2012

Atualização do PostgreSQL para 9.2 – Arch Linux

Arquivado em: Dicas,Servers — Fernando Basso @ 12:54
Tags: , , , ,

----------------------------------------------------
bash-4.2, vaio@nando, Fri Sep 28 07:37:53 
$PWD="~/"  
$ sudo rc.d start postgresql 
[sudo] password for nando: 
:: Starting PostgreSQL

[BUSY] pg_ctl: could not start server
               Examine the lot output

    vim /var/log/postgresql.log

FATAL:   database files are incompatible with server 6009
DETAIL:  The data directory was initialized by PostgreSQL version 9.1, which
is not compatible with this version 9.2.1.

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

http://www.postgresql.org/docs/current/static/upgrading.html

NOTA: É possível fazer isso com a versão 9.2, mas como no meu caso eu nem consegui
inicializar o postgresql com ela, fiz com a 9.1 mesmo.

    sudo pacman -U /var/cache/pacman/pkg/postgresql-9.1.4-1-i686.pkg.tar.xz


Primeiro de tudo, salvar o banco de dados atual, com a versão 9.1 do postgresql
rodando:

    pg_dumpall > postgresql_backup_completo.sql

Mas aí teve algo errado, pois ele ficava peding a senha do usuário linha após
linha, e com
    pg_dumpall -U postgres ...

aconteceu a mesma coisa.

vim ~/.pgpass
localhost:5432:db_nando:nando:1234

Mas pra fazer o backup de tudo, temos que deixar o campo que especifica
a database com "*":
localhost:5432:*:nando:1234

http://www.postgresql.org/docs/9.2/static/libpq-pgpass.html

On Unix systems, the permissions on .pgpass must disallow any access to world
or group; achieve this by the command chmod 0600 ~/.pgpass. If the permissions
are less strict than this, the file will be ignored. On Microsoft Windows,
it is assumed that the file is stored in a directory that is secure, so no
special permissions check is made.


(08:29)  gciolli: Should ~/.pgpass allow my to just type psql and connect 
                     without any further iteration?
(08:31)  FernandoBasso: .pgpass only takes care of not having to type the 
                     password, all the other options are handled via environment 
                     variables like PGUSER, etc.

http://www.postgresql.org/docs/9.2/static/libpq-envars.html

Pode ser no bashrc.
export PGUSER=myFavouritePostgresUser
export PGDATABASE=db_nando

Agora já devemos estar podento digitar apenas "psql" pra logar sem
ter que especificar o password nem a database.

--------------------------- // ----------------------- // -----------------

Agora deve funcionar:
    pg_dumpall > postgressql_backup_completo_upgrade_para_9.2

    sudo rc.d stop postgresql (arch linux)

    cd /var/lib/postgres
    mv data bkp_data_9.1

    rc.d start postgresql
    rc.d stopt postgresql

    cp bkp_data_9.1/pg_hba.conf data/
    cp bkp_data_9.1/postgresql.conf data/


    vim data/pg_hba.conf

E seta
    host    all     all    127.0.0.1/32     md5
para
    host    all     all    127.0.0.1/32     trust

por que os passwords e usuários não vão funcionar mais.

    psql -U postgres


Criamos um usuário:

    CREATE ROLE admin WITH LOGIN PASSWORD 'admin' CREATEDB CREATEROLE; 
    ALTER USER admin VALID UNTIL 'infinity';

Colocamos uma senha para o superuser postgres:
    ALTER USER postgres WITH PASSWORD 'serect_passwd';

Recuperar os dados (deu alguns avisos aqui, mas funcionou tudo mesmo assim):

    psql -d postgres -f postgresql_backup_completo.sql

Coloca os 'trust' para 'md5' novamente no arquivo pg_hba.conf.

Reinicia o postgres e já deve estar tudo ok.


For further reading:

https://wiki.archlinux.org/index.php/PostgreSQL#Upgrading_PostgreSQL


http://www.postgresql.org/docs/current/static/upgrading.html

15 de setembro de 2012

Idea – Java IDE + Vim

Arquivado em: Dicas — Fernando Basso @ 21:18
Tags: , , ,

Idea Java IDE e ideaVim

 

Recentemente iniciei meus estudos de Java, e realmente, por mais que eu prefira o Vim para tudo, é tortura querer programar Java nele, pois tem toda aquela história de packages, classes, access modifiers, imports, e tudo mais, e uma IDE especial para Java é muito mais prática do que o meu querido Vim.
Para mim, o problema com as IDEs é o editor, que são horríveis. Qualquer conhecedor de Vim (ou Emacs) sabe do que eu estou falando. As IDEs podem ter um milhão de qualidades, mas o editor não é uma delas, pelo menos não nas IDEs das quais eu já tive conhecimento até hoje.

Já tentei plugins para o Eclipse (eclim, vimplugin) e Netbeans (jVi). Ajudam bastante mas não consegui me adaptar a nenhum deles. Lendo na web acabei por encontrar alguém mencionando em um fórum dessa IDE chamada Idea, eu que havia um excelente plugin que oferece mode de edição igual ao Vim para ela. Resolvi testar.

http://www.jetbrains.com/idea/features/index.html

Idea – Instalação

No Arch Linux, basta instalar o pacote, pois está nos repositórios oficiais (pelo visto há uma versão paga também).


sudo pacman -S intellij-idea-community-edition

É lógico que você precisa ter o JDK e JRE instalado. Aparentemente, a equipe de desenvolvimento não suporta o OpenJDK oficialmente, mas dizem que funciona normalmente. Eu, particularmente, tenho os pacotes jre e jdk instalados do AUR (wiki, aur).

Apenas para constar, eu gerencio os pacotes provenientes do AUR usando o excelente aurget (todo em bash). Funciona perfeitamente bem para mim.

Depois de instalado, basta rodar, tanto pelo terminal, ou através de algum run-dialog (geralmente Alt+F2) e digitar


idea.sh

É um script que reside em /usr/bin/ e inicia a IDE para nós.
Na momento de criar o primeiro projeto, você será perguntando sobre o caminho do JDK no sistema. Basta executar o seguinte comando para descobrir:


echo $JAVA_HOME

No meu caso, no Arch Linux, bastou colocar /opt/java/ e pronto.

ideaVim

File –> Settings –> Plugins, clique em “Browser repositories” e pesquise por “ideaVim”. Clique com o botão direito em cima do nome do plugin  e escolha “Download and install”. Pode fechar as duas janelas clicando em OK e você verá a informação do download na parte inferior da janela principal da IDE. Apos instalado, basta reiniciar IDE e o plugin já deve vir habilitado por padrão. Em “Tools” você vai ver uma opção para habilitar e desabilitar o plugin.
Uma coisa que gostei bastante é que até Visual-Block Selection funciona, algo que senti falta em outros plugins para outras IDEs. Uso isso muito para comentar pedaços inteiros de código quando necessário. Para quem não sabe, imagine que você quer comentar as primeiras 5 linhas de código, basta se posicionar na primeira coluna (caractere) da primeira linha (no modo normal), pressionar Ctrl-V, 5jI// e então pressionar <Esc>. Para remover faz-se a mesma seleção e digita-se algum comando de deleção, como o “x”, por exemplo.
Outra coisa que gostei é a maneira como a IDE usa uma leve linha pontilhada mostrando o abrir e fechar de blocos, embora ele mostre o qual { é o par que casa com um } e vice-versa destacando-os com uma cor diferente, assim como o Vim já faz por padrão.

Dicas

Ctrl+Shift+a permite que você pesquise por uma opção ou configuração. Tente pesquisar por plugins, por exemplo. Ctrl+Shift+n permite pesquisar e abrir arquivos.

Outra muito legal, é quando, digamos que você está no main() usando um método chamado listFuncionarios(). Com o cursor em cima do nome do método, digitar Ctrl+Alt+b leva você para a classe e local de definição do método. Isso muito útil já que muitas vezes, somente ao utilizarmos um método percebemos falhas e então temos que voltar nele e melhorar o código.

De vez em quando, acesse Help –> Productivity Guide, clique em “Used” de forma a deixar a setinha apontando para baixo, e dê uma olhada nas coisas para ver o que você usa mais, e o que você poderia estar usando mas não está.

Shortcuts são sempre bem vindos:

http://www.jetbrains.com/resharper/webhelp/Reference__Keyboard_Shortcuts.html

http://stackoverflow.com/questions/294167/what-are-the-most-useful-intellij-idea-keyboard-shortcuts
Se alguém quiser dar sugestões e dicas, pode mandar nos comentários (os créditos serão reconhecidos). Quem tiver algum post sobre issa excelente IDE, por favor não deixe de compartilhar também.

20 de maio de 2012

PHP e MySQL funções para conexões e consultas

Arquivado em: PHP — Fernando Basso @ 23:19
Tags: , , , ,

TODO: em alguns pontos eu mencionei que alguma funções retornam um array, sendo que elas retorna um object com os dados da query. Concertar isso.

PHP e MySQL

Introdução

As principais funções para estabelecer uma conexão no banco de dados e selecionar uma database para usada são mysql_connect(), mysql_set_charset() e mysql_select_db();

Nas versões mais novas do MySQL essas (e outras) funções foram melhoradas (Improved) e hoje temos as funções mysqli_connect(), mysqli_set_charset() e mysqli_select_db().

MySQL – Básico

mysql_connect() e mysqli_connect

Essas funções abrem (ou reusam) uma conexão com um servidor MySQL. Os parâmetros mínimos (e os mais úteis) esperados pelo mysql_connect e mysqli_connect são o nome do host onde está o banco de dados mysql, o nome do usuário no banco de dados, e o password desse usuário. Não importa qual das funções você use, esses três parâmetros são os mesmos:

mysql_connect(‘localhost’, ‘admin’, ‘secretPass’);

ou

mysqli_connect(‘localhost’, ‘admin’, ‘secretPass’);

Essas duas funções retornam um identificador de link mysql quando a conexão foi bem sucedida, e FALSE quando houve algum tipo de erro. O identificador de link é usado para referenciar a conexão com o banco de dados toda vez que precisarmos executar uma query. Por esse motivo, sempre atribuímos valor retornado a uma variável para facilitar o seu uso posterior. Veja:

$dblinkid = mysqli_connet(‘localhost’, ‘admin’, ‘secretPass’);

Se a conexão foi bem sucedida, de agora em diante podemos usar a variável $dblinkid em outras funções para realizar queries. Exemplos serão mostrados em momentos oportunos.

mysql_set_charset() vs mysqli_set_charset()

Usadas para estabelecer o encoding da conexão, estas duas funções precisam dos parâmetros identificador de link e charset. O identificador de link nós já conhecemos, no exemplo anterior, colocamos ele na variável $dblinkid. Quanto ao charset, normalmente usamos utf8. O “problema” é que a ordem em que passamos esses argumentos muda. Veja nos exemplos como ficariam esses parâmetros e sua ordem:

mysql_set_charset(‘utf8′, $dblinkid);

ou

mysqli_set_charset($dblinkid, ‘utf8′);

Colocando esses parâmetros na ordem errada resulta um erro parecido com este:

Warning: mysqli_set_charset() expects parameter 1 to be mysqli,

string given in /caminho/para/arquivo.php

ou

Warning: mysql_set_charset() expects parameter 1 to be string,

object given in /caminho/para/arquivo.php

Os parâmetros são os mesmo, mas a ordem não. Lembre-se disso.

mysql_select_db() vs mysqli_select_db()

Funções usadas para especificar o banco de dados dentro de servidor MySQL. Os parâmetros esperados são o identificador de link (viu como ele é importante?) e o nome da database no servidor. Novamente, o que muda é a ordem, embora os parâmetros sejam os mesmos.

mysql_select_db(‘db_articles’, $dblinkid);

ou

mysqli_select_db($dblinkid, ‘db_articles’);

Se nada saiu errado nos três passos vistos até agora, a conexão foi estabelecida. Em todo caso, podemos e devemos verificar por erros para ter certeza, tornando o código mais robusto e confiável. Continue lendo.

 

 Verificando por Erros (mysql)

Em breve (é algo bem simples).

Queries – mysql_query vs mysqli_query

Colocamos uma query mysql em uma variável, por exemplo:

$sql = ‘SELECT id, nome FROM tb_pessoas’;

E usamos uma das funções para executar a query. Mais uma vez o que muda é apenas a ordem dos parâmetros.

mysql_query($sql, $dblinkid);

ou

mysqli_query($dblinkid, $sql);

Essas funções retornam FALSO em caso de erro. Por outro lado, queries bem sucedidas com SELECT (e alguns outros comandos sql) retornam um result object ou result set, que é um array contendo o resultado da query. Por esse motivo, atribuímos esse result object a uma variável para futura manipulação dos dados.

$result_set = mysqli($dblinkid, $sql);

O array retornado pode ser acessado por um punhado de funções, cada uma com sua particularidade, sendo que a escolha de uma vai depender do resultado desejado.

Extraindo dados do result object / result set) (mysql)

As principais funções para recuperar dados de um result set (que contém um array com os dados solicitados na query) são mysqli_fetch_assoc(), mysqli_fetch_row() e mysqli_fetch_array(). Outras duas funções que são úteis em diversas situações são mysqli_num_fields() e mysqli_field_name(). Todas essas funções também estão disponíveis na versão mais antigas – aquelas que não contém o “i” após “mysql” (mysqli).

Esta é a nossa tabela no banco de dados:

Note que temos três colunas, c_id, c_text, e c_author e sete tuplas, linhas ou rows (fileiras).

mysqli_fetch_row()

A função mysqli_fetch_row() espera um result set como parâmetro e retorna uma tupla em forma de array com índices numéricos. No caso da tabela acima, o array retornado teria o índice [0] como a coluna c_id, o índice [1] como c_text, e o índice [2] como c_author. Tenha em mente que se você mudar a ordem das colunas na query SQL, mudará o conteúdo que os [índices] irão acessar. Outro fator importante é que cada chamada subsequente dessa função retorna a próxima tupla/item/row do result set, e NULL quando não há mais tuplas restantes, e por esse motivo podemos usar essa função dentro de loops (já que loops dependem de verdadeiro ou falso decidir se sua execução será encerrado ou deve continuar). Cada vez que a função é chamada, o ponteiro interno é movido para o próximo registro da consulta (query). Essa funcionalidade é útil para que possamos mostrar todas as tuplas de uma determinada tabela. Veja:

/* Enquanto há elementos a serem atribuídos a variaável $minha_tupla,

* retorna o elemento propriamente dito, e um TRUE. */

while ($minha_tupla = mysqli_fetch_row($result_set) {

echo(‘<p>’); print_r($minha_tupla); echo(‘</p>’);

$output = $minha_tupla[1] // [1] é a coluna c_text.

inlcude(‘./output.html.php’);

}

No exemplo acima, cada vez que o while executar, a próxima tupla do result set (que é um array) será retornada e assinada à variável $minha_tupla, e então guardamos o valor do índice [1] (c_text) na variável $output. Essa variável é então mostrada através de um arquivo especial para isso, pois assim evitamos misturar html e php no mesmo código/arquivo. O conteúdo do arquivo output.html.php é simples:

<p><?php echo($output); ?></p>

A linha que contém o print_r() é usada para mostrar a estrutura da tupla. Útil para debugar.

mysqli_fetch_assoc()

Tudo o que falamos sobre mysqli_fetch_row() tambémse aplica para mysqli_fetch_assoc(). A diferença é que em vez de acessarmos os índices do array retornado com um valor numérico, usamos uma string, por que o array retornado é associativo (como o nome da função sugere).

while ($minha_tupla = mysqli_fetch_assoc($result_set) {

$output = $minha_tupla['c_author'];

include(‘./output.html.php’);

}

Note que passamos o exato nome da coluna na tabela mysql como o índice do array $minha_tupla.

mysqli_fetch_array()

Essa função é mais elaborada porque ele pode retornar tanto um array com índice numérico, associativo, ou ambos.

while ($tupla_array = mysqli_fetch_array($result_set, MYSQLI_BOTH)) {

$output = $tupla_array[2];

include(‘./output.html.php’);

$output = $tupla_array['c_text'];

include(‘./output.html.php’);

}

Veja um simples resumo dos três tipos.

/* Índice numérico. */

while ($tuple = mysqli_fetch_row($result_object)) {

$output = $tuple[1];

}

/* Índice associativo. */

while ($tuple = mysqli_fetch_assoc($result_object)) {

$output = $tuple['c_author'];

}

/* Índice ou numérico, ou associativo, ou ambos. */

while ($tuple = mysqli_fetch_array($result_object, MYSQLI_BOTH)) {

// MYSQLI_NUM

// MYSQLI_ASSOC

$output1 = $tuple[1];

$output2 = $tuple['c_author'];

}

Se encontrar um erro, quiser fazer uma sugestão, o seja lá o que for, pode postar nos comentários.

11 de janeiro de 2012

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

======================================
= 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

7 de janeiro de 2012

acidentes comando rm – trash-cli

Arquivado em: Bash,Dicas — Fernando Basso @ 21:27

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.

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

4 de janeiro de 2012

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

Arquivado em: 5584,Linux — Fernando Basso @ 10:52
Tags: , , , , , ,

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.

1 de janeiro de 2012

Simular margem no vim para ler o :help

Arquivado em: Bash,Dicas,Linux,Vim — Fernando Basso @ 20:56
Tags: , , , ,

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.

31 de dezembro de 2011

Expressões regulares no Vim – Update 1

Arquivado em: Vim — Fernando Basso @ 12:24
Tags: , , , , , ,

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.

27 de dezembro de 2011

Xdefaults VS Escape Sequences, Bash – Cores do Prompt

Arquivado em: Bash,Dicas,Linux — Fernando Basso @ 21:44

Leia todo o texto antes de tentar configurar algo. Algumas coisas que você ler mais no início do texto fará sentido quando se juntar com conceitos explicados mais adiante.

A intenção deste post não é mostrar TUDO sobre configuração do prompt do bash propriamente dito, mas sim mostrar a relação que tem as cores do terminal/prompt com as sequências de escape que usamos para configurar o prompt, pois sem essa noção, ficamos tentando configurar as cores “às cegas”. Esse tutorial funciona para o xterm, mas os conceitos são os mesmos para configurar outros emuladores de terminal.

Quando queremos configurar o prompt do Bash, usamos sequências de escape como:

    '\033[31m'
    

Faça um teste:

    echo -e "\033[31m Hello, World."

\033[ significa que estamos iniciando uma sequência de caracteres que não serão imprimidos, ou seja, inicia a sequência de escape. O próximo número (31, no exemplo) indica a cor que queremos imprimir, seguido de "m", que termina a sequência de escape. O que vem em seguida é o texto que queremos realmente mostrar.

A parte numérica que determina a cor do texto pode indicar que queremos o texto em negrito, para isso, a sintaxe fica assim:

    echo -e '\033[31;1m Hello, World." # Note o ";1".

Ou seja, aquele 31;1, onde 31 é a cor, e 1 habilita o negrito. O número que especifica a cor e o número que habilita o negrito devem estar separados por ponto e vírgula (;). Mas agora vem a questão: 31 é qual cor? Aí é que entra o arquivo ~/.Xdefaults ou ~/.Xresourses.

No ~/.Xdefaults temos entradas como as do exemplo abaixo:


    ! Black, \033[30m
    XTerm*color0: #000000
    ! DarkGrey, \033[30;1m
    XTerm*color8: #BABDB6

    ! DarkRed, \033[31m
    XTerm*color1: #FF6565
    ! Red, \033[31;1m
    XTerm*color9: #FF8D8D

No ~/.Xdefaults usamos cores que vão de color0 até color15. As cores do color0 a color7 são cores normais, e de color8 até color15 são as cores em negrito, ou brilhosas.

Aqui temos um conceito importante. Note nos comentários (linhas iniciadas com !). Por exemplo, *color0 é a cor que será usada na sequência de escape \33[30m (cor normal), e a color8 será usada com a sequência \33[30;1m, ou seja, a cor em negrito. Continuando, color1 é usada pela sequência \33[31m (cor normal) e color9 é usada pela sequência \33[31;1m, a cor em negrito, e assim sucessivamente, até a color7 para cores normais, e color15 para os negritos.

Agora, configure as cores do xterm no ~/.Xdefaults da maneira que quiser, ou simplesmente copie as minhas (que pode modificar depois):

! ***** My Xterm Colors ***** ! {{{
! 1 to 7 are normal colors. 8 to 15 are the bright/bold ones.
XTerm*foreground: yellow
XTerm*background: #242424

! Black, \033[30m
XTerm*color0: #000000
! DarkGrey, \033[30;1m
XTerm*color8: #BABDB6

! DarkRed, \033[31m
XTerm*color1: #FF6565
! Red, \033[31;1m
XTerm*color9: #FF8D8D

! DarkGreen, \033[32m
XTerm*color2: green3
! Green, \033[32;1m
XTerm*color10: #C8E7A8

! DarkYellow, \033[33m
XTerm*color3: #EAB93D
! Yellow, \033[33;1m
XTerm*color11: #FFC123

! DarkBlue, \033[34m
XTerm*color4: #204A87
! Blue, \033[34;1m
XTerm*color12: #3465A4

! DarkMagenta, \033[35m
XTerm*color5: #CE5C00
! Magenta, \033[35;1m
XTerm*color13: #F57900

! DarkCyan, \033[36m
XTerm*color6: #89B6E2
! Cyan, \033[36;1m
XTerm*color14: #46A4FF

! LightGrey, \033[37m
XTerm*color7: #CCCCCC
! White, 0\33[37;1m
XTerm*color: #FFFFFF

! }}} Xterm ends here.

Para que as configurações entrem em vigor, execute o comando:

    xrdb ~/.Xdefaults

Feche e abra o terminal novamente. Lembre-se que isso funciona para o xterm. Não adianta usar o gnome-terminal (do gnome) ou o konsole (do kde). Agora sim estamos preparados para brincar com o prompt.

O prompt do bash é definido pela variável PS1 (tem a PS2 também, entre outras, que é usada quando continuamos um comando na próxima linha).

Vamos fazer uma configuração básica do prompt. Não precisa editar arquivo nenhum por enquanto, pois vamos fazer direto pelos comandos. Antes, porém, dê uma olhada nesta lista:

    \$ # Mostra o prompt de usuário '$', ou root '#'.
    \u # Mostra o username.
    \h # Mostra o hostname.
    \t # Mostra a hora (time).
    \d # Mostra a data (date).

Tem outros. man bash, na seção PROMPTING tem mais informações.

Digite o próximo comando, e veja como fica o prompt (não se preocupe, poi s essas alterações não são definitivas).

    PS1='\$ '

Agora tente este:

     PS1='\033[31m \$ '

Mais um:

    PS1='\033[31m\h@\u, \033[33m \s-v \033[0m\$'

Notou a diferença das cores? Vamos tentar com negrito (lembre-se, depende de como as cores foram configuradas no ~/.Xdefaults):

    PS1='\033[31;1m\h@\u, \033[33;1m \s-v, \033[0m\$ '

IMPORTANTE: Quando usamos uma cor, ela fica em vigor até sobrescrevermos ela usando outra. No final, temos que fazer a cor voltar ao modo padrão/default. Para isso usamos a sequência de escape:

    \033[0m

Aqui está uma configuração da minha variável PS1, juntamente com mais duas linhas, pois a minha PS1 depende dessas duas outras linhas:

    shopt -s checkwinsize # For hr='=='stuff to work.
    hr='============================================================================================================================================================='
    PS1='${hr::COLUMNS}\r\n\[\e[1;32m\]\s-\v, \[\e[0;32m\]\h@\u, \d \t \n\$PWD=\[\e[1;36m\]"\w" \[\e[1;37m\] \n\$ \[\e[1;37m\]'

Quem quiser tirar umas ideais, aqui estão minhas config filesno github.http://snipt.net/FernandoBasso/my-bashrc-dec-26-2011

Como eu disse no início, a intenção é mostrar a relação Xdefaults vs Escape Sequences. Tem vários tutoriais na web que tratam exclusivamente do prompt do bash. No entanto, nunca vi nenhum documento ou tutorial mencionar essa relação. Sem saber disso, ficamos configurando cores às cegas…

Descobri essa questão da relação Xdefaults/Escape Sequences perguntando no fórum do arch (em inglês), depois de levar as tradicionais broncas “vai ler no wiki”, ou “RTFM”. Ou seja, o pessoal adora assumir que os ‘aprendizes’ não gostam de ler e querem respostas prontas. PS: eu tinha lido metade da web tentando aprender mais sobre isso, e no wiki do arch também não menciona isso. :)

May the force be with you. Always.

Próxima Página »

Tema: Rubric. Blog no WordPress.com.

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.