(I’m using emacs23; on Debian 7; Xfce.)
I want to try Gilles’s recommended solution for taking quick notes with Emacs.
When trying to run emacsclient -a "" -e "(remember-other-frame)"
, I get the following error:
*ERROR*: Unknown terminal type
What is wrong?
(Not really sure about what I’m doing,) I tried to start a server from within Emacs: Ctrl+x and entering server-start. Then it says:
Warning (server): Unable to start the Emacs server.
There is an existing Emacs server, named "server".
To start the server in this Emacs process, stop the existing
server or call `M-x server-force-delete' to forcibly disconnect it.
When pressing Ctrl+x and entering server-force-delete, it says:
Connection file "/tmp/emacs1000/server" deleted
When I now run emacsclient -a "" -e "(remember-other-frame)"
from a different terminal window (having emacs -nw
still running in the first one), I get:
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
[Edit] Requested information
Output of echo $TERM; echo $DISPLAY
:
xterm
:0.0
Are you running this from a terminal emulator, if so which, if not where?
I’m not sure what a "terminal emulator" is, but the terminal thing I’m using identifies itself (in the "Info" menu) as: Xfce Terminal-Emulator (Terminal 0.4.8). It’s the default one that came with installing Debian 7 + Xfce.
What do you have in
~/.emacs
and~/.emacs.d
?
~/.emacs
does not exist.~/.emacs.d
contains only a sub folderauto-save-list
(which contains an empty file whose name starts with.saves
).
Best Answer
Explanation of the bug
remember-other-frame
callsswitch-to-buffer-other-frame
which callsdisplay-buffer
with the variablepop-up-frames
set tot
. This results in a call tomake-frame
with the argumentpop-up-frame-alist
. The functionmake-frame
creates a frame on the same display device as the current selected frame. (What Emacs calls a frame is what GUIs call a window, except that a frame can also be in a text terminal.) At this point, Emacs is still running in daemon mode, so there is no selected frame. Thusmake-frame
sees no GUI environment and thinks it should create a terminal frame, but there is no text terminal either, resulting in the confusing error message “Unknown terminal type”.Simple but clumsy workaround
remember-other-frame
is the right function to call from within an existing Emacs window, but is technically wrong from emacsclient. There, we should be using the-c
option to make Emacs create a new frame, and the plainremember
function.However this is not very nice because
remember
creates a window which has to be dismissed withC-c C-c
(which is also what saves the note), then the frame has to be dismissed withC-x 5 0
. If you forgetC-c C-c
(which is all the more likely because the message to typeC-x 5 0
overwrites the message to typeC-c C-c
in the echo area), the note isn't even saved.A nicer workaround
Instruct
make-frame
explicitly to create the frame on the current X display.You can put this all in one line, just make sure not to change the punctuation.