Я использую all-the-icons-dired с
(use-package all-the-icons
:if (display-graphic-p)
:config
(add-hook 'dired-mode-hook 'all-the-icons-dired-mode))
Если я запускаю emacs, значки загружаются. Но если начать использовать emacsclient -c .
, он вообще не загружается.
Ubuntu - 22.04
emacs - 27.1
ExecStart=/usr/bin/emacs --fg-daemon # systemd service entry
Вы используете Emacs как демон, поэтому ваша проблема будет заключаться в том, что вы тестируете (display-graphic-p)
при запуске Emacs:
display-graphic-p is a byte-compiled Lisp function in `frame.el'.
(display-graphic-p &optional DISPLAY)
Return non-nil if DISPLAY is a graphic display.
Graphical displays are those which are capable of displaying several
frames and several different fonts at once. This is true for displays
that use a window system such as X, and false for text-only terminals.
DISPLAY can be a display name, a frame, or nil (meaning the selected
frame's display).
Вы не передаете (необязательный) аргумент DISPLAY, поэтому он равен nil
, что означает, что возвращаемое значение будет основано на выбранном в данный момент кадре.
При запуске демона нет графического отображения (нет графических фреймов); поэтому все, что требует его во время запуска, потерпит неудачу.
Вы можете использовать server-after-make-frame-hook
или after-make-frame-functions
для действия при создании фрейма, и в этот момент (если это графический фрейм) вы получите результат, отличный от этого предиката.
В вашем случае я предлагаю вместо этого сделать вашу функцию dired-mode-hook
такой, которая проверяет display-graphic-p
и вызывает all-the-icons-dired-mode
только в том случае, если этот тест пройден.
(add-hook 'dired-mode-hook #'my-dired-mode-hook)
(defun my-dired-mode-hook ()
"Custom `dired-mode' config called via `dired-mode-hook'."
(when (display-graphic-p)
(all-the-icons-dired-mode 1)))
Однако оказывается тесты режима all-the-icons-dired-mode display-graphic-p, и поэтому вы можете смело использовать:
(add-hook 'dired-mode-hook #'all-the-icons-dired-mode)
Это то, что у вас было изначально, за исключением того, что все это было заключено в какой-то use-package
код с проблемной условной проверкой. Я мало что знаю о use-package
, но думаю, что вы можете просто удалить :if (display-graphic-p)
из этого кода, чтобы получить желаемый результат.
Я добавил пример (а затем упрощение, после того как проверил рассматриваемый пакет). Обратите внимание: когда вы добавляете переменную-ловушку, вы должны добавить функцию.
Можете ли вы рассказать мне, как сделать
dired-mode-hook
, чтобы выполнить проверку. Я совершенно новичок в elisp. Я попробовал(add-hook 'dired-mode-hook (if (display-graphic-p) 'all-the-icons-dired-mode)))
. Но это добавляетnil
к демону dired. Думаю, я не смогу изменитьdired-mode-hook
себя.