Bash命令在光标之前复制并在之后粘贴?

Bash命令在光标之前复制并在之后粘贴?

我不知道如何表达,但我经常发现自己输入这样的命令:

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

我通常只需输入两次路径(使用制表符补全),或者使用光标复制并粘贴路径。有没有一些 bashfoo 可以让输入更容易?

答案1

有很多技巧(我认为可以找到重复的技巧),但为此我倾向于这样做

cp /etc/prog/dir1/myconfig.yml{,.bak}

它将扩展到您的命令。

这被称为大括号扩展。在此处使用的形式中,{}表达式指定多个以逗号分隔的字符串。这些“扩展”整个/etc/prog/dir1/myconfig.yml{,.bak}表达式,{}依次用每个字符串替换部分:空字符串,给出/etc/prog/dir1/myconfig.yml,然后.bak,给出/etc/prog/dir1/myconfig.yml.bak。结果是

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

这些表达式可以嵌套:

echo a{b,c,d{e,f,g}}

产生

ab ac ade adf adg

有一种使用数字来生成序列的变体:

echo {1..10}

产生

1 2 3 4 5 6 7 8 9 10

您还可以指定步骤:

echo {0..10..5}

产生

0 5 10

答案2

历史扩展对于此类事情很有用(假设启用了 bash 历史记录)。

在你的例子中,你可以这样做:

cp /etc/prog/dir1/myconfig.yml !#:1.bak

这里,!#指的是当前行,!#:1指的是当前行上的参数1,
!#:1.bak的是当前行上的参数1,最后加上“.bak”。

当您输入历史说明符时,如果您想要仔细检查或修改文件名,可以使用Ctrl+ Alt+将其扩展为其实际值。E

bash 手册页中的“历史扩展”部分提供了更多信息。

答案3

与 progo 的答案类似,但稍微简单一些:C-w剪切(“杀死”)光标左侧的单词,C-y再次插入(“猛拉”)它。

$ cp /etc/dir1/myconfig.yml█                              (C-w)
$ cp █                                                    (C-y)
$ cp /etc/dir1/myconfig.yml█                              (space, C-y)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml█       (finish text)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml.bak█

答案4

tcshor中zshAlt+Ctrl+_emacs模式(copy-prev-word小部件)中插入最后一个单词,因此

cp 很长路径Alt+Ctrl+_.back

bash有一个copy-backward-word小部件(默认情况下不绑定到任何键),但仅将单词复制到环形缓冲区,您还需要按Ctrl-Y(在emacs模式下)将其拉出。但你可以这样做:

bind '"\e[cpw~": copy-backward-word'
bind '"\e\C-_": "\e[cpw~\C-Y"'

必须像/Alt+Ctrl+_一样进行复制/snarf 和粘贴/复制。tcshzsh

相关内容