Zsh 引用当前参数列表的最后一个元素并将其展开

Zsh 引用当前参数列表的最后一个元素并将其展开

假设我做了类似的事情:

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

这听起来像是一个有趣的代码高尔夫挑战。这是一种选择:

  1. 使用文件名运行无害的命令;输入足够的文件名以允许 TAB 补全。

    : a_file<TAB>
    
  2. 用于!!$引用上一个命令的最后一个参数:

    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-wordcopy-prev-shell-word。重复调用小部件会检索相关历史记录行上较早的单词。带数字参数,插入历史行中的第一个字;从行尾开始计数可能为负数。

如果insert-last-word已用于检索上一个历史行中的最后一个单词,重复调用将用同一行中较早的单词替换该单词。

否则,小部件将应用于当前正在编辑的行上的单词。小部件样式可以设置为应调用以检索单词的另一个小部件的名称。该小部件必须接受与以下相同的三个参数insert-last-word

--copy-earlier-wordZLE 函数、小部件、zshcontrib(1)

相关内容