「ソース」ファイルの「.zwc」バージョンを自動的に使用します。

「ソース」ファイルの「.zwc」バージョンを自動的に使用します。

*.zwcZ-shell Wordコードファイルまたはコンパイルされたスクリプトと思われるファイルが見つかりましたzsh

任意のファイルを-ingするときは、source次の方法がありますかzsh

  • .zwcファイルが存在し、ファイルより最新の場合は、そのファイルを使用してください。
  • それ以外の場合は、ファイルをZ-shell Word Codeにコンパイルしてsourceから

関数のみを含むファイルがある場合、答えは異なりますか?

Z-shell Word Codeのチュートリアルはあまりないようですので、自由に教えてください。

答え1

少なくともファイルを使用するために.zwc何もする必要はありません。 〜のように.コマンドのZshマンページ状態:

[...]ファイル名文書.zwc'が見つかりましたが、文書、コンパイルされた形式です(zcompile組み込みを使用して生成されます)。文書、代わりにそのファイルからコマンドを読み取ります。文書

source検索順を除けばと同じなので同じだ。.


ラッパー関数を作成して、すべてのソーススクリプトの自動コンパイルを実行できます。たとえば、

source () {
    [[ ! "$1.zwc" -nt $1 ]] || zcompile $1
    builtin source $@
}

. () {
    [[ ! "$1.zwc" -nt $1 ]] || zcompile $1
    builtin . $@
}

もちろん、これらのラッパーは非常に簡単であるため、追加の障害保存が必要になる場合があります。たとえば、インポートしようとしているファイルがあるディレクトリに書き込みできない場合などです。また、ソースファイルに構文エラーがない場合でも、コンパイルが失敗する可能性があります。

答え2

に基づいてアダフォンの答えsource、私はとの完全な代替を書いています.

$@引数が指定されていない場合は転送動作が組み込まれているため、これは簡単ではありません。

必須エイリアスはコメントにあります。

compile-source-file:

# This file needs to be `sourced` to ensure a drop-in behaviour for `source` or `.`
# The shell passess "$@" to source if no arguments are given after the file to be sourced.

# Works in bash.

# Required aliases are:
# alias source='builtin source compile-source-file source "$#" "$@"'
# alias      .='builtin .      compile-source-file .      "$#" "$@"'

# zsh: compile functions before sourcing
# This function expects to be called with:
# $1 builtin to use, either `.` or `source`.
# $2 file to source
# $3... arguments to pass to sourced file
function compile_then_source () {
  local method=$1 file=$2; shift 2; local args=("$@")

  # ${var@Q} gives value of var quoted in a format that can be reused as input
  [[ $BASH_VERSION ]] && { eval builtin "$method" "$file" "${args@Q}"; return $?; }

  if [[ ! $file.zwc -nt $file ]]; then
    # Use canonical pathname for zrecompile's happiness
    if [[ -r $file && -w ${file:h} ]]; then zcompile "${file:P}"; fi
  fi

  eval builtin "$method" "$file" "${(q)args[@]}"
}

function main () {
  local use_builtin=$1  # '.' or 'source'
  local num_args=$2     # Number of elements in calling shell's $@, which follow
  shift 2;
  local wrapper_args=("$@")
  wrapper_args=("${wrapper_args[@]:0:$num_args}")
  shift "$num_args"
  local file=$1; shift;

  # Now $@ is the arguments passed after the file to be soured
  if [[ $# -ge 1 ]]; then # arguments were passed
    use_args=("$@")
  else  # use $@ from the wrapper args
    use_args=("${wrapper_args[@]}")
  fi
  compile_then_source "$use_builtin" "$file" "${use_args[@]}"
}

main "$@"

unset -f main compile_then_source

関連情報