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

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

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

$ .

应该这样做:

$ . ~/.zshrc

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

这可能吗?

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

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

这是一个示例,说明了它不起作用的原因:

$ echo 'echo $#' > count_args.sh
$ delegate() { . ./count_args.sh }
$ delegate foo bar baz

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

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

我想到的两种方法是:

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

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

答案1

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

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

zle -N accept-line _accept-line

答案2

编写一个functionfor..根据需要调用内置函数。另外,==对于 shell 数字比较来说是不正确的(test很奇怪,并且需要-eqor -ne)。

function . {
    if [[ $# -eq 0 ]]; then
        builtin . ~/.zshrc
    else
        builtin . "$@"
    fi
}

相关内容