bash && zsh:引用/重复上一个命令行*参数*,同时仍然编写相同的行

bash && zsh:引用/重复上一个命令行*参数*,同时仍然编写相同的行

假设我正在输入一些复杂的命令,该命令重复其中一个命令行参数,或其中一个参数的某些变体,并且假设我正在处理非常长且复杂的命令行参数。

它将是以下模式之一,其中"foo"是非常长且繁琐的参数,并且"foo2"是它的变体,其中附加了“2”字符。

$ ./binary "foo" "foo"
[...]
# OR
$ ./binary "foo" "foo2"
[...]
# OR 
$ ./binary -x "foo" -y "foo"
[...]
# OR 
$ ./binary -x "foo" -y "foo2"
[...]

有什么方法可以让bash/zsh自动完成第二个实例,而"foo"无需手动复制和粘贴?

基本上,我正在寻找类似下面的内容,但在同一个命令行中,而不是引用前一个命令行。

$ echo one two three > /dev/null && echo !:2 !{:2}2
two two2

答案1

可能的(次优)解决方案:

# not ideal because it requires me to realize in advance
# that I will have to repeat "foo" on the same line
$ (FOO="foo"; ./binary "${FOO}" "${FOO}2")

答案2

“自动完成”可能不是最佳选择,但您可以使用 bash 中的 readline 函数(zsh 一定有类似的函数)。例如,

_myinsert() {
    local TOADD=${READLINE_LINE:0:$READLINE_POINT}
    TOADD=${TOADD% }
    TOADD=${TOADD##* }
    TOADD=" ${TOADD}2"
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${TOADD}${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=$(($READLINE_POINT + ${#TOADD}))
}
# cannot put this in ~/.inputrc
bind -x '"\C-xx":_myinsert'

当您在输入行的某个点_myinsert键入(任意绑定)时,这将调用该函数。bash 将该点的索引放在 中,并将整个输入行放在 中。然后,您可以从字符串中提取 point 之前的最后一个单词,根据需要对其进行操作,并在返回之前在同一变量中创建一个新的整个输入行。请记住还要更新索引点以考虑更改。Control-X X$READLINE_POINT$READLINE_LINE


我经常使用的一个鲜为人知的默认 bash 绑定是yank-last-arg,绑定到Meta-.(至少在 emacs 模式下)。它从上一个命令中复制最后一个单词。当我意识到我需要复制最后一个(长)单词时,我会在行#首添加一个,按回车键,按向上箭头再次获取命令,删除哈希,使用 control-E 转到末尾,然后使用 yank-last-arg。

相关内容