假设我做了类似的事情:
ln a_file_with_a_long_filename.pdf ~/path/to/a/new/hardlink/a_file_with_a_long_filename_slightly_modified.pdf
如果我的光标位于zsh 中a_file_with_a_long_filename.pdf
字符串的末尾,有没有办法引用和展开?ln a_file_with_a_long_filename.pdf ~/path/to/a/new/hardlink/
如果不是,您建议如何减少打字工作?
答案1
使用默认的 Emacs 绑定,它只是两个键和弦:(ESC-2 ESC-^_
即Esc 2 Esc Ctrl+_或Alt+ 2 Ctrl+ Alt+ _)。这就是命令copy-prev-word
与数字参数 2 (默认参数 1 将复制~/path/to/a/new/hardlink/
)。如果文件名包含(带引号的)空格,则需要ESC-2 ESC-x copy-prev-shell-word RET
.您可能希望将此命令绑定到更方便的键,特别是如果您的键盘布局Shift需要_.您也可以在 vi 模式下使用这些命令,但默认情况下都不会绑定到按键。
如果数字参数错误,请按Ctrl+_撤消,然后重试。
答案2
这听起来像是一个有趣的代码高尔夫挑战。这是一种选择:
使用文件名运行无害的命令;输入足够的文件名以允许 TAB 补全。
: a_file<TAB>
用于
!!$
引用上一个命令的最后一个参数:ln !!$ ~/path/to/a/new/hardlink/!!$
感谢 zsh 的有用引用,即使面对包含 IFS 的文件名也是安全的。您会注意到,一旦您在第一个之后按下空格!!$
,zsh 就会扩展文件名;如果您在命令末尾添加无缘无故的空格,则同上。
所需字符数为:
- 3 x 2 = 6 两个
!!$
- 2 为
:<SPACE>
8 + 足以完成初始选项卡。
答案3
在vi
模式下,这将<esc>0wyt $p
进入命令模式,0
行的开头,w
到下一个单词(前进到文件名),yt
拉到空格(以获取长文件名,假设文件名中没有空格),然后$p
放置刚刚的内容拉到了线的末端。这比记住动作后描述要快得多vi
。
您还可以设置一个bindkey
来拉出第二个参数,尽管这是针对此类用例的非常具体的代码,这里绑定到,control+t但可以是您想要的任何内容。
function yank-put {
local -a words
words=(${(z)LBUFFER})
if (( $#words > 1 )); then
BUFFER+=$words[2]
CURSOR+=${#words[2]}
fi
}
zle -N yank-put
autoload -U yank-put compinit
compinit
set -o vi
bindkey -M viins "^t" yank-put
答案4
有copy-earlier-word
,您可以在使用它之前将其绑定到您最喜欢的键绑定,并将这些行附加到~/.zshrc
:
autoload -Uz copy-earlier-word
zle -N copy-earlier-word
bindkey "^[," copy-earlier-word
因此,您可以在命令行中这样使用:
% ln a_file_with_a_long_filename.pdf ~/path/to/a/new/hardlink/<Esc-,><Esc-,>
(第一次按下Esc- ,(或Alt+ ,)键会产生“~/path/to/new/hardlink/”,例如copy-prev-shell-word
,第二次它用“a_file_with_a_long_filename.pdf”替换新插入的单词)。
这是一份副本copy-earlier-word
文档供参考。
这个小部件的工作方式类似于
insert-last-word
和copy-prev-shell-word
。重复调用小部件会检索相关历史记录行上较早的单词。带数字参数氮,插入氮历史行中的第一个字;氮从行尾开始计数可能为负数。如果
insert-last-word
已用于检索上一个历史行中的最后一个单词,重复调用将用同一行中较早的单词替换该单词。否则,小部件将应用于当前正在编辑的行上的单词。小部件样式可以设置为应调用以检索单词的另一个小部件的名称。该小部件必须接受与以下相同的三个参数
insert-last-word
。--
copy-earlier-word
ZLE 函数、小部件、zshcontrib(1)