我知道Esc +。给出最后一个命令的最后一个参数。
但我对最后一个命令的第一个参数感兴趣。 是否有一个键绑定来这样做?
在同一行中,是否有从最后一个命令中获取第n个参数的通用方法? 我知道在bash脚本中,您可以使用$0,$1等,但这些在命令行上不起作用。
同样,如果遍历前面命令的第0个参数,就像我们连续按Esc +对最后一个参数所做的那样,会怎么样呢?
我知道Esc +。给出最后一个命令的最后一个参数。
但我对最后一个命令的第一个参数感兴趣。 是否有一个键绑定来这样做?
在同一行中,是否有从最后一个命令中获取第n个参数的通用方法? 我知道在bash脚本中,您可以使用$0,$1等,但这些在命令行上不起作用。
同样,如果遍历前面命令的第0个参数,就像我们连续按Esc +对最后一个参数所做的那样,会怎么样呢?
当前回答
我非常喜欢@larsmans的回答,所以我必须多学一些。添加这个 回答帮助其他人找到手册页部分,并知道要做什么 谷歌:
$ man -P 'less -p ^HISTORY\ EXPANSION' bash
<...>
Word Designators
Word designators are used to select desired words from the event.
A : separates the event specification from the word designator.
It may be omitted if the word designator begins with a ^, $, *, -,
or %. Words are numbered from the beginning of the line, with the
first word being denoted by 0 (zero). Words are inserted into the
current line separated by single spaces.
0 (zero)
The zeroth word. For the shell, this is the command word.
n The nth word.
^ The first argument. That is, word 1.
$ The last argument.
% The word matched by the most recent ‘?string?’ search.
x-y A range of words; ‘-y’ abbreviates ‘0-y’.
* All of the words but the zeroth.
This is a synonym for ‘1-$’.
It is not an error to use * if there is just one word in
the event; the empty string is returned in that case.
x* Abbreviates x-$.
x- Abbreviates x-$ like x*, but omits the last word.
If a word designator is supplied without an event
specification, the previous command is used as the event.
其他回答
在接受的答案后面描述的方法对我来说也适用于第0个参数。在我的~/.inputrc中有这些行:
"\en": "\e0\e."
"\em": "\e1\e."
"\e,": "\e2\e."
\ e2 \ e。与\e2\e\C-y相比,它的优点是,如果重复按下它,它会循环执行前面的命令,而不是多次插入前面命令的第二个参数。
要插入之前的整个命令,可以输入!!\e^。\e^是history-expand-line。
^可能是第一个参数的命令。我不确定是否有办法得到第n个。
要粘贴第一个参数,请按住Alt键,当它向下时,按下'1'键和'。的关键。
要粘贴第n个参数,将上面的'1'键替换为相应的数字键。
如果这不起作用,您的终端模拟器可能在它到达shell之前捕获Alt键。一些终端(xfce4-terminal)允许关闭配置文件中的“Alt-”快捷键。
这要归功于Jonas Eberle,我从他的评论中找到了另一个答案。
在Ubuntu 18.04上测试
插入先前的参数:
Alt +。:插入最后一个命令的最后一个参数。 Alt + # +。:从最后一个命令中插入#n个最后一个参数。 Alt+- # Alt+。, zsh: Alt+-+#+。:插入上一个命令的第n个参数。
在Linux中,您可以重复命令以返回历史
例子:
最后一个命令是:
mv foo bar
Alt + 0 +。:插入最后一个命令的第一个参数= mv Alt + 2 +。:插入最后一个命令的最后第二个参数= foo up, Ctrl+w:最后一个不带最后一个字的命令= mv foo
通用快捷键
Ctrl+w:从光标中删除最后一个单词 Alt+d:从光标中移除下一个单词 Ctrl+k:剪切光标后的所有内容 Ctrl+u, zsh: Alt+w:剪切光标前面的所有内容 zsh: Ctrl+u:切断整个命令(在bash中,您可以组合Ctrl+u, Ctrl+k) Ctrl+y:粘贴之前用Ctrl+u和Ctrl+k剪切的字符 Ctrl+_:撤销上次编辑(当超过Ctrl+w时非常有用) Ctrl+左:移动到最后一个单词 Ctrl+右:移动到下一个单词 home或Ctrl+a:移动到行首 end或Ctrl+e:移到行尾
要遍历前面命令中的参数
只适用于ZSH
运行或将其添加到~/.zshrc
autoload -Uz copy-earlier-word
zle -N copy-earlier-word
bindkey "^[:" copy-earlier-word
现在使用Alt+。,然后使用Alt+:遍历参数
假设最后一个命令是
echo 1 2 3 4 5
替代+.: 5 Alt+.+:: 4 Alt+.+:+:: 3 替代+.+:+:+: 2 其他+.+:+:+:+: 1 Alt+.+:+:+:+:: 回声
来源:https://stackoverflow.com/a/34861762/3163120
查看所有可用的快捷方式
Bash: bind -lp zsh: bindkey -L
我在这里保持最新消息:https://github.com/madacol/knowledge/blob/master/bash-zsh_TerminalShorcuts.md
就像M-。(meta-dot或esc-dot或alt-dot)是readline函数yank-last-arg, M-C-y (meta-control-y或esc-ctrl-y或ctrl-alt-y)是readline函数yank-n -arg。在不指定n的情况下,它会提取上一个命令的第一个参数。
要指定参数,请按Escape +数字或按住Alt +数字。您可以执行Alt—开始指定一个负数,然后释放Alt并按下数字(这将从参数列表的末尾开始计数。
例子:
输入以下命令
$ echo a b c d e f g
a b c d e f g
现在在下一个提示符处,键入echo(后面有空格),然后
按Alt-Ctrl-y,你现在会看到:
$ echo a
不按Enter,执行以下操作
按Alt-3 Alt-Ctrl-y
按Alt- 2 Alt- ctrl -y
现在你会看到:
$ echo ace
顺便说一下,你可以通过选择参数0来把echo放在行上:
按Alt-0 Alt-Ctrl-y
编辑:
要回答你在原文中添加的问题:
您可以按Alt-0,然后反复按Alt-。步进执行前面的命令(arg 0)。类似地,Alt—然后重复Alt-。将允许您逐步检查之前的倒数第二个参数。
如果对历史上的某一行没有适当的论证,就会敲响警钟。
如果有一个您经常使用的特定组合,您可以定义一个宏,这样一次击键就可以执行它。本例将通过按Alt-Shift-Y收回前面命令中的第二个参数。您可以选择任何可用的击键,而不是这个。您可以重复按下该键来执行先前的操作。
要尝试一下,在Bash提示符下输入宏:
bind '"\eY": "\e2\e."'
要使它持久,将这一行添加到~/。inputrc文件:
"\eY": "\e2\e."
不幸的是,这似乎不适用于参数0或负参数号。