emacsclient字体检查无法正常工作

时间:2014-08-09 18:56:59

标签: emacs fonts emacsclient

我正在尝试为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-hookemacs-startup-hookwindow-setup-hookbefore-make-frame-hookafter-make-frame-functions中回应也会产生nil

4 个答案:

答案 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)

叹息......也对这个问题感到恼火,但我找到了Emacs Lisp解决方案。以下是我的Emacs配置中相应代码段的直接复制/粘贴:

(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)))