web-dev-qa-db-ja.com

emacsclientを実行しようとすると、「不明な端末タイプ」エラーが発生します

(私はDebian 7で emacs2 ;を使用しています; Xfce。)

試してみたい Emacsで簡単にメモを取るためのGillesの推奨ソリューション

emacsclient -a "" -e "(remember-other-frame)"を実行しようとすると、次のエラーが発生します。

*エラー*:不明な端末タイプ

何が問題なのですか?


(私が何をしているのかよくわかりません)Emacs内からサーバーを起動しようとしました: Ctrl+x と入る server-start。それからそれは言う:

警告(サーバー):Emacsサーバーを起動できません。
「server」という名前の既存のEmacsサーバーがあります。
このEmacsプロセスでサーバーを起動するには、既存のサーバーを停止します
サーバーまたは `M-x server-force-delete 'を呼び出して、サーバーを強制的に切断します。

押すと Ctrl+x と入る server-force-delete、それは言う:

接続ファイル「/ tmp/emacs1000/server」を削除しました

別のターミナルウィンドウからemacsclient -a "" -e "(remember-other-frame)"を実行すると(最初のウィンドウではemacs -nwがまだ実行されています)、次のようになります。

emacsclient: can't find socket; have you started the server?
To start the server in Emacs, type "M-x server-start".

Warning: due to a long standing Gtk+ bug
http://bugzilla.gnome.org/show_bug.cgi?id=85715
Emacs might crash when run in daemon mode and the X11 connection is unexpectedly lost.
Using an Emacs configured with --with-x-toolkit=lucid does not have this problem.
("emacs")
Loading 00debian-vars...
Loading 00debian-vars...done
Loading /etc/emacs/site-start.d/50a2ps.el (source)...
Loading /etc/emacs/site-start.d/50a2ps.el (source)...done
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...
Loading debian-ispell...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...done
Loading debian-ispell...done
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...done
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...done
Starting Emacs daemon.
Emacs daemon should have started, trying to connect again
*ERROR*: Unknown terminal type

[編集]要求された情報

echo $TERM; echo $DISPLAYの出力:

xterm
:0.0

これをターミナルエミュレータから実行していますか?実行している場合は、どこで実行していませんか?

「ターミナルエミュレータ」が何であるかはわかりませんが、使用しているターミナルのものは、([情報]メニューで)自分自身を次のように識別します:Xfceターミナルエミュレータ(ターミナル0.4.8)。これは、Debian 7 + Xfceのインストールに付属しているデフォルトのものです。


~/.emacs~/.emacs.dには何がありますか?

  • ~/.emacsは存在しません。
  • ~/.emacs.dにはサブフォルダauto-save-listのみが含まれます(名前が.savesで始まる空のファイルが含まれます)。
5
unor

バグの説明

remember-other-frame呼び出し switch-to-buffer-other-frame 呼び出し display-buffer 変数 pop-up-framestに設定。これにより、引数 make-frame を指定して pop-up-frame-alist が呼び出されます。関数make-frameは、現在選択されているフレームと同じディスプレイデバイス上にフレームを作成します。 (Emacsがフレームと呼ぶのはGUIがウィンドウと呼ぶものですが、フレームはテキスト端末にもある可能性があります。)この時点では、Emacsはまだデーモンモードで実行されているため、選択されたフレームはありません。したがって、make-frameはGUI環境を認識せず、端末フレームを作成する必要があると考えますが、テキスト端末も存在しないため、「不明な端末タイプ」という紛らわしいエラーメッセージが表示されます。

シンプルだが不器用な回避策

remember-other-frameは、既存のEmacsウィンドウ内から呼び出すのに適切な関数ですが、emacsclientからは技術的に間違っています。そこでは、-cオプションを使用してEmacsに新しいフレームを作成させ、プレーンなremember関数を使用する必要があります。

emacsclient -a "" -c -e "(remember)"

ただし、これはあまり良いことではありません。rememberは、C-c C-c(これはメモを保存するものでもあります)で閉じる必要があるウィンドウを作成し、フレームはC-x 5 0で閉じる必要があるためです。 C-c C-cを忘れた場合(エコー領域でC-x 5 0と入力したメッセージがC-c C-cと入力したメッセージを上書きする可能性が高いため)、メモは保存されません。

より良い回避策

現在のXディスプレイにフレームを作成するようにmake-frameに明示的に指示します。

emacsclient -a "" -e "
    (let ((pop-up-frame-alist \`((window-system . x)
                                 (display . \"$DISPLAY\")
                                 ,@pop-up-frame-alist)))
      (remember-other-frame))"

これをすべて1行にまとめることができますが、句読点を変更しないように注意してください。

emacsclient -a "" -e "(let ((pop-up-frame-alist \`((window-system . x) (display . \"$DISPLAY\") ,@pop-up-frame-alist))) (remember-other-frame))"

代わりに(make-frame)を直接呼び出すことができる場合は、常にXフレームを作成するように指示できます。これにより、このエラーを回避できます。例:

(select-frame
 (make-frame
  '((window-system . x))))
1