AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 482827
Accepted
student
student
Asked: 2018-11-20 11:23:51 +0800 CST2018-11-20 11:23:51 +0800 CST 2018-11-20 11:23:51 +0800 CST

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

  • 772

假设我做类似的事情:

ln a_file_with_a_long_filename.pdf ~/path/to/a/new/hardlink/a_file_with_a_long_filename_slightly_modified.pdf

如果我的光标位于 zsha_file_with_a_long_filename.pdf中字符串的末尾,有没有办法引用和扩展?ln a_file_with_a_long_filename.pdf ~/path/to/a/new/hardlink/

如果没有,你会建议减少打字工作吗?

zsh line-editor
  • 4 4 个回答
  • 598 Views

4 个回答

  • Voted
  1. Gilles 'SO- stop being evil'
    2018-11-20T12:32:33+08:002018-11-20T12:32:33+08:00

    使用默认的 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+_撤消,然后重试。

    • 3
  2. Best Answer
    Jeff Schaller
    2018-11-20T11:53:29+08:002018-11-20T11:53:29+08:00

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

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

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

      ln !!$ ~/path/to/a/new/hardlink/!!$
      

    由于 zsh 的有用引用,即使面对包含 IFS 的文件名,这也是安全的。您会注意到,只要在第一个 之后点击空格!!$,zsh 就会扩展文件名;如果您在命令末尾添加一个免费空格,则同上。

    所需字符数为:

    • 3 x 2 = 6 两个!!$
    • 2 为:<SPACE>

    8 + 加上足够的初始选项卡完成。

    • 1
  3. thrig
    2018-11-20T12:55:14+08:002018-11-20T12:55:14+08:00

    在vi模式下,这将<esc>0wyt $p进入命令模式,0行首,w到下一个单词(前进到文件名)yt拉到空格(获取长文件名,假设文件名中没有空格),然后$p把刚才的在行尾猛拉。vi一旦你记住了动作,这比描述它要快得多。

    您也可以设置 abindkey来拉出第二个参数,尽管这是针对此类用例的非常具体的代码,此处绑定到,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
    
    • 1
  4. hchbaw
    2018-11-20T15:36:26+08:002018-11-20T15:36:26+08:00

    有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/” like copy-prev-shell-word,第二次将新插入的单词替换为“a_file_with_a_long_filename.pdf”)。


    这是一份copy-earlier-word文件副本供参考。

    这个小部件的工作方式类似于 和 的insert-last-word组合copy-prev-shell-word。小部件的重复调用检索相关历史行上的较早单词。使用数字参数N,插入历史行中的第N个单词;从行尾算起, N可能为负数。

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

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

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

    • 1

相关问题

  • 列出没有其他后缀文件的文件

  • 什么情况下路径中最先找到的可执行文件不会被使用

  • 符号链接所有点文件和目录

  • 如何在`zsh`中增加一个动态命名的变量

  • 为什么我不能在 zsh 中定义一个名为 path 的只读变量?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve