コマンドなしでzshで用語を評価する

コマンドなしでzshで用語を評価する

zshを使用していますプレスト楽章構成フレームワーク。同様の用語を入力して1 + 2 * (3 / 4)「2.5」を取得できることを願っています。

これらの用語は、次のような特定の文字のみを含むために認識できます0123456789 +-*/()。より複雑なタスクの場合は、Pythonシェルなどの専用プログラムを開くことができます。

解決策が不十分

  1. 使用プログラムpython -c:用語の前に入力したり、に入力したくありませんbc。入力が多すぎます。もっとうまくできたらいいですね。
  2. 関数またはエイリアスの使用:少しあります。解決策cORを使用する場合と同様に、=これらの計算を実行できます。素晴らしいですが、基本的にポイント1と同じです。calc= 1 + 2 * (3 / 4)
  3. 他のシェルの使用:わかりましたジェンシー私はこれを行うことができる他のシェルがあると確信しています。しかし、私はzshが好きで、シェルを変更したくありません。

何がうまくいくのか

  1. zshプラグイン:コマンドが特定の正規表現と一致することを確認し、それをpython / bc / whateverにパイプするzshプラグインを想像できます。ディレクトリ名だけを入力すると、autocdが実行する操作とはやや似ています。これが可能かどうかわかりません。いくつかのヒントを聞きたいので書いてみましょう。
  2. 傍受command not found:4に似ています。コマンドが見つからない場合は、zshの動作を傍受することが可能かもしれません。しかし、どうすればいいのかわかりません。
  3. すべての番号のエイリアス:すべての数字のエイリアスを作成して、残りの数学文字列を引数として使用するコマンドにすることができるようです。これはうまくいくかもしれませんが、陳腐に見えます。また、「すべての数字」は、自動的にコードを生成する場合でもエイリアスです。

この問題を解決する方法のアイデアを聞きたいです。私はコードを書くのを恐れませんが、ハッキングされたソリューションよりもきれいなソリューションを好みます。

ベストアンサー1

コマンドが実行される前に傍受することは可能ですが、遅すぎます。コマンドはすでに解析され、エイリアスが拡張されました。たとえば、これは見つからないコマンド(該当する名前のコマンドがないと仮定)2 * 3として表示され、その後に現在のディレクトリにあるファイルのリストが表示されます。2

代わりに、コマンドが送信された直後に(解析される前でも)コマンドをブロックする必要があります。したがって、コマンド実行エンジンではなくコマンドラインインターフェイスに接続する必要があります。これを行う一般的な方法はないと思います。私が考えることができる唯一の方法は、Enterキーコマンドとその兄弟コマンドを無視してコマンドラインを上書きすることです。きれいではありませんが、好きなように機能します。

主なEnterキーコマンドは次のとおりです。accept-line、にバインディング^J^M。次のようにこれをオーバーライドできます(たとえば、accept-and-hold使用する他の同様のウィジェットに対してこれを行う必要がありますaccept-line-and-down-history)。

function my-accept-line {
    my-rewrite-accepted-line "$@"
    zle accept-line "$@"
}
zle -N my-accept-line
bindkey '^J' my-accept-line
bindkey '^M' my-accept-line

これで、関数に許可された行を再作成するようになります。このルートは次の場所にあります。BUFFER。唯一の難しさは書き直されたロジックです。おそらく、次のように、行は数字(変数ではなくあまりにもあいまいです)で始まり、オプションで単項演算子と括弧が前に続き、その後にバイナリ演算子が続くはずです。

function my-rewrite-accepted-line {
  emulate -L zsh
  setopt extended_glob
  if [[ ${BUFFER// /} == [\(+\-]#([0-9]##(|.[0-9]#)(|e(-|+|)[0-9]##)|0x[0-9A-Fa-f]##)[-+*/%\&\|\^]* ]]; then
    BUFFER="echo \$(($BUFFER))"
  fi
}

私はベアzshを使って最小限のテストしか行いました。これがPreztoを妨害しているかどうかは調べていません。

おすすめ記事