在 bash 中,按下Tab会调用可编程完成功能,并且 (a) 扩展为与键入内容匹配的唯一路径或命令,或者 (b) 可能选项的列表。
是否可以撤消整个扩展Tab通过按?制成
例子:
- 我当前的命令是
ls application/views/
. - 该命令有两种可能的扩展:
helpers/
和scripts/
。 - 我输入heTab,它扩展为
helpers/
. - 我意识到我意思是另一个
scripts
。 - 现在我必须删除整个扩展“helpers/”。
我通常只是在整个路径上退格(helpers/
在本例中),因为我发现引人注目的阅读行撤消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 编辑模式。我检查了我的配置,没有重新映射任何字符。
答案1
你给出的是击键,但不是读取线绑定,这可以解释观察到的行为的差异(尝试bind -p
)。
我能想到的唯一方法确切地您要求的是使用保存缓冲区状态的自定义完成函数,以及调用配套 shell 函数来恢复缓冲区状态的单独键绑定。
除了 @Mark Plotnick 的出色建议之外menu-complete
,其他 readline/bash 选项还有:
shell-backward-kill-word
这会删除“shell 单词”,在扩展文件或路径的情况下,该“shell 单词”将是完整的文件或路径名backward-kill-word
这会删除“readline word”,在文件或路径的情况下,该“readline word”将是文件或目录名称组件,包括尾随/
undo
它以原子方式撤消每个更改,但这几乎肯定需要多次尝试才能完全删除完整的扩展,这几乎肯定是您绑定到的函数ctrl- _(bash 默认值)set-mark
和kill-region
是较少使用的阅读行功能,set-mark
标记当前光标位置,并kill-region
从标记到光标进行删除。这需要您提前调用set-mark
(默认meta- space),以便稍后可以使用kill-region
删除回它(无默认绑定)possible-completions
(绑定到meta- =)列出了完成情况没有修改命令缓冲区
您还可以编写自己的函数来修改输入缓冲区,并将其绑定到函数(这里是我之前做的一个backward-kill-word
)但我不知道这会比这种情况好得多。
.inputrc
您可以在不使用 bash 命令的情况下即时测试绑定bind
,例如:
bind "\C-o: backward-kill-word"
bind "\C-o: shell-backward-kill-word"
backward-kill-word
是最合适的,默认绑定是metactrl- h。set-mark
/kill-region
会更好,但我想不出一种巧妙的方法来自动化使用它。