「。」そして、「ソース」をデフォルトとして~/.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エコーされます。.

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

心に浮かぶ2つのアプローチは次のとおりです。

  1. 関数の代わりにエイリアスを使用してください
  2. .他の関数で実行するときは使用せず、対話型シェルでのみエイリアスを使用するようにします。

しかし、いくら努力しても正常に動作できません。可能ですか? (そうでなければ私が使用できる最も近い選択肢は何ですか?私の究極の目標は、シェルからリソースをすばやく、できるだけ直感的で~/.zshrc覚えやすい方法でインポートできることです。)

答え1

これはひどいことをすることによって行うことができますaccept-line

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

zle -N accept-line _accept-line

答え2

必要に応じて組み込み関数を呼び出すには、functionforを作成します。また、シェル数の比較には正しくありません(奇妙でorが必要です)。..==test-eq-ne

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

関連情報