撤消标签扩展?

bis*_*hop 5 command-line bash keyboard-shortcuts

在 bash 中,按下会Tab调用可编程完成功能,并且 (a) 扩展为唯一路径或与键入的内容匹配的命令或 (b) 可能选项的列表。

是否可以通过按来撤消整个扩展Tab?

例子:

  1. 我目前的命令是ls application/views/.
  2. 该命令有两种可能的扩展:helpers/和scripts/.
  3. 我输入heTab,它扩展到helpers/.
  4. 我意识到我的意思是另一个 scripts。
  5. 现在我必须删除整个扩展“helpers/”。

我通常只是在整个路径上退格(helpers/在这种情况下),因为我发现醒目的 readline undo Control+_乏味。我想要的是删除扩展的完整匹配的单个键序列,而不管我最初输入的任何字符以及末尾添加的任何空格或斜杠。


运行注释或我自己阅读的GNU 参考建议的键序列列表。这些都没有达到目标:

  • Meta+ b-- 移回上一个/或,但不删除。
  • Meta+ Del-- 删除一个字符,而不是整个单词。
  • Meta+ Backspace-- 向后移动一个字符而不删除。
  • Control+ W-- 删除整个路径,而不仅仅是扩展。因此,在我的示例中,按下 后Tab,bash 将其扩展为ls application/views/helpers,然后当我按下Control+ 时W,bash 删除application/views/helpers.

如果相关,我在 Gentoo Linux 机器上使用 vi 编辑模式。我检查了我的配置并且我没有重新映射任何字符。

mr.*_*tic 8

您提供的是击键,而不是readline 绑定,这可以解释观察到的行为(尝试bind -p)的差异。

我能想到的完全按照您的要求执行的唯一方法是使用保存缓冲区状态的自定义完成函数,以及调用伴随的 shell 函数来恢复它的单独键绑定。

除了@Mark Plotnick 使用 的极好建议menu-complete,其他 readline/bash 选项是:

  • shell-backward-kill-word 这将删除一个“shell word”,在扩展文件或路径的情况下,它将是完整的文件或路径名
  • backward-kill-word 这将删除“readline word”,在文件或路径的情况下,它将是文件或目录名称组件,包括尾随 /
  • undo它以原子方式撤消每个更改,但这几乎可以肯定需要多次尝试才能完全删除完整的扩展,这几乎可以肯定是您必须绑定到的功能ctrl- _(bash默认)
  • set-mark和kill-region是较少使用的 readline 功能,set-mark标记当前光标位置,并kill-region从标记到光标处删除。这需要您提前调用set-mark(默认meta- space),以便您以后可以使用kill-region删除回它(无默认绑定)
  • possible-completions(绑定到meta- =)它在不修改命令缓冲区的情况下列出完成

您也可以编写自己的函数来修改输入缓冲区,并将其绑定到一个函数(这是我之前创建的一个),但我不认为这会比backward-kill-word这种情况好得多。

您可以在不.inputrc使用 bashbind命令的情况下即时测试绑定,例如:

bind "\C-o: backward-kill-word"
bind "\C-o: shell-backward-kill-word"
Run Code Online (Sandbox Code Playgroud)

backward-kill-word是最合适的,默认绑定是metactrl- h。set-mark/kill-region会更好,但我想不出一种巧妙的方法来自动化使用它。