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


16

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

gnome-terminal是否可以实现此功能,或者您可以推荐另一种选择来实现此目的?

Answers:


17

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

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

放入~/.bashrc文件以记住它。从手册页:

-x keyseq:shell命令

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


太棒了 我正在使用zsh,但是有一个等效的叫做bindkey。因此,要实现我想要的目的,我做到了: bindkey -s '^[^M' 'git status\n'绑定到ALT + ENTER。
mniess

1
bind -x '"\C-k":firefox'我使用了它,但是不起作用
alhelal '18

1
这在shell中有效,但我一直都想。
alhelal

将其放在~/.bashrc文件末尾。如果仍然无法使用,请检查此内容
Nykakin

有关使用的更多信息,请bind参见:stackoverflow.com/a/4201274/712334
Josh Habdas,

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]


嗨,雅各布,谢谢您的回答。我认为,尽管如此,bind(和bindkey)解决方案更好,因为它们是shell内置的。这样,我就不会在Libreoffice中意外地写“ git status”。;)
mniess

@mniess我同意答案是一个好答案,但记录下来,如果您仔细阅读我的答案,然后在LibreOffice中打印,那是不会发生的。但是你刚刚投票了吗?那真好笑。
Jacob Vlijm '16

我知道,脚本会检查正在运行的应用程序。我没有投票。我写评论是为了感谢您抽出宝贵的时间写出如此详细的答案。
mniess 16-3-24

@mniess啊,很抱歉得出结论!两者发生了完全同步。我很高兴不是你。“不”我不介意。
Jacob Vlijm '16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.