Должны ли мы использовать символы UTF-8, такие как ⏰ в скрипте Bash / Shell?

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

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))"
36
28.11.2018, 17:47
1 ответ

Полезным руководством для этого является «Интерфейс переносимых операционных систем» (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 -.

Ваша оболочка может принять их, но это не гарантирует, что другие тоже примут их.
Чтобы иметь возможность использовать свой сценарий на разных платформах и версиях программного обеспечения, вам следует избегать использования подобных идентификаторов, не соответствующих -.

55
27.01.2020, 19:36

Теги

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