“Неизвестный терминальный тип” ошибка при попытке выполнить emacsclient

Дать jstest попытка. Эта статья обсуждает свое использование, названное: flightgear.org - Устройство ввода данных. Кажется, установлен по умолчанию в большинстве дистрибутивов. Кроме того, вот ссылка на jstest страница справочника.

В основном необходимо определить, какое устройство джойстик присваивается. Загляните dmesg файл журнала после того, как Вы включаете его для получения этой информации. Могло бы быть что-то как /dev/input0.

$ dmesg | grep Joystick
input0: USB HID v1.00 Joystick [SAITEK CYBORG 3D USB] on usb2:3.0 

Затем выполните эту команду:

$ jstest /dev/input0

5
13.04.2017, 15:50
2 ответа

Объяснение ошибки

remember-other-frame вызывает switch-to-buffer-other-frame который вызывает display-buffer с переменной pop-up-frames установленной в t. Это приводит к вызову make-frame с аргументом pop-up-frame-alist. Функция make-frame создает кадр на том же устройстве отображения, что и текущий выбранный кадр. (То, что в Emacs называется фреймом, в графических интерфейсах называется окном, за исключением того, что фрейм может находиться и в текстовом терминале). В этот момент Emacs все еще работает в режиме демона, поэтому выбранного фрейма нет. Таким образом, make-frame не видит среды GUI и думает, что должен создать фрейм терминала, но текстового терминала тоже нет, что приводит к непонятному сообщению об ошибке "Unknown terminal type".

Простое, но неуклюжее решение

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 в области эха), то заметка даже не сохранится.

Более приятный обходной путь

Инструкция make-frame явно создаёт кадр на текущем дисплее X.

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

Вы можете записать все это в одну строку, только убедитесь, что не изменили пунктуацию.

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

Если вместо этого вы можете вызвать (make-frame) , вы можете указать ему всегда создавать X-кадр, чтобы избежать этой ошибки, например:

(select-frame
 (make-frame
  '((window-system . x))))
0
27.01.2020, 20:38

Теги

Похожие вопросы