制作 ”。” 和“源”默认为 ~/.zshrc

Rad*_*ugh 6 zsh alias

我想~/.zshrc通过.没有参数的运行来获取我的资源。所以这:

$ .
Run Code Online (Sandbox Code Playgroud)

应该这样做:

$ . ~/.zshrc
Run Code Online (Sandbox Code Playgroud)

我希望 的正常功能.保持不变。唯一的区别应该是何时.不带参数调用。

这可能吗?

我尝试了几种不同的方法。这是其中之一:

dot_zshrc_or_args() {
    if [[ $# == 0 ]]; then
        \. ~/.zshrc
    else
        filename=$1
        shift
        \. $filename $@
    fi
}
alias .=dot_zshrc_or_args
Run Code Online (Sandbox Code Playgroud)

这是一个示例,说明为什么它不起作用:

$ echo 'echo $#' > count_args.sh
$ delegate() { . ./count_args.sh }
$ delegate foo bar baz
Run Code Online (Sandbox Code Playgroud)

最后一个命令应该 echo 3,但0如果.已经定义了上述别名,它会回显。

基本问题似乎.是 shell 专门处理的问题,允许它调用的脚本访问所有局部变量,包括$1$2等。因此,如果我尝试使用.另一个函数包装,我将失去该行为(如上例所示)。

我想到的两种方法是:

  1. 使用别名而不是函数
  2. 使其.仅在交互式 shell中具有别名,而不是从另一个函数运行时。

但是,无论我尝试什么,我都无法让它发挥作用。是否可以?(如果没有,我可以使用的最接近的替代方案是什么?我的最终目标是能够~/.zshrc从 shell 中快速获取我的资源,最好以直观且易于记忆的方式。)

Pyt*_*Nut 9

这可以通过做一些可怕的事情来完成accept-line

function _accept-line() {
    if [[ $BUFFER == "." ]]; then
        BUFFER="source ~/.zshrc"
    fi
    zle .accept-line
} 

zle -N accept-line _accept-line
Run Code Online (Sandbox Code Playgroud)