vi模式下bash中最后一个命令的最后一个参数


19

我已经说服了(在Stack Overflow上)在vi模式下使用我心爱的bash。到目前为止,我已经很好地适应了它,并且我喜欢它。

但是,我确实确实错过了一个功能:在emacs模式下,您可以通过按“ ESC”输入上一个命令的最后一个参数。(即,按Escape键,然后按.。)

是否有默认绑定在vi模式下插入最后一个参数?我找不到一个,我真的很想念此命令...

Answers:


9

没有默认值。切换到vi模式时,“ yank-last-arg”的绑定(如“ bind -p”列出的绑定)会消失。

bind '"\e."':yank-last-arg

会给你同样的约束力(或选择其他东西)


1
zsh的克隆bindkey "\e." insert-last-word
jhvaras 2015年

我在zsh上使用它已有多年了,每次我被迫使用bash(例如在工作中的服务器上)时,我总是忘记我从未想过如何在bash上进行设置。不再!history-search-backwards对于认真的命令行用户来说,这是非常宝贵的。
Sridhar Sarnobat


7

并不完全相同,但是在任何一种模式下都可以键入!$,它将被上一个命令的最后一个单词替换。在手册中查找更多此类内容。


足够接近以得到upvote但不完全相同...我错过了在执行该行之前对其进行编辑的可能性。但是还是要多谢!
密苏里州

5

〜/ .inputrc文件文件可以配置键映射(可以手动生成它,如果它无法找到)。将以下命令添加到〜/ .inputrc中

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

我的〜/ .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

"\C-p": previous-history
"\C-n": next-history
"\C-a.":beginning-of-line
"\C-e.":end-of-line

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

您可以找到有关细节的readlinebind -p这里:http://linux.about.com/library/cmd/blcmdl3_readline.htm

以及有关bashReadline VI编辑模式备忘单中的Vi键盲的一些信息


3

在您的.bashrc内,添加以下内容:

set -o vi
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

这些不仅可以恢复ESC点的默认行为,还可以恢复Ctrl-A,Ctrl-E,Ctrl-W和Ctrl-L的默认行为。因此,您可以享受普通的bash vi模式,并且仍然使用您知道和喜爱的快捷方式。如果需要更多操作,只需选中“ man bash”以查找所需的读取行操作的名称(例如“ clear-screen”,“ line-of-line”等)。


0

您可以$_用来引用上一个命令的最后一个参数。

缺点是:

  1. 在按Enter键之前,您无法验证插入的东西是您要插入的东西。

  2. 如果您使用PROMPT_COMMAND或DEBUG陷阱(我不确定是哪一个导致了问题;我的.bashrc中都包含了这些错误)会做一些花哨的事情,例如将运行中的命令放到xterm标题中,这会导致问题$_

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.