如何为终端命令创建键盘快捷键

如何为终端命令创建键盘快捷键

我经常使用 git,并且喜欢 iTerm2,因为它能够为命令设置键盘快捷键。例如,我将CTRL+设置ENTERgit status

使用 gnome-terminal 可以实现这一点吗?或者您可以推荐其他选项来实现这一点?

答案1

您可以使用bind -x将命令绑定到 Bash 中的快捷方式。例如,要将git status命令绑定到Crtl+p快捷方式,您可以使用:

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

将其放入~/.bashrc文件中以便记住它。来自手册页:

-x keyseq:shell 命令

每当输入 keyseq 时,都执行 shell-command。执行 shell-command 时,shell 将 READLINE_LINE 变量设置为 Readline 行缓冲区的内容,并将 READLINE_POINT 变量设置为插入点的当前位置。如果执行的命令更改了 READLINE_LINE 或 READLINE_POINT 的值,这些新值将反映在编辑状态中。

答案2

1. 自动打开一个新的终端窗口,显示命令的输出

由于您需要在命令运行后保持终端打开,因此输入:

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

快捷键组合下,即可完成此任务。它将打开新的 gnome-terminal窗口并在其中运行命令。

将其添加到快捷方式

选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。点击“+”并添加命令:

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

Ctrl+Enter

笔记

尽管您建议的快捷方式有效,但您可能会选择另一个组合键,然后是Ctrl+ Enter,因为它至少LibreOffice与跳转到新页面的快捷方式冲突。

解释

gnome-terminal从命令行打开新窗口并在其中运行命令,您可以使用:

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

但是,虽然命令将成功运行,但在您读取输出之前终端窗口将立即关闭。

这部分:

read line

Enter然后在命令运行后保持终端打开(直到您点击)。

其他命令

这样,您可以在终端中运行任何(复杂)命令,而无需立即关闭它:

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

将输出(如果wmctrl已安装):

在此处输入图片描述

按下后Enter终端将关闭。

2. 在当前活动的 gnome-terminal 窗口中运行命令

当然你可以在快捷键下放置一个简单的单行代码(假设您已经xdotool安装):

xdotool type "<command>"

但是这会输入命令盲目地, 在任何应用程序,以及打字该命令不是最干净的选项。

因此,下面的小脚本:

  • 查看活动窗口是否为gnome-terminal窗口(通过其 pid)
  • 如果是这样,糊状物活动窗口中的命令gnome-terminal,按下Return
    如果没有,脚本将执行没有什么,这样它就不会粘贴到其他应用程序中。

由于脚本将目标命令作为参数,因此您可以在多个快捷方式下放置多个命令。

剧本

#!/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)

如何使用

  1. 脚本需要xdotool

    sudo apt-get 安装 xdotool

  2. 如果目录尚不存在,则创建一个目录,~/bin注销/登录或运行source ~/.profile

  3. 将上述脚本复制到一个空文件中,保存为gterm_keys(无扩展名)~/bin使其可执行

现在你可以运行任何命令,通过快捷键,在最前面的gnome-terminal窗口中添加命令:

gterm_keys <command>

快捷键,如下所述[1]

答案3

如果使用 zsh 而不是 bash ,则以下行~/.zshrc绑定git statusALT+ ENTER

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

为了在 Bash 中获取ALT+ ENTER,我使用以下行:

bind -x '"\e\C-m":git status'

相关内容