Archivo de la etiqueta: productividad

Solucionar problema con excepción en Autokey

Hace tiempo os hablé de una herramienta que mejora nuestra productividad a la hora de usar el teclado: Autokey. Aunque funciona muy bien a veces os puede dar un fallo que impida que se ejecute con normalidad.

Aquí os voy mostrar un error que me ocurrió hace poco y cómo lo solucioné.

De repente observé que no funciona ninguna abreviatura, así que me fijé en los mensajes que soltaba en la línea de comandos. En concreto, los errores eran éstos:

Exception in thread KeypressHandler-thread:
Traceback (most recent call last):
 File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
 self.run()
 File "/usr/lib/python2.7/site-packages/autokey/iomediator.py", line 204, in run
 target.handle_keypress(rawKey, modifiers, key, windowName, windowClass)
 File "/usr/lib/python2.7/site-packages/autokey/service.py", line 179, in handle_keypress
 currentInput, windowInfo, True)
 File "/usr/lib/python2.7/site-packages/autokey/service.py", line 304, in __checkTextMatches
 if item.check_input(buffer, windowInfo):
 File "/usr/lib/python2.7/site-packages/autokey/model.py", line 735, in check_input
 abbr = self._should_trigger_abbreviation(buffer)
 File "/usr/lib/python2.7/site-packages/autokey/model.py", line 134, in _should_trigger_abbreviation
 if self.__checkInput(buffer, abbr):
 File "/usr/lib/python2.7/site-packages/autokey/model.py", line 147, in __checkInput
 stringBefore, typedAbbr, stringAfter = self._partition_input(buffer, abbr)
 File "/usr/lib/python2.7/site-packages/autokey/model.py", line 194, in _partition_input
 stringBefore, typedAbbr, stringAfter = currentString.rpartition(abbr)
ValueError: empty separator

La causa está en que hemos introducido mal una abreviatura. A veces, al teclear la abreviatura puede que se inserte una coma «,». En este caso, el programa da error y, aunque aparentemente está funcionando (aparece el icono con forma de «A» en la bandeja del sistema -en la barra de tareas-) no lo está haciendo.

Una vez eliminada la coma queda subsanado el error y todo vuelve a funcionar con normalidad.

 

 

Autotexto en GNU/Linux (III)

En los dos anteriores artículos vimos cómo mejorar nuestra productividad a la hora de escribir textos repetitivos.

El primer método lo hacía con combinaciones de teclas. El segundo mejoraba éste ya que simplemente poniendo una sencilla abreviatura, ésta se expandía al texto que queríamos mostrar. Sin embargo, este último método era válido sólo para el editor emacs. En este artículo vamos a ver cómo hacer esto último pero ya siendo válido para cualquier aplicación de GNU/Linux que usemos.

Existe una aplicación fantástica en Linux que permite hace estas cosas de forma muy sencilla llamada Autokey.

En la propia web oficial del proyecto podéis ver cómo instalarlo desde repositorios para Debian/Ubuntu.

En mi caso (openSUSE 13.1) me he descargado los fuentes y lo he instalado así:

python setup.py install

Hay que ejecutarlo como root (o usar sudo) para que puedan copiarse los ejecutables en los directorios correspondientes.

Para ejecutarlo tenéis dos posibilidades: autokey-gtk y atuokey-qt. Como yo uso KDE he optado por la segunda opción. Para que ésta funcione hay que instalar las siguientes dependencias:

python-xlib
python-pyinotify
python-qscintilla

Para la de gtk no he probado así que no os puedo decir qué dependencias tiene exactamente. Al final, es lo mismo, porque simplemente se trata de un interfaz (gtk o bien qt) que usan la misma configuraicón (almacenada en $HOME/.config/autokey).

En esta interfaz podéis definir los textos e incluso ejecutar scripts. Por ejemplo, además de textos «estáticos» podéis hacer que cuando pulséis una abreviatura se inserte la hora actual. Tenéis ya definidos algunos ejemplos que os valdrán para probar la aplicación. Crear vuestras propias frases es bien sencillo:

  1. Pulsamos en File–> New –> Phrase (*)
  2. En el cuadro de texto escribís la frase que os interesa (puede ser una frase, un párrafo -con intros-… lo que queráis)
  3. Luego pulsáis en la parte inferior donde «Abbreviations», en concreto, en el botón de la derecha llamado «set». Ahí se os abre una ventanita para meter las distintas abreviaturas que queréis que «disparen» el texto.

Es muy completa la aplicación. Entre otras cosas, podéis:

  • Insertar un párrafo usando distintas abreviaturas
  • Especificar si queréis que haya que pulsar espacio tras la abreviatura o no
  • Ignorar mayúsculs/minúsculas a la hora de escribir las abreviaturas
  • Asignar combinaciones de teclas
  • Restringir la abreviatura para que sólo funcione en ciertas aplicaciones (opción «Window filter»)
  • Lo mejor: podéis crear scripts en python para hacer cualquier cosa que queráis que se inserte automáticamente. En la aplicación vienen varios ejemplos, pero las posibilidades son infinitas.

Esto último (creación de scripts) es una parte muy potente que os permitirá conseguir casi cualquier dato para insertarlo en vuestros documentos. Por ejemplo, esto sería para introducir la fecha (viene por defecto ya definida en los scripts de python):

output = system.exec_command("date")
keyboard.send_keys(output)

De esta forma, se puede ejecutar cualquier comando que queráis. Por ejemplo:

output = system.exec_command("ls $HOME")
keyboard.send_keys(output)

Obviamente, el script puede ser tan complejo como queráis. Se pueden hacer cosas interesantes como ésta (viene en los ejemplos de la aplicación):

choices = ["This is the option 1", "This is the option 2", "This is the option 3"]

retCode, choice = dialog.list_menu(choices)
if retCode == 0:
   keyboard.send_keys("You chose " + choice)

En este caso, se muestra una lista donde podemos elegir la frase a insertar. Podéis modificarla y personalizarla con tantas opciones como queráis.

Aquí os dejo una captura de pantalla (usando la interfaz Qt):

Autokey

Autokey

Es una de las aplicaciones más útiles para GNU/Linux que he encontrado desde que lo uso (hace casi 15 años, allá por el 99 con RedHat Linux 6 -cuando aún no era Enterprise, ni existía Fedora, ni mucho menos Ubuntu…-).

Si sois desarrolladores podéis usarla para insertar code snippets, es decir, trozos de código que repetitivo que siempre tenéis que estar tecleando cada vez (por ejemplo, los includes típicos de una aplicación, la plantilla para empezar una función en un lenguaje determinado, definición de clases, …).

Si queréis más info, además de la web oficial (donde hay una wiki con ejemplos, manuales, FAQ…), os recomiendo que echéis un vistazo aquí, donde tenéis una descripción muy completa de la aplicación.

NOTA: en las primeras pruebas he detectado que si metéis un espacio en una abreviatura al programa no le sienta muy bien, así que cuando pongáis una abreviatura tecleadla y seguidamente pulsad intro. Ya está ;-).

 

(*) Sí, el programa está entero en inglés, pero es bastante intuitivo.

Autotexto en GNU/Linux (II): Abreviaturas en Emacs.

En el anterior artículo vimos una forma de insertar autotexto en distintas aplicaciones de GNU/Linux.

En esta entrega vamos a ver cómo hacer esto pero dentro de nuestro editor favorito: emacs.

Las abreviaturas en emacs son expresiones o palabras que se expanden en frases o cadenas que elijamos. El objetivo es ahorrarnos caracteres a la hora de tipear y, por tanto, acelerar nuestra escritura (y, por ende, nuestra productividad). Ejemplo: escribimos mucho nuestro nombre completo, así que definimos una abreviatura de forma que cuando tecleemos (por ejemplo) «nn» sin comillas, al pulsar espacio o intro se expanderá a nuestro nombre completo. ¿Cómo hacerlo? Usando la siguiente combinación de teclas:

C-x a i g

Esta combinación define una abreviatura (tenemos que pulsar esto tras escribir la palabra abreviada -en este caso «nn» sin comillas y sin poner espacios; al hacerlo nos pide que metamos la frase a abreviar, en este caso nuestro nombre completo). La letra «g» en la combinación de teclas es para que las abreviaturas estén disponibles para todos los buffers. Si por alguna razón queréis que sólo estén disponibles para un buffer usad «l» en su lugar.

Una vez creada (podemos crear tantas como queramos), si probamos a escribir «nn» no se sustituye por nuestro nombre, ¿por qué? Pues porque tenemos que estar en el modo menor Abbrev-mode. Activarlo con m-x Abbrev-mode y veréis qué bien!

Para eliminar las abreviaturas definidas:

M-x kill-all-abbrevs

Si queréis que esto esté siempre disponible cuando arranquéis emacs se pueden meter en el archivo de configuración .emacs.el.

Aunque esta funcionalidad es bastante práctica, en un próximo artículo os comentaré otro método que permite usar abreviaturas de esta forma (*) pero para todas las aplicaciones del sistema, lo cuál mejora bastante lo comentado en este artículo.

 

(*) autoexpandiendo el texto automáticamente al introducir una abreviatura y, por tanto, sin necesidad de usar combinaciones de teclas como en un artículo anterior (usando xclip).

Autotexto en GNU/Linux (I)

Ya os hablé hace tiempo de autohotkey. Es una aplicación para windows que permite automatizar acciones comunes mediante atajos de teclado.

En Linux también existe otra utilidad similar pero de ella os hablaré en otro artículo. Aquí os voy a contar cómo automatizar la introducción de textos de forma automática, con sólo pulsar unas combinaciones de teclas.

La idea es la siguiente:

  1. Existen unos textos, unas líneas, unas frases… que repetimos con cierta asiduidad y queremos no tener que teclarlas de nuevo cada vez.
  2. Creamos un script donde metemos los textos «maestros» que vamos a insertar en nuestros documentos, archivos, etc.
  3. Asignaremos combinaciones de teclas (*) para cada texto distinto de forma que cuando queramos que se inserte dicho texto donde tengamos el cursor en ese momento (puede ser una web, un cliente de correo, un procesador de texto e incluso la shell de comandos, por citar algunos ejemplos).

Para conseguir esto de una forma sencilla usaremos el comando xclip. Este comando permite trabajar con el portapapeles de Linux. Así, si ejecutamos esto:

echo CADENA | xclip -selection clipboard

lo que estamos haciendo es que la cadena CADENA se inserte cuando pulsemos pegar desde el portapapeles («clipboard» en inglés).

Así pues, para insertar textos, lo que haremos es pulsar una combinación de teclas y luego darle a pegar (que también podemos hacer con la combinación Control+V ó Control+Y si estamos en emacs, como bien sabéis).

CAD_00="Ésta es la cadena de ejemplo 0"
CAD_01="Ésta es la cadena de ejemplo 1"
CAD_02="Ésta es la cadena de ejemplo 2"
CAD_03="Ésta es la cadena de ejemplo 3"
CAD_04="Ésta es la cadena de ejemplo 4"
CAD_05="Ésta es la cadena de ejemplo 5"
CAD_06="Ésta es la cadena de ejemplo 6"
CAD_07="Ésta es la cadena de ejemplo 7"
CAD_08="Ésta es la cadena de ejemplo 8"
CAD_09="Ésta es la cadena de ejemplo 9"

CAD_ERROR=".-.Null.-."
case $1 in
 1)
 echo $CAD_01 | xclip -selection clipboard
 ;;
 2)
 echo $CAD_02 | xclip -selection clipboard
 ;;
 3)
 echo $CAD_03 | xclip -selection clipboard
 ;;
 4)
 echo $CAD_04 | xclip -selection clipboard
 ;;
 5)
 echo $CAD_05 | xclip -selection clipboard
 ;;
 6)
 echo $CAD_06 | xclip -selection clipboard
 ;;
 7)
 echo $CAD_07 | xclip -selection clipboard
 ;;
 8)
 echo $CAD_08 | xclip -selection clipboard
 ;;
 9)
 echo $CAD_09 | xclip -selection clipboard
 ;;
 0)
 echo $CAD_00 | xclip -selection clipboard
 ;;
 *) 
 echo $CAD_ERROR | xclip -selection clipboard
 ;;
esac

Ahora simplemente asignamos una combinación de teclas para cada una de las 10 cadenas (podemos poner más cadenas ampliando el case a partir del 10 en adelante) de tal forma que, al pulsarla, se ejecute el script con el argumento X (donde X es un número de 0 a 9 en este caso o de 0 a … donde queráis si lo ampliáis).

Con esto ya tenéis el texto en el portapapeles. Ahora sólo os queda pegar donde queráis con Control+V.

Podéis usar caracteres especiales e incluso el intro (\n) en vuestros textos.

Esta solución es sencilla, práctica y seguro que ayudará a aumentar vuestra productividad. Sin embargo, hay otras posibilidades aún más interesantes que veremos en próximas entregas. ¿Os las vais a perder?

 

(*) Combinaciones de teclas, hotkeys, shorcuts… todas estas expresiones se refieren a lo mismo.