freak’s blog

Meme do histórico - versão 2008

Enviado em Linux by Henrique C. Alves em Julho 8th, 2008

Há quase exatamente um ano atrás rolou esse meme. Meme que é meme não pode morrer, então vamos repetir ele de novo ;)

Quais os comandos que você mais utiliza no seu shell? Esse ‘comadim’ dá a resposta:

history|awk '{print $2}'|awk 'BEGIN {FS="|"} {print $1}'|sort|uniq -c|sort -rn|head -10

O resultado aqui foi
212 cd
143 vi
83 rm
59 startx
47 ls
44 su
43 ncmpc
38 chmod
36 cp
21 man

Deu pra ver que eu uso muito shell, pela quantidade de cd, cp, rm, ls, e também não uso um login manager (por isso o startx). E o grande vim, claro :)

Pimp My Vim

Enviado em Dica, Linux by Henrique C. Alves em Julho 5th, 2008
Vim Pimpado
Vim Pimpado

Vim (Vi Improved). Esse editor de textos de aparência singela, amor de uns e desafeto de outros, talvez seja o editor de textos com mais tradição nas costas que existe. Além de rodar nos Unices tradicionais onde nasceu na encarnação original (Vi, proprietário) e em outros remakes (nVi), roda naturalmente no Linux, *BSD, Windows, Mac, e basicamente qualquer coisa capaz de rodar um terminal e uma camada de POSIX. Muita gente hoje em dia tem contato com o Vi/Vim no Linux apenas para editar arquivos de configuração, e sabe apenas 3 comandos: ‘:w’, ‘:q’ e ‘:wq’ ou ‘:x’ - suficientes para salvar, sair, e ambos. E claro, tecla I ou Insert para alterar para o modo de inserção.

O Vim é um editor que, por ter raízes muito antigas e muita tradição, tem uma interface completamente diferente do que a geração “janelas” está acostumada (que adivinha só, você nem sabia o nome, mas é uma convenção da IBM chamada CUA). Por isso muita gente se frustra quando não consegue sequer sair do programa, e acaba apelando pra um $ killall vim no terminal do lado.

Mas não se engane. Por trás da interface espartana e a curva de aprendizado quase vertical, Vim (hoje na versão 7) é um editor muito poderoso. Se você achava o gedit, o seu Eclipse cheio de plugins, ou aquele Texmate todo emo o máximo… sinto te informar, mas analisados sob a sombra do Vim, não passam de editores xexelentos que vão te causar LER um dia desses (só o Emacs está a par do Vim. Mas eu não suporto aqueles arquivos de configuração em LISP…).

Um dos maiores poderes do Vim, na minha opinião, é a sua “configurabilidade”. Ele possui um interpretador de comandos próprio que te permite mexer nas entranhas do editor e personalizar/automatizar suas funcionalidades para basicamente qualquer tarefa que você precise. Seja programar, escrever livros, revisar documentos, fazer pornografia em ASCII… O Vim te permite colocar várias tarefas a uma tecla de atalho de distância.

É claro que todo esse poder tem um preço: a curva de aprendizado.

Curvas de Aprendizado

Deixando o humor geek de lado… são vários comandos e truques para se aprender. Mas após aprender alguns, você já percebe o salto de produtividade, o que é muito gratificante. Então, se você edita muito texto ou programa, e ainda não usa o Vim, eu recomendo que invista um tempo para aprender a usá-lo (e o mais divertido, configurá-lo ao seu gosto). Você pode acabar economizando muito tempo (e articulações) no médio/longo prazo.

Vou compartilhar aqui o meu .vimrc - cuidado, isso vale ouro :)

Para quem já usa o Vim, e para quem ainda não usa, já serve como aperitivo para ver o que ele é capaz de fazer e como escrever o seu próprio vimrc. Todos os comandos que se vê no vimrc podem ser consultados de dentro do Vim através do comando :help comando

Isso acho que mostra o estrago que o .vimrc consegue fazer. E claro, não esqueça dos esquemas de cores… pessoalmente, eu gosto muito do Gardener, mas há vários outros no Vim.org, e fazer o seu próprio também é bem simples.

Vale a pena também conhecer o gVim e o Cream, que são versões que utilizam em menor ou maior escala elementos GUI como menus e diálogos para tornar o uso do Vim mais intuitivo - mas para total efeito do medicamento, recomendo usar diretamente no terminal ;)

Onde aprender mais sobre o Vim:

Além do site oficial Vim.org, que tem uma coleção monstruosa de scripts e dicas.

Arrivederte!

PS: Porque no Planeta Archlinux o título do post linka para o próprio planeta? H. Doria, dá um help aí!!! :)

Interessantices

Enviado em Linux, Programação by Henrique C. Alves em Abril 17th, 2008

Depois de longo tempo sem postar, eis que eu lembro que tenho um blog novamente. ;) É que na verdade o plano era mudar o blog para outro servidor (junto do meu portfolio e um csv pra que eu possa subir alguns códigos interessantes), mas ainda não tive tempo.

No entanto, hoje eu tenho algo interessante pra postar, então lá vai. Eu costumo frequentar o fórum internacional do Arch, e nesse tópico um usuário deu uma idéia interessante: como seria possível copiar um arquivo entre TERMINAIS. Ou seja, você tem 2 terminais abertos (ou mais), e quer copiar um arquivo de um terminal para o diretório que está sendo usado no outro. Obviamente, você usaria algo como:

$ cp arquivo o-caminho-completo-de-onde-está-o outro-terminal

Mas isso é chato. Então eu pensei, que bom seria se eu pudesse simplesmente fazer:

$ cp arquivo /dev/pts/1

E a cópia iria para o diretorio em que o pts/1 está trabalhando. Bem, o comando cp não sabe funcionar assim. Mas ele também não sabe que eu fui treinado pelo MacGyver. Então, vejamos como implementar esse recurso usando minha linguagem preferida, Ruby (não confundir com Rails, POR FAVOR!):

#!/usr/bin/ruby

if (ARGV.empty?) || (ARGV[0] == "-h") || (ARGV.size < 2)
  STDERR.puts <<EOS
Usage: #{$0} [-h] FILE TARGET

If TARGET is a terminal device (under /dev/), the copy operation will occur
to the terminal's current working dir. Otherwise, will behave like as a path.

EOS
  exit 1
end

file   = ARGV[0].to_s.strip
target = ARGV[1].to_s.strip

if File.directory? target
  path = target
else
  unless (pts = target.split("/dev/")[1])
    STDERR.puts "Invalid target: #{target}"
    exit 1
  end
  if (pid = `pgrep -n -t #{pts}`).empty?
    STDERR.puts "Cannot determine pwd of device: #{pts}"
    exit 1
  end
  path = `pwdx #{pid}`.split(": ")[1].strip
  unless File.directory? path
    STDERR.puts path
    exit 1
  end
end

`cp #{file} #{path}`

Esse script irá permitir copiar um arquivo apontando como alvo um terminal ao invés de um caminho, e vai se encarregar de encontrar o diretório atualmente usado. Se o terminal tem mais de uma shell aninhada (ou seja, se você abriu o terminal, e está rodando mais um shell dentro), ele irá usar o diretório do último shell chamado. Se ao invés de apontar um terminal, apontar um caminho, ele irá se comportar igual ao cp comum.

Minha sugestão de uso é copiar para /usr/local/bin/cpt e criar um alias no .bashrc:

alias cp='/usr/local/bin/cpt'

Outra sugestão também é colocar no .bashrc:

if [ "$DISPLAY" ]; then
echo -n -e “\e]0;`tty`\a”
fi

Com isso, todos os terminais terão como título o seu pts, assim fica fácil ver qual janela ou aba de terminal você quer destinar a cópia (só vai executar se for uma janela de terminal no Xorg, não no terminal em modo texto).

Por fim, você irá usar o comando, por exemplo:

$ cp arquivinho.txt /dev/pts/2

E bingo, seu arquivo vai estar disponível no seu outro terminal aberto, sem ter que quebrar a cabeça pra achar o caminho completo. Pra quem usa vários terminais abertos (eu), ou usa tilling window managers (xmonad, awesome), fica bem mais prático trabalhar.

Atenção: não sei como o script se comporta em shells não-Bash (zsh, csh), apesar de que no dash deve funcionar corretamente.

Apesar de nada ortodoxo (afinal, pela lógica do UNIX, copiar um arquivo para um device não faz sentido), o recurso é prático. Boa diversão!