如何在 Zsh 命令行中展开所有变量?

如何在 Zsh 命令行中展开所有变量?

在之前的一个针对 bash 的问题中,我问如何在命令行中扩展相对路径并使用制表符补全?

我喜欢 @Mikel 的答案,其中提到使用Ctrl+ Alt+e来扩展所有变量,并且我经常使用它。

从那时起,我已经切换到zsh,虽然我可以键入$PWD并按Tab以展开当前目录的路径,但如果我键入类似的内容$PWD/.profile并按Tab它不会展开。

我已经阅读了类似的问题,并且看到了有关扩展别名的答案,以及如何通过键入变量并按来扩展变量,但没有什么与在 中按+ +Tab相同 。CtrlAltebash

是否有某种方法允许转义序列(例如Ctrl+ Alt+)e展开正在输入的命令行中的所有变量zsh

答案1

您可以设置编译扩展您的参数~/.zshrc

zstyle ':completion:*' completer _expand _complete
autoload -Uz compinit
compinit

这是一个最小设置,如果您有编译_expand已经启用,添加到设置应该就足够了completer

还有一个expand-word默认绑定到^X*( Ctrl+ x *) 的小部件,其本质上与 bash 中的绑定相同。

注意:这两种方法仅适用于当前单词。


作为替代方案,zsh您实际上可以执行原始问题中所要求的操作:将相对路径转换为绝对路径。以下是zshcontrib(1)联机帮助页中的一个稍作修改的示例:

# load necessary utility function
autoload -Uz modify-current-argument

# define helper function for actual work
expand-and-abspath () {
    # expand the path (for example `~` -> `/home/youruser`)
    REPLY=${~1}
    # transform into absolute path (use `:A` if you want to resolve symlinks)
    REPLY=${REPLY:a}
}

# actual widget function
abspath-word() {
    # use helper function on current word
    modify-current-argument expand-and-abspath
}

# create zle widget `abspath-word` (with function of the same name)
zle -N abspath-word

# bind widget to "Ctrl+x p"
bindkey '^Xp' abspath-word

这定义了abspath-word小部件,它用绝对路径表示替换当前单词并将其绑定到Ctrl+ xp

答案2

要扩展参数、算术和命令替换(而不是别名和其他形式的扩展),您可以执行以下操作:

my-expand() BUFFER=${(e)BUFFER} CURSOR=$#BUFFER
zle -N my-expand
bindkey '\e^E' my-expand

(它也有类似的限制,并且几乎和 一样危险bash)。

相关内容