gpt4 book ai didi

bash - bash 中的复杂键绑定(bind)

转载 作者:行者123 更新时间:2023-11-29 08:51:14 25 4
gpt4 key购买 nike

有没有一种方法可以将两个操作组合成一个键绑定(bind)(不认为可以与函数一起使用)。

这是我想做的:

我想要一个键绑定(bind)(比如 Ctrl-X)到 -

  1. 插入一些文本,然后
  2. 调用完成或菜单完成,使用插入的文本作为完成的基础

我知道我可以(在 ~/.inputrc 中)指定

  • 使用 (C-X: "ls") 插入文本
  • 执行 readline 命令(C-SPACE: menu-complete)

但我不确定如何将它们放在一起

最佳答案

这样做的诀窍是调用重新绑定(bind)键的函数。在我的示例中,我将使用 C-b 来插入文本并调用 menu-complete,而不是 C-x。在我的示例中,您必须牺牲一个 key C-t

在 .bashrc 中,或者要获取的 bash 文件中

set_Cb_to_insert_text() {
bind '"\C-m": accept-line'
bind '"\C-b":"ls \C-t1"'
bind -x '"\C-t1":set_Cb_to_complete'
}
set_Cb_to_complete() {
bind '"\C-m":"\C-t2\C-t3"'
bind '"\C-b": menu-complete'
bind '"\C-t2": accept-line'
bind -x '"\C-t3":set_Cb_to_insert_text'
}
set_Cb_to_insert_text

这是如何工作的:

使用 bind,您可以绑定(bind)键来执行以下三种操作之一,但不能组合使用它们:

  • 执行一个 readline 命令:bind '"key": command'
  • 执行一系列击键:bind '"key":"keystrokes"'
  • 执行 shell 命令:bind -x '"key": shell-command'

所以如果你想结合这三件事,你需要将它们分别绑定(bind)到一个单独的击键组合(在我的例子中 C-t{1,< kbd>2,3}) 并绑定(bind)一个键来执行所有这些击键。

在例子中:

C-b 首先插入 ls 并 'presses' C-t1,这会执行 set_Cb_to_complete,它又将 C-b 重新绑定(bind)到 menu-complete。它还重新绑定(bind) C-m、回车或 Enter,因为它现在需要做两件事:接受该行,并重置 C-b 以插入ls,通过调用 set_Cb_to_insert_text 函数,该函数还将 Enter 重置为正常使用。

我说 C-t 必须“牺牲”的原因是,如果你按下 C-t,readline 会等着看你是否要按下 1,或 2,或任何绑定(bind)的键序列,在它采取任何操作之前。但是,当您第一次将 C-t 用于此用途时,您可以将它用作大量击键的初始键,以覆盖您所有的 readline 技巧。

一条建议:当你正在编写和测试这些时,将备用键绑定(bind)到 accept-line,因为突然有什么东西在错误的地方打破了链,你被困在一个没有终端的终端中一种执行命令的方法:)

关于bash - bash 中的复杂键绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8366450/

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