Archive for February, 2009

Exuberant Ctags con Vim

Exuberant Ctags es una reimplementación de Ctags, originalmente escrito para Unix, el cual genera un índice de palabras clave (tags) encontradas en archivos de código fuente. Dependiendo del lenguaje y el modo en que sea usado Ctags, esas palabras clave pueden ser funciones, variables, clases, interfaces, etc. Luego este índice puede ser usado por Vim (u otro editor de código que soporte Ctags) para llevarnos rápidamente de un lugar a otro dentro de nuestro código, incluso entre distintos archivos.

Exuberant Ctag, escrito por Darren Hiebert, fue distribuído con Vim hasta la versión 6 de este último. Actualmente es un proyecto independiente. Soporta 34 lenguajes de programación y la posibilidad de utilizar expresiones regulares POSIX para afinar nuestra indexación.

Instalación

sudo apt-get install exuberant-ctags

El nombre del programa difiere del nombre del paquete y se llamactags-exuberant. Aunque puede ser invocado mediante el link simbólicoctagscreado durante la instalación.

Creación del archivo tags

La forma más sencilla de crear un índice es movernos al directorio donde tenemos los archivos fuente y ejecutar

ctags -R

Esto creará el archivotagsconteniendo el índice de todo el código reconocido. La opción-Rindica que recorra recursivamente los subdirectorios bajo el actual. Podemos reemplazarla por*para evitar que explore subdirectorios.

Luego de generar el índice sólo nos resta indicarle a Vim el archivo de tags a usar. Esto podemos hacerlo desde el modo comando::set tags=~/my_project/tags; o bien definirlo en~/.vimrc. También funciona el ejecutar Vim desde el mismo directorio donde se encuentra el archivo de tags.

Uso desde Vim

  • Ctrl-]sobre el nombre de clase o método nos lleva al archivo con su definición.
  • Ctrl-Tnos regresa al archivo anterior.
  • Ctrl-W ]sobre el nombre de clase o método abre el archivo con su definición en la mitad superior de la ventana.

Tags:

Code Golf – Saving Time

Code Golf es un sitio donde se juega a resolver problemas informáticos en la menor cantidad posible de pulsaciones de tecla. Para ello pueden utilizarse lenguajes como Perl, PHP, Python y Ruby. Quien resuelva el desafío en menor cantidad de keystrokes es quien tendrá mayor puntaje.

Me anoté en uno llamado Saving Time y llegué al puesto 20 de PHP, con 245 keystrokes. (2009-03-27: Aunque ahora me encuentro en el 22, malditos nerds!)

El desafío consiste en crear la cara de un reloj analógico partiendo de una hora dada en formatohh:mm. Algunas de las reglas son

  • La hora dada en hh:mm se representa con una ‘h’ minúscula.
  • La hora que indica los minutos dados en hh:mm se representa con una ‘m’ minúscula.
  • Cuando hora y minutos coinciden en la misma posición se representa con una ‘x’ minúscula.
  • El resto de las horas se representan con una ‘o’ minúscula.
  • Los minutos deben redondearse al múltiplo de 5 más cercano (23 se convierte en 20, 39 en 35, etc.)

Salida del programa

Código

<?$f="874D1F0D1748110202020201";
list($h,$m)=split(':',fgets(STDIN));
if($h>=12)$h-=12;
$m=floor($m/5);$a=$i=12;
while($i){$a+=$i%2?$i:-$i;
echo str_pad("",hexdec($f{--$i})).
(($a==$h)?($h==$m?'x':'h'):($a==$m?'m':'o')).
str_repeat("\n",$f{$i+12});}?>

El string hexadecimal $f contiene el formato necesario para “dibujar” el reloj. Para interpretarlo es necesario dividirlo en dos mitades. La primera mitad contiene, en cada caracter hexadecimal, la distancia a la que se encuentra respecto de su elemento anterior, que puede ser el número de la izquierda o un salto de línea. De aquí surge el por qué de haber usado el sistema hexadecimal: el espacio mayor a representar es 15. En la segunda mitad cada caracter representa la cantidad de saltos de línea que preceden al caracter.

Tags: ,