Como consultar a documentação do PHP direto do Vim
10 de Janeiro de 2010, 0:00 - sem comentários aindaOlá! Descobri recentemente que é possível baixar a documentação do PHP no formato do man do UNIX. Isso é muito bom, já que assim, podemos consultar funções com parâmetros, variáveis e exemplos. Melhor, podemos fazer isso direto do Vim.
Eu já tinha lido sobre uma opção do Vim chamada keywordprg, mas nunca havia encontrado uma serventia. Quando eu li no blog do bjori, realmente me veio à mente como eu poderia utilizá-la.
Eu instalei a última versão do pear aqui, e executei os comandos que ele cita no blog:
pear install doc.php.net/pman
Eu precisei aumentar a memória do php.ini (memory_limit), 32M não foi o suficiente.
O manual será instalado no diretório especificado em “doc_dir” da configuração da pear e o executável no “bin_dir“. Para verificar as configurações atuais:
pear config-show # Mostra todas as configurações atuais pear config-get bin_dir # Mostra configuração atual da opção bin_dir pear config-get doc_dir # Mostra configuração atual da opção doc_dir # Para modificar: pear config-set bin_dir /outro/bin pear config-set doc_dir /outro/docs
Depois de instalado, você pode utilizar ele tanto no Vim quanto fora do Vim:
pman array_merge
Bom, se lembra que eu havia falado sobre o keywordprg ? Assim como o makeprg é o programa executado ao se executa :make no Vim e o grepprg o comando executado ao se executar :[grep|vimgrep], o keywordprg é executado quando se preciona K (k maiúsculo) sobre alguma palavra chave – que no nosso caso será uma função php.
O artigo citado ali em cima, indica para colocarmos no .vimrc, mas eu acho mais interessante por no .ftplugin/php.vim (se o arquivo não existir, crie). Assim, só será carregado caso o tipo do arquivo for php, possibilitando utilizar outros programas para outras linguagens
" Programa executado quando pressionado K set keywordprg=pman
Agora faça o teste: abra um arquivo php, coloque o cursor sobre alguma função e pressione K. Para fechar o manual aberto, basta precionar q. Pode-se utilizar a busca com /termo e também navegar nos resultados com n/N. j/k/UP/DOWN movem o arquivo para cima e para baixo, normalmente, como se fosse um manpage.
Eai, este post ajudou em algo?
Lookahead, Lookbehind e Condicionais em Expressões Regulares
30 de Dezembro de 2009, 0:00 - sem comentários aindaDepois de muito tempo sem postar, me lembrei de algo bem interessante! Vocês podem mandar mensagens na página de contato dando sugestões de temas sobre Vim, Expressões regulares ou outra coisa que vocês gostariam de ver no blog ;p.
Expressões Regulares
Expressão regular é uma ferramenta muito forte para o tratamento de texto. É muito utilizado para substituições ou para verificar integridade dos dados, pois, através da expressão regular, vulga regex ou re, pode-se casar padrões de texto. Por exemplo:
/^[a-zA-Z0-9]+$/ Para somente caracteres alfanuméricos. /^(\d{3}\.){2}\d{3}-\d{2}$/ Validando formato de CPF.
Esse tipo de regex é simples, valida praticamente só os caracteres que compõe uma dada string. Porém, as Perl Compatible Regular Expressions (Expressões Regulares Compatíveis com Perl), também conhecidas como pcre, permitem muito mais, inclusive utilizar condicionados (if’s), porém isso é para outro post! O que vamos falar agora é de Lookahead e Lookbehind.
Lookahead
Lookahead é uma forma de casar strings que tenham ou não um determinado final. É utilizado (?⁼…) para o positivo, ou seja, que terminem com; e (?!…) para o negativo, ou seja, que não termina com.
Um exemplo simples, seria a busca, primeiramente, de Gustavo seguido por Dutra. Se existisse Gustavo ou Gustavo Outracoisa, ele não casaria. Ao contrário, o segundo exemplo somente casaria o Gustavo ou o Gustavo Outracoisa, porém não casaria o Gustavo Dutra:
/Gustavo(?= Dutra)/ /Gustavo(?! Dutra)
Vamos ver um exemplo mais funcional e complexo em python:
import re print re.findall(r'\s?([^;]+);', 'Vim Editor; GVim Editor; Firefox Browser; Emacs Editor; Thunderbird Email;') # output seria: ['Vim Editor', 'GVim Editor', 'Firefox Browser', 'Emacs Editor', 'Thunderbird Email']
Mas e se quisesse somente os editores da lista?
import re print re.findall(r'\s?([^;]+ Editor);', 'Vim Editor; GVim Editor; Firefox Browser; Emacs Editor; Thunderbird Email;') # output seria: ['Vim Editor', 'GVim Editor', 'Emacs Editor']
Mas e se eu quisesse todos MENOS os editores? É ai que entra o Lookahead, vamos pegar todos que não terminam com Editor.
import re re.findall(r'\s?([^;]+ (?!Editor))', 'Vim Editor; GVim Editor; Firefox Browser; Emacs Editor; Thunderbird Email;') # output seria: ['Firefox ', 'Thunderbird ']
Observem que o que casar com (?!Editor) não entra no resultado, para incluí-lo, seria necessário uma expressão regular um pouco mais complexa utilizando condicionais. Veremos isso depois!
Lookbehind
Lookbehind faz o mesmo que o lookahead, porém, como o próprio nome diz, não procura depois, mas sim antes, da string dita. (?<=…) para o positivo e (?
Vamos pegar um RT de um tweet do twitter.com. Como gosto de ser eclético, vou usar perl:
print "RT \@gustavotkg Testando ERs." =~ /(?< =@)gustavotkg/ # Output seria: 1
Essa expressão retorna 1 (ou seja, TRUE), caso exista algum gustavotkg precedido por uma @.
OBS: @ são escapadas porque representam variáveis do tipo array em perl.
print "Este é um RT \@gustavotkg Testando ERs." =~ /(?< !RT )\@gustavotkg/ # Output seria, vazio, pois o @gustavotkg é precedido por um RT print "RT \@gustavotkg2 também estou testando ERs." =~ /(? # Output seria: RT @gustavotkg2 também estou testando ERs.
O \b significa borda de palavra (espaço, ponto final, exclamação, final de linha, etc). Como 2 não é uma borda de palavra, pois a expressão regular diz o seguinte: "Case com tudo que não começar com RT @gustavotkg seguido de uma borda de palavra".
Condicionais
Como se pode notar nos casos acima, os operadores de lookahead e lookbehind não colocam o valor casado junto ao resultado final. Para isso temos que verificar condicionalmente e adicionar manualmente o valor. A sintaxe é esta: (?(condicao)(caso verdadeiro)|(caso falso)).
Parece complicado, mas é bem simples, vamos começar com algo fácil utilizando php:
preg_match("/(?(?< =@)\w+|\w{2})/", "@testando", $r); var_dump($r); # Output seria: array(1) { [0]=> string(8) "testando" } preg_match("/(?(?< =@)\w+|\w{2})/", "testando", $r); var_dump($r); # Output seria: array(1) { [0]=> string(8) "te" }
Notem o condicional: Se começar (lookbehind) com @, então quero que case toda a palavra que segue o @, caso contrário, quero apenas os dois primeiros caracteres. Fácil? Vamos complicar!
Lembra do exemplo mais acima do lookahead? Vou refrescar a memória:
import re re.findall(r'\s?([^;]+ (?!Editor))', 'Vim Editor; GVim Editor; Firefox Browser; Emacs Editor; Thunderbird Email;') # output seria: ['Firefox ', 'Thunderbird ']
Notem que ela não adicionar a categoria do Firefox nem do Thunderbird, pois o (?!) como supracitado, não é colocado junto no resultado final. Para adicioná-los, podemos usar o condicional.
preg_match_all("/(\w+ (?(?!Editor)\w+));/","Vim Editor; GVim Editor; Firefox Browser; Emacs Editor; Thunderbird Email;",$e); var_dump($e); // Output seria: array(2) { [0]=> array(2) { [0]=> string(16) "Firefox Browser;" [1]=> string(18) "Thunderbird Email;" } [1]=> array(2) { [0]=> string(15) "Firefox Browser" [1]=> string(17) "Thunderbird Email" } }
Ou seja, no segundo índice do array, que na verdade é o indice 1, consta o resultado pego. Veja que utilizamos o seguinte método: Se \w+ não for seguido de 'Editor' então pega o \w+, senão ignora pois não é para casar. Assim, se for Editor, ele nunca irá casar.
Dúvidas? Sugestões? Deixe um comentário!
50 Cheat Sheets e Quick Refs para salvar sua pele
6 de Dezembro de 2009, 0:00 - sem comentários aindaEstou disponibilizando algumas Cheat Sheets que estavam nos meus favoritos. Sempre são úteis em algum momento!!! Espero que aproveitem pelo menos 1 delas!
Controle de Versão
Frameworks
- Prototype Cheat Sheet
- MooTools Cheat Sheet
- jQuery Cheat Sheet
- Ruby On Rails
- Django Cheat Sheet
- CodeIgniter Cheat Sheet
- CakePHP Cheat Sheet
- Mais de 12 Symfony Cheat Sheets
Programação
- Bash Script Quick Refences
- AWK Cheat Sheet
- HTML5 Canvas Cheat Sheet
- PHP Cheat Sheet
- Ruby Quick Refence
- 9 Perl Cheat Sheets
- Python Quick Refence
- Regular Expression Cheat Sheet
Web Design
- Font Size Cheat Sheet
- Propriedades CSS
- HTML Char Entities Cheat Sheet
- 6 Design Colors Cheat Sheet
- SEO Web Developer Cheat Sheet
Bancos de Dados
Ferramentas
- Google Search Cheat Sheet
- Firebug Cheat Sheet
- Vimperator Cheat Sheet
- LaTeX Cheat Sheet
- Vim Cheat Sheet
- Vim Quick Refence
- mod_rewirte Cheat Sheet
Alguma que eu tenha esquecido? Posta ae nos comentários!
Galeria de fotos com efeitos somente com CSS3
29 de Novembro de 2009, 0:00 - sem comentários aindaEu estava navegando pelo meus feeds e vi no Ajaxian um post falando sobre uma galeria de fotos somente utilizando css3. Nada de jQuery, mootools, enfim, javascript. Somente CSS3.
Veja a Galeria Demo E o arquivo css comentado.
Ai me lembrei do vídeo Hitler falando sobre o Internet Explorer 6:
Como indagou o filme, será que um dia poderemos utilizar todo o potencial do CSS3?
Solucionando problema com mmkeys.so no exaile do archlinux
24 de Novembro de 2009, 0:00 - sem comentários aindaAs hotkeys, ou teclas de atalho, sempre são úteis para quando você está escutando uma música e alguém lhe pergunta algo, ou precisa ir no banheiro ou precisa passar a música porque a atual é ruim. O exaile sempre foi meu player preferido. Simpatizo muito com ele. Para as teclas de atalho sempre utilizei o plugin Xkeys.
Depois de atualizado o pacote exaile do ArchLinux, o plugin XKeys parou de funcionar e não aceitava mais minhas teclas de atalho do teclado para manipular áudio, como forward, backward, stop, play, etc.
Esse problema era antigo, ele acusava que era necessário a lib mmkeys.so e que não estava presente. Nunca tinha tempo pra verificar o problema, até que eu decidi ir atrás.
Configurando as teclas
O objetivo do post é solucionar o problema, mas para não ficar descontextualizado, vou mostrar como mapear as teclas. É fácil e biodegradável, não polui o meio ambiente.
xev | grep keycode
Vão vir linhas confusas a cada tecla pressionada. O importante é o número junto o “keycode“. Pegue o número da respectiva tecla e escreva em ~/.Xmodmap:
keycode NUMERO = XF86AudioLowerVolume keycode NUMERO = XF86AudioMedia keycode NUMERO = XF86AudioMute keycode NUMERO = XF86AudioNext keycode NUMERO = XF86AudioPlay keycode NUMERO = XF86AudioPrev
Substitua o NUMERO pelo número do keycode que você detectou com o xev, acho que está claro o que cada um representa, né? Abra o arquivo ~/.xinitrc e adicione
xmodmap ~/.Xmodmap
Se você tiver preguiça de reiniciar a interface gráfica, pode digitar o comando acima para fazer as teclas funcionarem. Ai é só habilitar no exaile!!!
Ajustando o Exaile
pacman -Ql exaile | grep mmkeys
Identifiquei que a mmkeys.so realmente não constava nos arquivos de instalação do exaile. Como o pacman guarda um cache das versões dos programas que eu instalei e atualizei, fui verificando os arquivos de cada uma delas atrás dessa lib, pois um dia isso havia funcionado.
pacman -Qpl /var/cache/pacman/pkg/exaile-0.2.14-2.pkg.tar.gz | grep mmkeys
Esta foi a última versão que tem a dita lib (exaile /usr/lib/exaile/mmkeys.so) – aparentemente o problema veio da versão 3 em diante -, então bastou eu jogá-la para /usr/lib/exaile.
mkdir /tmp/exaile-src tar -xzvf /var/cache/pacman/pkg/exaile-0.2.14-2.pkg.tar.gz -C /tmp/exaile-src sudo mv /tmp/exaile-src/usr/lib/exaile/mmkeys.so /usr/lib/exaile/mmkeys.so rm -r /tmp/exaile-src
Pronto! Não precisa nem reiniciar o exaile, apenas habilitar o plugin XKeys que ele irá reconhecer automaticamente as suas teclas de atalhos.
Não fui atrás para saber se é problema no empacotamento ou o quê, mas deve funcionar isto até sair uma outra solução.