在Vi模式下,bash/readline中有哪个与escape-dot等价的功能?

11

最近我在bash中切换到了vi模式,唯一想念的就是使用esc.获取上一个命令的最后一个参数。

我知道可以使用ctrl_来获取,但我总是会误按ctrl-

是否有另外一个类似vi模式的替代方法呢?

6个回答

10

我认为最接近你想要的解决方案是这个:

在你的 .bashrc 文件中,在 "set -o vi" 之后...

set -o vi
bind -m vi-command ".":insert-last-argument

这会告诉你的bash,在vi命令模式下使用“.”时调用“插入最后一个参数”操作。当然,这意味着你失去了VI的正常“.”功能;但如果你像我一样,你会更喜欢这种方式。

补充说明: 你可能还想让 Ctrl-A, Ctrl-E, Ctrl-WCtrl-L 起作用(这些是我最需要的):

bind -m vi-command ".":insert-last-argument
bind -m vi-insert "\C-l.":clear-screen
bind -m vi-insert "\C-a.":beginning-of-line
bind -m vi-insert "\C-e.":end-of-line
bind -m vi-insert "\C-w.":backward-kill-word

2
可悲的是,这个解决方案无法循环遍历参数。 - leoluk
我知道这个很老了。但是我的同事刚刚向我展示了以下内容,它完全复制了行为,只是添加了一个空格(想想看)。不幸的是,我还没有成功地将其映射到Esc-.组合键上。所以有一些肌肉记忆需要打破。无论如何,这里是代码: bind -m vi-insert C-k:yank-last-arg我选择C-k只是因为它没有用于任何有用的东西,而且似乎类似于“Ctrl Up”。 - Neg_EV
1
每次按键结束时的点真的有必要吗?与这个解决方案进行比较。 - Serge Stroobandt

6
您也可以使用以下方法在vi模式下恢复emacs的“转义-句点插入最后一个参数”行为:
bindkey -v '\e.' insert-last-word

3
通过更改或添加~/.inputrc
要在vi模式下恢复某些bash功能,只需像以下这样更改或添加~/.inputrc:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

set editing-mode vi
set keymap vi-insert

$if mode=vi
"\C-a": beginning-of-line
"\C-e": end-of-line
"\C-l": clear-screen
"\C-n": next-history
"\C-p": previous-history
"\C-w": backward-kill-word

"\e.": yank-last-arg
"\e_": yank-last-arg
$endif

这里有更多可绑定的readline bash命令


2
我经常使用alt .来获取上一条命令的最后一个参数。
另外,!$会给你上一条执行的命令的最后一个参数。感叹号有很多酷炫的用法,只需查看bash的man页面并搜索历史扩展即可。

我认为在vi模式下<kbd>alt</kbd> <kbd>.</kbd>无法使用。历史扩展很酷。我知道一些东西,但不知道如何找到其他的。 - rouge8

1

可以考虑使用 $_ bash 变量,怎么样?


-1

我相信你仍然可以使用vi模式的等效方式,应该是“ESC + .”


2
在 vi 模式下,按 Esc + . 可以进入插入模式,然后 . 会重复您最后一次输入的内容。所以:touch test.txt; vi "Esc+." 将在第二行中给出 vivi。 - rouge8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接