4 votos

Forma más sencilla de crear una lista clickeable en MacOS que hará que se ejecuten los programas seleccionados

Estoy buscando algo que funcione en macOS y me permita hacer lo siguiente:

Supongamos que tengo un archivo llamado "program.list" con contenido como este:

"Programa 1" "/usr/local/bin/programa 1"
"Programa 2" "/usr/local/bin/programa 2"
"Programa 3" "/usr/local/bin/otro-programa xyz"
"Programa 4" "/usr/local/bin/otra-cosa"
... etc. ...

Me gustaría alimentar este archivo a un programa que, por ejemplo, podría llamarse "run-from-list", y que podría invocar de la siguiente manera:

run-from-list program.list

... y cuando se invoque ese comando, aparecería lo siguiente en la pantalla en una lista desplazable:

Programa 1
Programa 2
Programa 3
Programa 4
... etc. ...

Y al hacer clic en cualquier línea, se ejecutará el programa asociado. Por ejemplo, si hago clic en "Programa 1", se ejecutará el programa "/usr/local/bin/programa 1".

¿Existe alguna manera de escribir "run-from-list" en MacOS sin compilar el código fuente en un ejecutable? Un lenguaje de scripting sería adecuado. ¿O existe algún tipo de utilidad existente que pueda descargar y usar de manera similar para este propósito?

7voto

Reiik Puntos 33

Puedes usar la aplicación "Editor de Scripts" en tu Mac (ubicada en la carpeta Aplicaciones/Utilidades) para hacer este tipo de cosas. Te permite escribir scripts en AppleScript o JavaScript.

Usando JS, algo así debería hacer prácticamente lo que deseas:

const app = Application.currentApplication();
app.includeStandardAdditions = true;

function readFile(file) {
  return app.read(Path(file.toString()));
}

const file = readFile(app.chooseFile());
const paths = JSON.parse(file);

const choices = Object.keys(paths);
const result = app.chooseFromList(choices, {withPrompt: "Selecciona una aplicación:"});

if (result !== false) {
  const [choice] = result;

  const app = Application(paths[choice]);
  app.activate();
}

Cuando se ejecuta, esto abre un cuadro de diálogo de archivo solicitando el archivo, y luego abre un cuadro de diálogo para elegir de una lista, antes de abrir la aplicación seleccionada. Usé un archivo JSON para mantener las cosas simples, pero ciertamente puedes adaptarlo a tu formato personalizado si es necesario.

Así es como se ve el resultado cuando se ejecuta con un archivo como

{
  "Calendario": "/System/Applications/Calendario.app",
  "Chrome": "/Applications/Google Chrome.app"
}

Hay muchas otras formas de abrir archivos:

  • Puedes leerlos como argumento desde la terminal;
  • Puedes hacer que el script sea un "droplet" y luego arrastrar los archivos sobre él para lanzarlo con esos archivos;
  • Puedes codificar una ruta a archivos específicos;
  • etc

Consulta la documentación Trabajando con Archivos y Carpetas para ver cómo podrías hacer eso.

6voto

WGroleau Puntos 255

Esto puede que no sea exactamente lo que deseas, pero creo que está cerca.

  • Creé un directorio llamado "Run_From_List".
  • Allí coloqué enlaces simbólicos o alias a varios programas.
  • Utilicé Finder para arrastrar el directorio hasta el Dock, a la derecha del separador.
  • Configuré las opciones del directorio en el Dock para "Ver contenido como Ventilador" y "Mostrar como Pila".

Un clic en el icono del Dock muestra el contenido como se ve en la imagen a continuación. Luego, un clic en un enlace simbólico de la aplicación inicia la aplicación. No tiene que ser un paquete de aplicaciones: el archivo jar en el mío invoca automáticamente el JVM junto con él, y si el enlace es a un script shell ejecutable, ejecutaría el script en una nueva ventana de Terminal.

Si el directorio contiene demasiados enlaces de programas para adaptarse al formato "Ventilador", prueba el formato "Cuadrícula". O utiliza "Automático", que elige entre Ventilador o Cuadrícula según el tamaño. introducir descripción de la imagen aquí

4voto

Vincent Ramdhanie Puntos 46265

Otra respuesta utiliza fzf como un componente de un script bash más grande. Esta respuesta utiliza fzf como un comando de una línea autónomo.

fzf es un buscador difuso de línea de comandos que hace exactamente lo que quieres. Puedes enviar texto a través de stdin, seleccionar una línea de la lista (admite doble clic con el ratón, o buscar o hacer clic en la línea que deseas, luego presionar 'Enter'.)

Puedes personalizarlo para mostrar solo el primer campo, y puedes conectar acciones personalizadas a combinaciones de teclas. Aquí tienes un ejemplo. Cambié tu archivo program.list para ser un archivo de valores separados por tabuladores para mayor simplicidad. Puedes utilizar un separador diferente si prefieres, solo actualiza el argumento --delimiter a continuación.

Contenidos de program.list:

Neovim   nvim
Visidata        vd
Htop    /usr/bin/htop

Nota que las columnas están separadas por un solo carácter de tabulación. También ten en cuenta que no es necesario especificar la ruta completa del programa si está en tu PATH (pero puedes hacerlo si así lo prefieres).

El siguiente comando fzf es todo lo que necesitas para la funcionalidad completa requerida:

fzf < program.list --delimiter '\t' --with-nth 1 --bind 'enter:execute({2})+abort,double-click:execute({2})+abort'

Ejecutar programa de la lista

Cuando estés satisfecho con el comportamiento del comando fzf, simplemente envuélvelo en un script de shell, hazlo ejecutable, y colócalo en algún lugar práctico.

Explicación de los argumentos de fzf:

< program.list   # enviar el archivo program.list a través de stdin a fzf
--delimiter '\t' # dividir la entrada en columnas usando el delimitador de tabulación
--with-nth 1     # mostrar solo la primera columna en la lista de selección

# Ejecutar el valor seleccionado de la segunda columna y salir, cuando se reciba `Enter` o `Doble clic`.
--bind 'enter:execute({2})+abort,double-click:execute({2})+abort'

Editar: Si deseas admitir la ejecución de comandos con argumentos, actualiza el comando de la siguiente manera:

fzf < program.list --delimiter '\t' --with-nth 1 --bind 'enter:execute(sh -c {2})+abort,double-click:execute(sh -c {2})+abort'

3voto

chr Puntos 136

Aquí hay una solución para usar en una Terminal. Dado que tu pregunta habla sobre ejecutar programas de consola desde /usr/local/bin y mencionas invocar, creo que deseas ejecutar esto desde una terminal en lugar de hacer clic en un icono en el Finder o el Dock.

Enlace al repositorio de GitHub: https://github.com/luckman212/click-run

Se trata de un PoC rápido, escrito en Bash básico. Tiene una dependencia (fzf) para la vista de lista agradable y filtrable. Eso podría eliminarse si fuera necesario utilizando un comando integrado como select en su lugar.

Viene con un archivo de configuración de muestra, que es una lista separada por tabulaciones en el formato:

nombre_comando1(tabulación literal)argumentos_comando1
nombre_comando2(tabulación literal)argumentos_comando2
...

Este formato se eligió específicamente para que tus argumentos de comando puedan contener espacios, referenciar variables ($foo), o usar tuberías (|) y otros caracteres especiales de la terminal. También hay una bandera --dry-run que puedes pasar para previsualizar comandos antes de ejecutarlos (para evitar sorpresas y posibles problemas al usar eval).

2voto

benwiggy Puntos 8

Existen muchas aplicaciones para este propósito: una búsqueda de "lanzador" en la Mac App Store te muestra varias utilidades que podrían hacer lo que deseas, dependiendo de tus necesidades y propósitos exactos.

Cualquier script que necesite definir y controlar una interfaz probablemente tenga una complejidad similar a la de una aplicación compilada.

Curiosamente, el Classic Mac OS solía tener una aplicación de Lanzador que era totalmente configurable. ¡Otra característica perdida...!

ingresa la descripción de la imagen aquí

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X