19

私は Emacs のシェル モードを使用するのが好きですが、いくつか欠点があります。そのうちの 1 つは、シェル コマンドがエディターを起動しようとしたときに、新しいバッファーを開くほど賢くないということです。たとえば、環境変数をにVISUAL設定するvimと、から次のようになりますsvn propedit

$ svn propedit svn:externals .
"svn-prop.tmp" 2L、149C[1;1H
~ [4;1H~ [5;1H~ [6;1H~] [7;1H~            
...

(表現から見分けるのは難しいかもしれませんが、それは恐ろしく醜い混乱です。)

VISUAL設定すると"emacs -nw"、私は得る

$ svn propedit svn:externals .
emacs: 端末タイプ「ダム」は、Emacs を実行するのに十分強力ではありません。
カーソルを配置する機能がありません。
それがあなたが持っている端末の実際のタイプでない場合は、
Bourne シェル コマンド `TERM=... export TERM' を使用します (C シェル:
`setenv TERM ...') を使用して正しいタイプを指定します。必要かもしれません
`unset TERMINFO' (C シェル: `unsetenv TERMINFO') も実行します。svn: system('emacs -nw svn-prop.tmp') は 256 を返しました

( VISUALset を justemacsに設定すると機能しますが、端末セッション内ではなく、Emacs X ウィンドウ内からのみ機能します。)

コマンド ライン プロセスに代わってシェル モードで正しいことを実行し、新しいバッファを開く方法はありますか?

4

6 に答える 6

21

を介して Emacs セッションにアタッチできますemacsclient。まず、emacsサーバーを起動します

M-x server-start

またはあなたに追加(server-start)します.emacs。それで、

export VISUAL=emacsclient

編集してください。

ノート:

  • emacsとのバージョンはemacsclient一致している必要があります。複数のバージョンの Emacs がインストールされている場合はemacsclient、サーバーを実行している Emacs のバージョンに対応するバージョンの を呼び出すようにしてください。
  • 複数の Emacs プロセス/フレームでサーバーを起動する場合 (たとえば、(server-start)がにあるため.emacs)、サーバーを起動する最後のフレームでバッファーが作成されます。
于 2008-09-22T18:21:23.573 に答える
3

これには、emacsclient、gnuserv、および Emacs 23 の multi-tty があり、これらはすべてこれに役立ちます。実際、Emacs 23 では、emacsclient に gnuserv の興味深い機能がすべて備わっていると思います。

于 2008-09-23T17:37:12.877 に答える
0

emacs クライアント/サーバーを使用するとともに、このスクリプトを使用して emacs を呼び出しています。

これにより、まだ実行されていない場合は emacs が開始されます。または、実行中の emacs で (gnuclient を使用して) 新しい emacs バッファーが開かれます。デフォルトではバックグラウンドで実行されますが、何らかの入力を必要とするプロセスの場合はフォアグラウンドで実行できます。たとえば、変更リストの説明を入力するときに、これをソース管理エディターとして使用しています。「SVN_EDITOR=emacs sync」があるので、emacs シェルで「svn commit」を実行すると、同じ emacs の新しい emacs バッファーで svn エディターが開きます。バッファを閉じると、「svn commit」が続きます。かなり便利です。

#!/ビン/sh

if [ -z $EMACS_CMD ]; それから
  EMACS_CMD="/usr/bin/emacs"
フィ

[ -z $GNUCLIENT_CMD ]; それから
  GNUCLIENT_CMD="/usr/bin/gnuclient"
フィ

if [ "$1" = "同期" ]; それから
    シフト1
    同期=真
そうしないと
    同期=false
フィ

cmd="${EMACS_CMD} $*"
lsof $EMACS_CMD | grep $USER >/dev/null 2>&1
[「$?」の場合 -ne "1" ]; それから
    cmd="${GNUCLIENT_CMD} $*"
フィ

if [ $sync = "true" ]; それから
    $cmd
そうしないと
    $cmd &
フィ

于 2009-05-12T22:22:40.960 に答える
0

.emacs に (start-server) があると、このエラーが発生します....

Debugger entered--Lisp error: (void-function start-server)
  (start-server)
  eval-buffer(#<buffer  *load*> nil "/Users/jarrold/.emacs" nil t)  ; Reading at buffer position 22768
  load-with-code-conversion("/Users/jarrold/.emacs" "/Users/jarrold/.emacs" t t)
  load("~/.emacs" t t)
  #[nil "^H\205\276^@   \306=\203^Q^@\307^H\310Q\202A^@ \311=\2033^@\312\307\313\314#\203#^@\315\202A^@\312\307\$
  command-line()
  normal-top-level()

....GNU Emacs 22.1.1を使用しています

そして、これは私が使用している Mac OS-X のバージョンです。

shandemo 511 $ uname -a ダーウィン施設-MacBook-Pro.local 10.8.0

ダーウィン カーネル バージョン 10.8.0: 2011 年 6 月 7 日火曜日 16:33:36 PDT;

root:xnu-1504.15.3~1/RELEASE_I386 i386

mx ansi-term を使用すると、シェル内で hg commit を正常に実行できるように見えることに注意してください。ただし、そのシェルでは cp や cn などを使用してバッファをスクロールできないため、mx シェルを使用することをお勧めします。

于 2012-04-13T00:11:04.480 に答える
0

マーキュリアルを介してemacsシェルにマージするために、同様のことをしたかったのです。ここのポスターのおかげで、私は道を見つけました。2 つのステップ:

  1. 追加: (start-server) を .emacs ファイルに追加します (変更後に load-file を忘れずに)

  2. あなたのhgrcで:

    [マージツール]
    emacs.executable = emacsclient
    emacs.premerge = False
    emacs.args = --eval "(ediff-merge-with-ancestor \"$local\" \"$other\" \"$base\" nil \"$output\")"
    

于 2010-04-20T16:50:07.330 に答える
0

完全に真実ではありません。 ansi-termemacs を正常に実行できます (ただし、通常はコミット ログに対して mg を実行しますが、まれに emacs から直接コミットしないことがあります)。 最初に起動してそこから実行するとeshell、emacsを実行することもできます。screen

于 2009-01-13T02:06:17.913 に答える