1. Code
  2. Coding Fundamentals
  3. Workflow

Escribe una extensión de Alfred para crear archivos rápidamente

Recientemente, hablamos de cómo usar la Terminal para crear archivos rápidamente. Hoy, vamos a repasar y aplicar este conocimiento para hacer nuestra propia extensión de Alfred que crea un nuevo directorio de archivos en un instante. Incluso veremos algo de AppleScript a lo largo del proceso para que puedas obtener tu buena dosis de "geekismo".
Scroll to top
This post is part of a series called Taming The Terminal.
Quick Tip: Lightning Fast File Creation with Terminal

Spanish (Español) translation by Nadia Gonzales (you can also view the original English article)

Recientemente, hablamos de cómo usar la Terminal para crear archivos rápidamente. Hoy, vamos a repasar y aplicar este conocimiento para hacer nuestra propia extensión de Alfred que crea un nuevo directorio de archivos en un instante. Incluso veremos algo de AppleScript a lo largo del proceso para que puedas obtener tu buena dosis de "geekismo".


Lo que construiremos

Como desarrollador, siempre que empiezo un nuevo proyecto, suelo pasar por el mismo proceso. En primer lugar, tengo que crear una carpeta y nombrarla. Luego tengo que abrir un editor de texto y crear individualmente cada archivo que quiero incluir (index.html, style.css, etc.).

Obviamente, esto es tedioso, así que he intentado un montón de cosas para evitarlo. He intentado tener un proyecto en blanco a mano que pueda arrastrar y copiar, usar la Terminal para crear los archivos manualmente, etc.

Sin embargo, mi método favorito actual es llamar a Alfred, escribir el nombre de la carpeta que quiero crear y pulsar Retorno. Y ya está. Todo el resto de los pasos están completamente automatizados, lo que me ahorra mucho tiempo en una semana determinada.

Obviamente, esta funcionalidad no viene con Alfred por defecto, así que tendremos que incorporarla. Afortunadamente, ¡hacerlo es muy sencillo!

Dato: Este tutorial no es solo para desarrolladores. ¡Sigue el tutorial y modifícalo para crear archivos de cualquier tipo!


Tarea de la Terminal

Como mencioné en la introducción, he cubierto los fundamentos de la creación de archivos en la Terminal en un artículo anterior, pero vale la pena mencionarlos de nuevo aquí solo para que todos estemos en sintonía.

Hay tres comandos básicos de shell script que usaremos hoy: cd, mkdir y touch. Veamos cómo funciona cada uno.

Cambiando tu directorio

Por defecto, cuando abres la Terminal, deberías empezar en la carpeta de inicio de tu Mac. Esto servirá como punto de partida para cualquier comando que requiera una ubicación. Si quieres cambiar esa ubicación, utiliza el comando cd.

1
cd Desktop/

Esto le dice a la Terminal que quieres cambiar el directorio actual a "Escritorio". Más tarde, cuando hagamos esto desde Alfred, tendremos que ser un poco más específicos:

1
/Users/MacBookPrime/Desktop

Aquí incluí la ruta completa a la carpeta de mi Escritorio. Es muy importante que personalices este snippet en particular para tu propia máquina. Para ello, sustituye mi nombre de usuario por el tuyo. Inserta tu nombre de usuario entre "Users/" y "Desktop/" en el snippet de abajo:

1
/Users/YourUserNameGoesHere/Desktop

Creando un nuevo directorio

Una vez que cambiamos de directorio, necesitaremos crear un nuevo directorio (carpeta). Para ello, utilizamos el comando mkdir.

1
mkdir mySite

Esto creará una nueva carpeta llamada "mySite" en el directorio actual. En nuestro caso, será el Escritorio.

Crea un nuevo archivo

Ahora viene la mejor parte: cómo crear un nuevo archivo. Por alguna razón, me parece una tontería tener que abrir una aplicación para crear un archivo. Debería ser capaz de crear archivos vacíos, con cualquier extensión que quiera, a voluntad. Con el comando touch, podemos hacer exactamente eso:

1
touch textFile.txt

Esto creará un nuevo archivo de texto plano en el directorio actual con el nombre "textFile.txt". Fácil, ¿verdad?

Pon todo junto

Ahora tenemos todo el conocimiento que necesitamos para llevar a cabo nuestro script de shell. Así es como se ve cuando combinamos estos comandos (desplázate a la derecha para ver el snippet completo).

1
cd /Users/MacBookPrime/Desktop; mkdir mySite; cd mySite; touch index.html style.css script.js

Observa que los diferentes comandos están separados por un punto y coma y también que los comandos touch pueden ser encadenados usando solo un espacio entre los diferentes nombres de archivo.

Creando una extensión de Alfred

Ahora que tenemos nuestro script de shell básico resuelto, es el momento de crear la extensión de Alfred. Afortunadamente, no necesitamos ninguna herramienta de desarrollo especial para esto, ¡solo Alfred! Sin embargo, necesitarás el Powerpack, que es la versión premium de Alfred.

Paso 1. Crea una nueva extensión

Para empezar, abre Alfred y haz clic en el pequeño engranaje de la parte superior derecha para acceder a las Preferencias. Desde aquí, haz clic en la pestaña "Extensiones". Es posible que ya tengas algunas extensiones de terceros aquí.

AlfredAlfredAlfredHaz clic en la pestaña Extensiones

En la pestaña Extensiones, haz clic en el pequeño botón "+" situado en la parte inferior izquierda de la ventana. Esto debería abrir un menú con los distintos tipos de extensiones que puedes crear:

AlfredAlfredAlfredSelecciona "Shell Script"

Aquí, elige "Shell Script". No te preocupes si no tienes idea de cómo escribir un script de shell, ¡ya escribimos uno arriba!

Paso 2. Nombre y otros detalles

Cuando creas una nueva extensión, puedes darle un nombre e insertar tu información en caso de que vayas a distribuirla. De esta manera la gente puede ver de quién es.

AlfredAlfredAlfredIntroduce la información del crédito y pulsa Guardar

Además, puedes personalizar el icono. Creo que el icono de la Terminal está bien para nuestros propósitos, pero no dudes en arrastrar tu propia imagen.

Paso 3. Introduce los detalles de Alfred

A continuación, tendrás que introducir el título, la descripción y la palabra clave de la extensión.

AlfredAlfredAlfredIntroduce los detalles de Alfred aquí

Esto puede parecer un poco redundante con la ventana anterior pero no lo es. La pantalla anterior era solo para fines de créditos, esto determina la información que Alfred realmente muestra cuando se accede a la extensión.

AlfredAlfredAlfredAlfred muestra los detalles que has introducido cuando llamas a la extensión

Fíjate que he puesto "nw" como acceso directo, así que cuando escribo esto en Alfred, la primera opción que aparece muestra el título y la descripción que he introducido.

Paso 4. Introduce el Script

Ahora es el momento de introducir los comandos de shell que escribimos antes, con un poco de personalización. Aquí está el snippet de antes:

1
cd /Users/MacBookPrime/Desktop; mkdir mySite; cd mySite; touch index.html style.css script.js

Ahora, en lugar de hacer una carpeta llamada "mySite" cada vez, vamos a utilizar el texto que el usuario introduce en Alfred. Lo hacemos sustituyendo mySite por 1.

1
cd /Users/MacBookPrime/Desktop; mkdir 1; cd 1; touch index.html style.css script.js

Esta configuración requiere la entrada del usuario, así que asegúrate de poner el ajuste "Parameter" en "Required parameter". Además, no olvides personalizar la ruta a tu escritorio.

AlfredAlfredAlfredIntroduce el script en el campo Comando

Una vez que hayas terminado con este paso, pulsa el botón Guardar. Y ya está. Ya has terminado.

Prueba la extensión

Para asegurarte de que todo ha funcionado correctamente, sal de la ventana de Preferencias y vuelve a ejecutar Alfred. Escribe "nw" como atajo, seguido del nombre de la carpeta que quieres crear.

AlfredAlfredAlfredProbando la nueva extensión

El resultado de la extensión debería ser una carpeta, con el nombre que hayas elegido, llena de los archivos que hayas creado con el comando touch.

AlfredAlfredAlfredEl resultado de la extensión

Si funciona, entonces has terminado. Los siguientes pasos son completamente opcionales. Si te apetece un reto, ¡continúa!

Avanzado: Haz que funcione en cualquier carpeta

El método anterior siempre crea una nueva carpeta en tu Escritorio. En realidad, así es como trabaja mucha gente, pero nunca recomiendo estas prácticas desordenadas. Soy un gran defensor de mantener el Escritorio pulcro, así que me propuse mejorar el script.

Lo que queremos hacer es consultar el Finder y obtener la ruta de la ventana más cercana. Si no existe ninguna ventana, deberíamos elegir por defecto el Escritorio. Luego, cuando creemos los archivos, usaremos la ruta del primer paso. En la práctica, podrás navegar hasta una carpeta de tu disco, ejecutar la extensión Alfred y crear rápidamente un nuevo directorio lleno de archivos.

Paso 1. AppleScript al rescate

Obviamente, la parte complicada aquí es conseguir que un script de shell averigüe automáticamente la ventana del Finder más cercana en cualquier momento. Resulta que la forma más fácil que conozco para inspeccionar una ventana del Finder es AppleScript. Para obtener el doble de puntos nerd, puedes incluir un AppleScript en un script de shell, y viceversa.

El script que necesitamos tendrá unos cuantos pasos básicos:

  1. Intentar obtener la ruta de la ventana más cercana del Finder
  2. Si el intento tiene éxito, usa como respuesta la ruta de esa ventana
  3. Si el intento falla (no existe ninguna ventana del Finder), usa como respuesta la ruta del Escritorio

Un obstáculo que nos encontramos en este proceso es que, por defecto, AppleScript utiliza un formato diferente para las rutas de los archivos que los scripts de la shell. En lugar de la línea diagonal a la que probablemente estés acostumbrado (Users/Username/Desktop), AppleScript utiliza dos puntos para separar los directorios (Users:Username:Desktop).

Sin embargo, esto es bastante fácil de manejar. Solo tenemos que asegurarnos de hacer referencia a la ruta POSIX en nuestro script. Así es como se ve el producto final.

[applescript] try tell application "Finder" set this_folder to (the target of the front window) as alias set this_folder to POSIX path of this_folder return this_folder end tell end try

set this_folder to POSIX path of (path to desktop) return this_folder [/applescript]

Como puedes ver, simplemente repasamos cada uno de los pasos que hemos descrito anteriormente. El resultado de este script siempre será una ruta de archivo. En los próximos pasos, veremos cómo usar esa ruta en nuestro script de shell.

Paso 2. Reformateando el Script

Nuestra siguiente tarea es incrustar el AppleScript que acabamos de escribir en nuestro script de shell. Para ello, utilizaremos la siguiente sintaxis:

1
osascript -e 'AppleScript goes here'

Como puedes ver, usamos "osascript" para comenzar nuestra incrustación de AppleScript. La siguiente pieza, "-e", se utiliza para separar diferentes líneas, cada una de las cuales está encerrada entre comillas simples. Así que si quisiéramos incrustar múltiples líneas de AppleScript, se vería así:

1
osascript -e 'tell application "Finder"' -e 'activate' -e 'end tell'

Este es un script muy básico, de tres líneas, dividido por switches -e. Con este conocimiento en mente, necesitamos reformatear nuestro script de arriba. Hacer esto puede ser un poco confuso, así que me gusta seguir un patrón muy específico. Primero, quita la sangría y los espacios en blanco extra.

1
try
2
tell application "Finder"
3
set this_folder to (the target of the front window) as alias
4
set this_folder to POSIX path of this_folder
5
return this_folder
6
end tell
7
end try
8
set this_folder to POSIX path of (path to desktop)
9
return this_folder

A continuación, encierra cada línea en una sola comilla y precede con -e para que el script de shell pueda analizar las diferentes líneas.

1
-e 'try'
2
-e 'tell application "Finder"'
3
-e 'set this_folder to (the target of the front window) as alias'
4
-e 'set this_folder to POSIX path of this_folder'
5
-e 'return this_folder'
6
-e 'end tell'
7
-e 'end try'
8
-e 'set this_folder to POSIX path of (path to desktop)'
9
-e 'return this_folder'

Por último, elimina todos los saltos de línea y coloca el comando osascript al principio.

1
osascript -e 'try' -e 'tell application "Finder"' -e 'set this_folder to (the target of the front window) as alias' -e 'set this_folder to POSIX path of this_folder' -e 'return this_folder' -e 'end tell' -e 'end try' -e 'set this_folder to POSIX path of (path to desktop)' -e 'return this_folder'

Paso 3. Ensambla todo

Para nuestro truco final, vamos a utilizar la ruta resultante del AppleScript como punto de partida para nuestro script de shell que crea los archivos. Para ello, tenemos que poner el resultado del script en una variable, y luego llamar a esa variable cuando necesitemos una ruta de inicio.

Antes de ver el script de shell completado, veamos la sintaxis para asignar la variable:

1
myPath=$(osascript -e 'AppleScript goes here')

Aquí creamos una variable llamada "myPath" y luego la establecemos en un AppleScript. Como esto devolverá una ruta, podemos usar esta variable en lugar de una ruta.

1
cd $myPath;

Eso es todo. Ahora vamos a juntar todo esto en un comando gigante.

1
myPath=$(osascript -e 'try' -e 'tell application "Finder"' -e 'set this_folder to (the target of the front window) as alias' -e 'set this_folder to POSIX path of this_folder' -e 'return this_folder' -e 'end tell' -e 'end try' -e 'set this_folder to POSIX path of (path to desktop)' -e 'return this_folder'); cd $myPath; mkdir 1; cd 1; touch index.html style.css script.js

¡Ha sido un éxito!

El comando debería ser ahora completamente funcional. Pégalo en Alfred y pruébalo usando el mismo prefijo "nw" que antes. El resultado debería ser una nueva carpeta en tu ventana actual del Finder con el nombre que has introducido como parámetro.

AlfredAlfredAlfredPega el script terminado en el campo de comandos

Haz el tuyo

Si has llegado hasta el final de este tutorial, enhorabuena, ¡ha sido todo un reto! Ahora has codificado manualmente tu primera extensión de Alfred. Con tus nuevos conocimientos sobre la combinación de scripts de shell y AppleScripts, deberías ser capaz de crear algunas fantásticas extensiones por tu cuenta.

Si tienes alguna idea para nuevas extensiones o has creado alguna, deja un comentario abajo y háznoslo saber.