Cómo crear un atajo de teclado para un comando de terminal

15

A menudo trabajo con git y me encantó iTerm2 por la capacidad de establecer atajos de teclado para comandos. Por ejemplo, configuro CTRL+ ENTERa git status.

¿Es esto posible con gnome-terminal o puede recomendar otra opción para lograr esto?

mniess
fuente

Respuestas:

16

Puede usar bind -xpara vincular un comando a un acceso directo en Bash. Por ejemplo, para vincular el git statuscomando a Crtl+ pacceso directo puede usar:

 bind -x '"\C-p":git status'

Póngalo en el ~/.bashrcarchivo para recordarlo. Desde la página del manual:

-x keyseq: comando de shell

Causa que se ejecute el comando shell cada vez que se ingresa keyseq. Cuando se ejecuta el comando shell, el shell establece la variable READLINE_LINE en el contenido del búfer de línea Readline y la variable READLINE_POINT en la ubicación actual del punto de inserción. Si el comando ejecutado cambia el valor de READLINE_LINE o READLINE_POINT, esos nuevos valores se reflejarán en el estado de edición.

Nykakin
fuente
Increíble. Estoy usando zsh pero eso tiene un equivalente llamado bindkey . Entonces, para lograr lo que quiero, hice esto: bindkey -s '^[^M' 'git status\n'que se une a ALT + ENTRAR.
mniess
1
bind -x '"\C-k":firefox'Lo uso pero no funciona
alhelal
1
Esto funciona en shell, pero quiero todo el tiempo.
alhelal
Póngalo al final del ~/.bashrcarchivo. Si todavía no funciona,
mira
bindPuede encontrar más información sobre el uso aquí: stackoverflow.com/a/4201274/712334
Josh Habdas
2

1. Abra automáticamente una nueva ventana de terminal, que muestra el resultado de su comando

Como debe mantener la terminal abierta después de que se ejecute el comando, coloque:

gnome-terminal -e 'bash -c "git status; read line"'

bajo una combinación de teclas de acceso directo, hará el trabajo. Se abrirá un nueva gnome-terminal ventana y ejecutará el comando dentro de ella.

Agregarlo a un atajo

Elija: Configuración del sistema> "Teclado"> "Atajos"> "Atajos personalizados". Haga clic en "+" y agregue el comando:

gnome-terminal -e 'bash -c "git status; read line"'

a Ctrl +Enter

Nota

Aunque su acceso directo sugerido funciona, puede elegir otra combinación de teclas y luego Ctrl+ Enter, ya que al menos choca con el LibreOfficeacceso directo para saltar a una nueva página.

Explicación

Para gnome-terminalabrir una nueva ventana desde la línea de comandos y ejecutar un comando en ella, puede usar:

gnome-terminal -e 'bash -c <command>'

Sin embargo, aunque el comando se ejecutará correctamente, la ventana del terminal se cerrará inmediatamente antes de que pueda leer la salida.

La sección:

read line

es entonces mantener el terminal abierto (hasta que golpee Enter) después de que se ejecute el comando.

Otros comandos

De esta manera, puede ejecutar cualquier comando (complejo) en el terminal, sin tener que cerrarlo inmediatamente:

$ gnome-terminal -e 'bash -c "wmctrl -d; read line"'

saldrá (si wmctrlestá instalado):

ingrese la descripción de la imagen aquí

Después de presionar Enterel terminal se cerrará.

2. Ejecutando un comando en la ventana gnome-terminal actualmente activa

Por supuesto, podría colocar una línea simple bajo una tecla de acceso directo (suponiendo que haya xdotoolinstalado):

xdotool type "<command>"

Sin embargo, esto escribiría el comando a ciegas , en cualquier aplicación, y escribir el comando no es la opción más limpia.

El pequeño script a continuación, por lo tanto:

  • mira si la ventana activa es una gnome-terminalventana (por su pid)
  • si es así, pega el comando en la gnome-terminalventana activa , presiona Return.
    Si no, el script no hace nada , por lo que no se pegará en otras aplicaciones.

Dado que el script toma el comando de destino como argumento, puede colocar múltiples comandos bajo múltiples accesos directos.

La secuencia de comandos

#!/usr/bin/env python3
import subprocess
import sys
import time

app = "gnome-terminal"
s = (" ").join(sys.argv[1:])

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def front(app):
    try:
        # see if gnome-terminal is running at all (raising error if not)
        app = get(["pgrep", app]) 
    except subprocess.CalledProcessError:
        app = False
    if app:
        # if so, see if the active window belongs to gnome-terminal comparing pids)
        active = get(["xdotool", "getwindowpid", get(["xdotool", "getactivewindow"])])
        return True if app == active else False

if front(app):
    # copy command to clipboard
    cm1 = ["/bin/bash", "-c", 'printf "'+s+'" | xclip -selection clipboard']
    # paste in terminal window
    cm2 = ["xdotool", "key", "Control_L+Shift_L+v"]
    # press return
    cm3 = ["xdotool", "key", "Return"]
    for cm in [cm1, cm2, cm3]:
        subprocess.call(cm)

Cómo utilizar

  1. El guión necesita xdotool

    sudo apt-get install xdotool

  2. Cree un directorio ~/binsi aún no existe, cierre la sesión o inicie sesiónsource ~/.profile

  3. Copie el script anterior en un archivo vacío, guárdelo como gterm_keys(sin extensión) en ~/bin, y hágalo ejecutable

Ahora puede ejecutar cualquier comando, desde una tecla de acceso directo, en la gnome-terminalventana frontal agregando el comando:

gterm_keys <command>

a una tecla de acceso directo, como se describe en [1]

Jacob Vlijm
fuente
Hola Jacob, gracias por tu respuesta. Sin embargo, creo que las soluciones bind (y bindkey) son mejores, ya que están integradas en la carcasa. De esa manera no escribiré accidentalmente "git status" en Libreoffice. ;)
mniess
@mniess Estoy de acuerdo en que la respuesta es buena, pero para el registro, si lees mi respuesta cuidadosamente, imprimiendo en LibreOffice, eso no puede suceder . pero acabas de votar? Eso es hilarante.
Jacob Vlijm
Lo sé, el script comprueba la aplicación en ejecución. No voté en contra. Escribí el comentario para agradecerle por tomarse el tiempo para escribir una respuesta tan detallada.
mniess
@mniess ¡Ah, perdón por sacar conclusiones precipitadas! Los dos sucedieron perfectamente sincronizados. Me alegro de que no fueras tú. "Solo" un voto negativo no me importa.
Jacob Vlijm
2

En caso de que se use zsh en lugar de bash, la siguiente línea se ~/.zshrcune git statusa ALT+ ENTER.

bindkey -s '^[^M' 'git status\n'

Para obtener ALT+ ENTERen Bash, uso esta línea:

bind -x '"\e\C-m":git status'
mniess
fuente
¿Cómo se podría identificar los enlaces para otras claves?
Josh Habdas
1
@JoshHabdas mira aquí unix.stackexchange.com/questions/76566/…
mniess