34

私は現在、emacs (aquamacs) に切り替えており、ワークフロー全体を一度に 1 ステップずつ (組織モード、dired など、パスファインダー、記法速度などから) 移行する過程にあります。

私がまだ試していないことの 1 つ (そしてこれまでのところ最大の障害のようです) は、組み込みの emacs シェル (シェルおよび/または eshell、ここでは「eshell」と呼ばれます) です。自分。必要な変換/適応手順を本質的に反映/最小化する方法があるかどうかはわかりません.....

私の質問:

  1. eshell を zsh のスーパーセットとして扱うことはできますか (つまり、eshell は zsh ができることすべてに加えて、さらに多くのことができます)? eshell は標準シェル (bash、zsh、ksh、tcsh など) に比べてかなり欠けていると思います。

  2. zsh で eshell を使用する際の主な制限は何ですか? zsh から eshell に切り替えて、あなたが決定的に見逃している zsh の側面があると感じている人はいますか?

  3. zsh/eshell機能の比較を行っているリンク/リソースを知っている人はいますか?

  4. さらに、通常のシェルから eshell に変更するためのリソースはありますか? ワークフローの移行に関するアドバイスはありますか?

  5. eshell が zsh ほど「強力」でない場合、eshell は zsh よりもどのような利点がありますか? Emacs 内で eshell を使用する際の、学習に費やす時間を説明するヒントやコツはありますか?

  6. 私が必要だと思うすべてのことができるのであれば、eshellをあきらめてzshを使い続けるべきですか?それとも、価値のあるいくつかの「パワーワークフロー」がありますか(私は知りません)?

事前にt​​hnx。

4

3 に答える 3

41

についてM-x eshell

  1. Eshell はスタンドアロンのシェルではありません。これは純粋な elisp で実装されているため、emacs の外部で実行することはできません。そのため、標準シェルの 1 つではありません。bash/zsh/etc のような独自のスクリプト言語はありません。持ってる; elisp と、elisp の呼び出しを少しきれいにするためのコマンド解釈機能があります。

  2. zsh と eshell について話すことはできませんが、ほとんど bash から eshell に切り替えました。95% の確率で、eshell は私がやりたいことや必要なことをすべて問題なく実行してくれます。sshには使いません。また、プロセスが開始されると、そのプロセスをバックグラウンドにすることはできません (ただし、バックグラウンドで開始することはできます)。

  3. zsh には完全なスクリプト言語があるのに対し、eshell は基本的に elisp インタープリターへのインターフェースであるため、これは非常に困難です。対話型シェルに何を求めていますか? Eshellはおそらくそれのほとんどを行うことができます. コマンドラインでの条件付きステートメントとループ? もちろん。エイリアス、関数、ワイルドカード、プログラム可能な補完? もちろん。

  4. 私が移行した方法は、基本的にゼロから始めることでした。気に入らないものや、そうしたいものに出くわすたびに、どうすれば自分のやりたいことができるようになるかを考えていました。たとえば、eshell はプログラム可能な補完に pcomplete.el を使用するため、補完関数の追加は非常に簡単です。

  5. emacs との統合は、私にとって大きな成果です。elisp 関数をシェル コマンドにパイプすることができます。ばかげた例として、次を試してください。

    message "hello world" | cut -f 1 -d ' '
    一部のコマンド (特に grep) は emacs バッファーに入れられるため、たとえば結果にすばやくジャンプできます。

  6. 実際に emacs で費やす時間によって異なります。すべてを emacs で行う場合は便利です。なぜなら、eshell を介して elisp コマンドを他のコマンドと一緒にパイプする方が簡単な場合があるからです。emacs とシェルの間で頻繁にコピー アンド ペーストを行っていない場合は、おそらく成功することはなく、慣れるまで時間をかけてカスタマイズする必要があります。

eshell の代わりに、M-x shellすべてのコマンドを解釈する通常のシェルを実行し (そのため、elisp 関数にアクセスできません)、コマンドライン編集 (したがってプログラム可能な補完、履歴など) は emacs によって行われます。sshに使用しています。

もう 1 つの代替手段はM-x term、emacs 内のターミナル エミュレーターであり、通常はその下でシェルを実行し、シェルは通常のすべてのことを行います。その場合、変換/適応手順はまったく必要ありません。

于 2010-10-12T20:20:36.017 に答える
7

異なる構文

eshellコードをシェルコマンドと混在させることができるためelisp、かなり変わった構文があり、注意する必要があります。

注意すべき点の1つは、コマンド拡張の構文です。構文をzsh使用します

file $(which foo)

しかし、eshellこれは基本的にと同じことを意味します

file (which foo)

fileこれは、elisp式を評価した結果に対してコマンドを実行することを意味します。これにより(which foo)、通常、次のようなエラーが発生します。

シンボルの関数定義は無効です:これ

これをeshellで書く方法は実際には

file ${which foo}

移植性

eshellプラットフォームに依存しないEmacsLispコードで書かれているので、WindowsネイティブのEmacsenでも、箱から出してすぐに* nixで動作するのと基本的に同じように動作します(もちろん、おそらく必要coreutilsになるでしょう)。shell-mode* nixシェルを使用する場合は、少なくとも多少注意が必要です。

ドライブ文字の後のコロンのせいで、絶対パスの完了に多少の不思議が見られたと思いますが、それは正確には目立たないものではありません...

于 2011-03-19T21:47:15.473 に答える