我正在尝试为emacsclient设置我的字体,如下所示:
(let ((default-font (cond
((member "Inconsolata" (font-family-list))
"Inconsolata 14")
(t
"monospace 20"))))
(set-default-font default-font)
(add-to-list 'default-frame-alist `(font . ,default-font)))
我C-x C-e
性别的cond
,它返回"Inconsolata 14"
。我C-x C-e
性别let
,字体已更新。
当我通过
启动emacs时$ emacs
它有效(字体设置为Inconsolata 14)。
然而,当我通过
启动应用程序时$ emacsclient --alternate-editor="" --create-frame "$@"
字体是等宽字符20。
请告知。
修改
我发现通过包含
(message "%s" (font-family-list))
在我的.emacs文件中,(font-family-list)
在启动emacsclient时返回nil
。
不幸的是,在初始化期间也是如此:
;; Both also print `nil` to the `*Messages*` buffer.
(message "%s" (find-font (font-spec :name "inconsolata")))
(message "%s" (find-font (font-spec :name "Inconsolata")))
;; Throws "error: No fonts being used"
(message "%s" (describe-font "Inconsolata"))
我不知道如何检测初始化期间是否安装了字体。我的问题变成了:当emacsclient启动时,如何可靠地检查字体是否可用?
编辑2:
在after-init-hook
,emacs-startup-hook
,window-setup-hook
,before-make-frame-hook
和after-make-frame-functions
中回应也会产生nil
。
答案 0 :(得分:2)
当您将Emacs作为守护程序启动时(由emacsclient按需隐式完成),在Emacs与任何"显示设备连接之前加载.emacs" (又名"终端"),即它没有连接到任何GUI或任何tty。相反,它的终端是一个虚拟设备,它从stdin读取并将输出发送到stdout(好吧,在开始和很快之后,即使通信链接被切断),所以那里没有字体。
获得所需内容的一种方法是执行以下操作:
(add-to-list face-font-family-alternatives '("myfont" "Inconsolata" "Monospace"))
然后自定义default
面以使用字体系列myfont
。您可能仍然遇到字体大小问题,在这种情况下,您可能想要使用face-font-rescale-alist
。
答案 1 :(得分:2)
(defun frame-font-setup
(&rest ...)
;; (remove-hook 'focus-in-hook #'frame-font-setup)
(unless (assoc 'font default-frame-alist)
(let* ((font-family (catch 'break
(dolist (font-family
'("Powerline Consolas"
"Consolas for Powerline"
"Consolas"
;;
"Powerline Inconsolata-g"
"Inconsolata-g for Powerline"
"Inconsolata-g"
;;
"Powerline Source Code Pro"
"Source Code Pro for Powerline"
"Source Code Pro"
;;
"Powerline DejaVu Sans Mono"
"DejaVu Sans Mono for Powerline"
"DejaVu Sans Mono"
;;
"Monospace"))
(when (member font-family (font-family-list))
(throw 'break font-family)))))
(font (when font-family (format "%s-12" font-family))))
(when font
(add-to-list 'default-frame-alist (cons 'font font))
(set-frame-font font t t)))))
(add-hook 'focus-in-hook #'frame-font-setup)
嗯...... [高兴]
答案 2 :(得分:1)
我设法在emacs subreddit中的this post中找到答案。
以下是我在init.el
中输入的代码段:
(defun rag-set-face (frame)
"Configure faces on frame creation"
(select-frame frame)
(if (display-graphic-p)
(progn
(when (member "PragmataPro" (font-family-list))
(set-frame-font "PragmataPro-13")))))
答案 3 :(得分:0)
单独使用elisp似乎几乎不可能,所以我已经选择了fc-list
。这很有效。
(let ((default-font (cond
((and
(eq system-type 'gnu/linux)
(null (string= "" (shell-command-to-string "which fc-list")))
(null (string= "" (shell-command-to-string "fc-list inconsolata"))))
"Inconsolata 14")
(t
"monospace 12"))))
(set-default-font default-font)
(add-to-list 'default-frame-alist `(font . ,default-font)))