zsh:在当前命令行中扩展先前的参数

15

我经常想要执行简单的命令,例如:

cp /really/long/path/from/file.txt /really/long/path/to/file.txt

尽管我已经经常使用像!!!$ 这样的快捷方式,但是能够引用当前命令行中的最后一个参数(并可选地展开以进行编辑)会很方便。在zsh中有没有这样做的方法,或者其他等效的技巧可以节省时间?

2个回答

29

通常情况下,您可以使用历史扩展来引用当前命令行中的单词。

$ cp /really/long/path/from/file.txt !#:1:s/from/to
或者
$ cp /really/long/path/from/file.txt !#:$:s/from/to

!# 是历史扩展,用于命令行中已经输入的部分。 :1 指定该扩展中的第一个参数(在本例中为长文件路径)。:$ 可以代替使用,无论已经输入了多少个参数,它都可以引用最后一个参数。:s/from/to 在所选单词上执行文本替换。

对于此任务,您还可以使用大括号扩展:

$ cp /really/long/path/{from,to}/file.txt

(注意:这两个技巧都来自于bash,但在zsh中也适用。可能还有其他我不知道的仅限于zsh的技巧。)


完美,这两个功能正是我正在寻找的。我认为大括号扩展可能是更明智的选择,特别是因为我很可能会忘记 !# 表示当前行。 - robbles

2
你可以按下Tab键来在zsh中展开内容,例如:
如果我先输入以下命令
% ls /etc 

在接下来的这一行中,我要做的是

% !!<Tab>
< p > !!将被替换为

< p >“!!”将被替换为

% ls /etc

我可以按照自己的方式编辑这个内容。这适用于很多东西,比如*和环境变量。例如,在$TERM后敲击Tab键,将会用(在我的情况下)xterm-256color替换(扩展)它。


很有帮助 - 我不知道你可以在当前命令行中扩展历史记录。你知道是否有一种方法可以“撤消”扩展吗? - robbles
1
不确定emacs绑定,但是使用vi绑定时,您需要按esc然后按u来撤消上一次操作。 - lmcanavals
这意味着以前的第一个参数可以用!!:1来扩展,只是为了清晰明了 :) - dza

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