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))"
Полезным руководством для этого является «Интерфейс переносимых операционных систем» (POSIX ), семейство стандартов, которые реализованы в большинстве Unix -подобных систем. Обычно хорошей идеей является ограничение сценариев оболочки функциями, предписанными POSIX, чтобы убедиться, что их можно использовать в разных оболочках и на разных платформах.
В соответствии со спецификацией POSIX определений функций в "Shell Command Language":
The function is named fname; the application shall ensure that it is a name (see the Base Definitions volume of IEEE Std 1003.1-2001, Section 3.230, Name). An implementation may allow other characters in a function name as an extension.
По ссылке на определение "имени":
In the shell command language, a word consisting solely of underscores, digits, and alphabetics from the portable character set.
Этот набор символов содержит только символы между U0000 и U007E.
Поэтому такие символы, как «⏰» (U23F0 ), недопустимы в идентификаторе, совместимом с POSIX -.
Ваша оболочка может принять их, но это не гарантирует, что другие тоже примут их.
Чтобы иметь возможность использовать свой сценарий на разных платформах и версиях программного обеспечения, вам следует избегать использования подобных идентификаторов, не соответствующих -.