web-dev-qa-db-ja.com

「。」を作成します「ソース」のデフォルトは〜/ .zshrcです。

引数なしで~/.zshrcを実行して、.を調達したいと思います。したがって、この:

$ .

これを行う必要があります:

$ . ~/.zshrc

.の通常の機能は変更しないでください。唯一の違いは、.が引数なしで呼び出された場合です。

これは可能ですか?

私はいくつかの異なるアプローチを試しました。これがそれらの1つです:

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

最後のコマンドは3をエコーする必要がありますが、上記の0のエイリアスが定義されている場合は、.をエコーし​​ます。

基本的な問題は、.がシェルによって特別に処理され、それによって呼び出されるスクリプトが$1$2などを含むすべてのローカル変数にアクセスできるようになることです。したがって、.を別の関数でラップしようとすると、その動作が失われます(上記の例のように)。

私が考えていた2つのアプローチは次のとおりです。

  1. 関数の代わりにエイリアスを使用する
  2. .が別の関数から実行される場合とは対照的に、インタラクティブシェルでのみエイリアスされるようにします。

何をしようとしてもうまくいきません。出来ますか? (そうでない場合、使用できる最も近い代替手段は何ですか?私の最終目標は、できれば直感的で覚えやすい方法で、シェルから~/.zshrcをすばやく調達できるようにすることです。)

4

これは、accept-line

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

zle -N accept-line _accept-line
7
PythonNut