gpt4 book ai didi

linux - Bash:使用自定义键盘快捷键调用脚本?

转载 作者:IT王子 更新时间:2023-10-29 00:56:07 27 4
gpt4 key购买 nike

假设我有一个脚本“myscript.sh”,其内容只是echo $PWD。我想以某种方式将此脚本绑定(bind)到 bash (gnome-terminal) 中的组合键 - 这样当我按下此组合键时,“myscript.sh”被插入(“粘贴”)在终端的光标位置。

显然,bash 历史和行操作由 readline 处理- 以及我为 bash 键盘快捷键获得的引用资料,引用 readline:

我也在 Bash Reference Manual: Readline Init File Syntax 中看到过bash 的键绑定(bind)可以通过使用 bind -p 列出(参见 help bind [不是 'man bind']更多)。所以也许这个问题的标题最好是“_binding macros to custom keyboard shortcuts in readline”:) 但无论如何,我想做的是什么?

我想另一种方法是让脚本类似于“pwd | xsel -b”,然后我在终端上调用它——然后我可以粘贴;但我仍然想要一个单一的键盘快捷键,比如 Ctrl-Alt-H(似乎没有用于任何用途),按下时会立即插入/粘贴脚本输出。

提前致谢,
干杯!


编辑:只是为了澄清 - 这是我想要这个设施的用例。我通常在项目文件夹中 cd,通常命名为 myproject-folder-0012a,它由 svn 进行修订控制.还有一堆这样的文件夹。因此,我经常在消息的第一个单词是目录名称的地方提交,如:

svn ci -m "myproject-folder-0012a: here a commit message"

但这是我不喜欢的 - 首先我输入 11 个字符,速度相当快:

svn ci -m "

然后,我无法使用自动完成来获取名称(我在文件夹中)- 这意味着我要么必须完全键入它(没办法:)),要么我复制粘贴它来自提示(这需要选择 - 按下鼠标,拖动,释放鼠标;然后是 Ctrl+Shift+C,然后是 Ctrl+Shift+V,如果我错过了对齐,加上任何左/右键 - 如果我做了,加上删除等等复制错误)。

意思是 - 这么多工作,只是为了获取血腥提交消息的血腥文件夹名称:( , 并完成它:)

我对 xsel 的建议只是因为我可以将它放入“全局”脚本中 - 将其符号链接(symbolic link)为 /usr/bin/myscript(和显然,脚本的内容是 echo $(basename $PWD) 而不是满足我需要的 pwd),然后我可以这样做:

$ myscript       # this puts directory name in clipboard
$ svn ci -m "[CTRL+SHIFT+V TO PASTE HERE]myproject-folder-0012a[NOW TYPE]: here a commit message"

... 这会减少工作量,但仍然 - 然后我必须记住脚本名称,然后调用它,之前 我键入 svn 命令(我并不总是记得)......而且 - 我仍然必须调用命令,然后按下组合键;为什么我不应该只按一次组合键,然后就完成了??! :)

好吧,希望这能更好地澄清我的问题....


EDIT2:但是,bash 键盘快捷键有用的另一个原因是,我不仅可以在 shell 命令中“粘贴/插入当前目录名称”,还可以在终端程序中使用,比如nano(可以说,直接使用 bash 脚本或函数扩展会更加困难)。

最佳答案

简单版:

shell 提示符下的命令:

bind '"\ee": "${PWD##*/}\e\C-e"'

或将此行添加到您的 ~/.inputrc:

"\ee": "${PWD##*/}\e\C-e"

将导致 Alt-e 在命令行上插入当前目录的基本名称。它要求存在 readline 函数 shell-expand-line 的默认绑定(bind),即 \e\C-e(如果不同,可以进行调整)。我还假设您正在使用 Bash 的 emacs 模式。

不幸的是,它会导致已经键入的内容也被扩展。其影响之一是在键入之后:

svn ci -m "

然后按Alt-e,引号就会消失。有几种方法可以解决这个问题。

第一,假设您将丢失的只是引号,然后手动将其添加回去或​​让 readline 宏为您添加:

bind '"\ee": "${PWD##*/}\e\C-e\eb\"\C-e"'

这不是很令人满意。

进阶版:

或者,两个,杀死线,插入,然后拉回线:

bind '"\ee": " \C-u \C-a\C-k${PWD##*/}\e\C-e\C-y\C-a\C-y\ey\b"'

bind '"\ee": " \C-u \C-a\C-k${PWD##*/}\e\C-e\C-y\C-a\C-y\ey\b\ef\C-f"'

这会使该行的其余部分保持不变(没有其他内容被展开或删除),但它使用了 kill ring,因此它可能会使其处于与您预期不同的状态(如果您正在使用它)。它还在插入的目录名称后插入一个空格(宏中的空格用于确保如果在行的开头或结尾执行宏,则不会反刍旧的 kill-ring 内容)。无论光标在行中的位置如何,宏都应该起作用。插入将在光标位置进行,使光标留在相同位置 [在第一个版本中]。

编辑:第二个版本将光标留在插入的目录名和空格之后。

编辑 2:

readline 函数 shell-forward-word(未绑定(bind))在这方面比 forward-word (\ef) 做得更好。您可以像这样使用它:

bind '"\ew":shell-forward-word'
bind '"\ee": " \C-u \C-a\C-k${PWD##*/}\e\C-e\C-y\C-a\C-y\ey\b\ew\C-f"'

顺便说一下,您应该知道 Bash 键盘快捷键在其他程序(例如 nano)中不可用。

关于linux - Bash:使用自定义键盘快捷键调用脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4119991/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com