3

次のように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-econdsexpで、それは を返します"Inconsolata 14"。私C-x C-eletsexpにいて、フォントが更新されています。

経由でemacsを起動すると

$ emacs

動作します (フォントは Inconsolata 14 に設定されています)。

ただし、アプリケーションを起動すると

$ emacsclient --alternate-editor="" --create-frame "$@"

代わりに、フォントはモノスペース 20 です。

お知らせ下さい。

編集:

私はそれを含めることによってそれを発見しました

(message "%s" (font-family-list))

emacsclient の起動時に(font-family-list)返される.emacs ファイル内。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-hook、およびでエコーすると、after-make-frame-functionsも得られnilます。

4

4 に答える 4

3

はあ... この問題にも悩まされていましたが、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)

うーん… [喜ぶ]

于 2015-11-01T02:36:43.487 に答える
2

Emacs をデーモンとして起動すると (これは emacsclient オンデマンドによって暗黙的に行われます)、.emacs は、Emacs が「表示デバイス」(別名「端末」) に接続する前にロードされます。つまり、どのデバイスにも接続されません。 GUIもttyもありません。代わりに、その端末は、stdin から読み取り、出力を stdout に送信するダミー デバイスであるため (最初と直後に、通信リンクが切断されても)、そこにはフォントがありません。

あなたが望むものを得る1つの方法は、次のようなことをすることです:

(add-to-list face-font-family-alternatives '("myfont" "Inconsolata" "Monospace"))

default次に、フォント ファミリーを使用するようにフェイスをカスタマイズしますmyfont。フォントのサイズにまだ問題があるかもしれません。その場合は、face-font-rescale-alist.

于 2014-08-09T19:23:37.810 に答える
2

emacs subredditのこの投稿で答えを見つけることができました。

これが私が入れたコードスニペットです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")))))
于 2016-12-28T03:34:45.347 に答える