跳至內容
出自 Arch Linux 中文维基

本文主要講解了在使用 Emacs 的過程中可能遇到的問題及其解決方案。

Emacs 啟動失敗,提示錯誤信息 'Undefined color: "WINDOW_FOREGROUND"'

您需要安裝 mcpp 軟體包或 gcc 軟體包。xrdb 使用 C 預處理器 cppX 資源進行預處理。如果系統中未安裝 C 預處理器,xrdb 會自動跳過運行 C 預處理器,並且符號 WINDOW_FOREGROUND 不會擴展為十六進制顏色代碼。

使用 Gccemacs 時 Emacs systemd 服務無法啟動

使用 Gccemacs(分支 emacs-native-comppgtk-nativecomp)並嘗試為其啟動 systemd 服務時,可能會記錄一條提示未找到 .eln 文件的錯誤信息:

$ journalctl --user -xb -g eln
emacs[7507]: emacs: ../native-lisp/28.0.50-x86_64-pc-linux-gnu-fc9c33938bf279333039c28064d363e8/lisp-mode-410874a46ab8852855281f021ca61fe7-1738806322de892570d69dfc55b437c2.eln: cannot open shared object file: No such file or directory

作為一種解決方法,編輯 emacs.service中 [Service] 部分的 WorkingDirectory 行。

emacs.service
[Service]
...
WorkingDirectory=/usr/lib/emacs/28.0.50/x86_64-pc-linux-gnu/
...
注意:必須在可能存在的 Restart 參數之前定義 WorkingDirectory 參數。

彩色輸出問題

默認情況下,Emacs shell 會顯示用於列印顏色的原始轉義序列。換句話說,它會顯示奇怪的符號來代替所需的彩色輸出。

~/.emacs 中加入以下內容後,問題就迎刃而解了:

(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

在 X 窗口中顯示字符的問題

如果在 X 窗口中啟動 emacs 時,主窗口中的所有字符都是帶黑邊的白框(即在嘗試查看未安裝正確字體的字符時看到的白框),則需要安裝 xorg-fonts-75dpi 和/或 xorg-fonts-100dpi 並重啟 X 窗口。

啟動緩慢

提示:為了減少啟動時間,用戶可以考慮運行 Emacs #作為 Systemd 單元

啟動時間慢通常由以下兩種情況之一造成。

要確定是哪種情況,請使用以下命令運行 Emacs:

$ emacs -q
  • 錯誤,尤其是在 /etc/hosts 中的錯誤,往往會導致 Emacs 啟動時出現 5 秒以上的延遲。有關信息,請參閱網絡配置指南中的"設置主機名"。
  • 您可能需要監控從計算機發送的任何網絡數據包(使用 Wireshark 等程序),查看是否有任何奇怪的行為。
  • 查找原因的一個簡單方法是注釋掉(即在行前加上";")~/.emacs 中的可疑部分(或 ~/.emacs.d/init.el (或 ~/.emacs.d/init.el)中的可疑部分,然後再次啟動 Emacs 看看是否有任何變化。請注意,使用 「require」 和 「load」 可能會減慢啟動速度,尤其是在使用較大的擴展時。原則上,只有在以下情況下才可使用它們:Emacs 啟動後需要,或只為擴展提供「自動加載」功能。否則,請直接使用 「autoload」 函數。例如
    (require 'anything)
    你可以使用
    (autoload 'anything "anything" "Select anything" t)

無法打開加載文件: ...

導致此錯誤的最常見原因是 「load-path」 變量未包含擴展所在目錄的路徑。要解決這個問題,可在嘗試加載擴展之前將適當的路徑添加到要搜索的列表中:

 (add-to-list 'load-path "/path/to/directory/")

如果嘗試使用擴展包,而 Emacs 的配置前綴又不是 /usr,則需要更新加載路徑。在軟體包提供的說明之前,將以下內容放入 ~/.emacs 中:

 (add-to-list 'load-path "/usr/share/emacs/site-lisp")

如果手動編譯 Emacs,請注意默認前綴為 /usr/local

壞掉的變音符號鍵問題:「<dead-acute> is undefined」

本文或本章節的語言、語法或風格需要改進。參考:幫助:風格

原因:文風需要調整。(在Talk:Emacs/疑難解答討論)

在谷歌上搜索這個錯誤,我們找到了這個連結:https://lists.gnu.org/archive/html/help-gnu-emacs/2009-05/msg00167.html ,解釋了這個問題。使用變音符號鍵的正常方法無法達到預期效果。如果嘗試對 「fiancé」 這樣的單詞使用變音符號,就會產生上述信息。

解決方法是在啟動文件 ~/.emacs 中加入下面一行:

  (require 'iso-transl)

不,這不是一個 bug,而是新 Emacs 版本的一項功能。通過閱讀郵件列表中的相關信息,我們發現了它 [1]

因為需要選擇 iso-transl 或 iso-acc,所以似乎什麼都不會自動加載。這兩種輸入法似乎都提供了 C-x 8 或 Alt-<accent> 前綴,但你我現在做的只是按一個死鍵(^、´、`、~、¨)來輸入變音符號,然後再按另一個鍵來「組成」變音符號。在此過程中沒有使用 Alt 鍵!根據文檔,它似乎適用於 8 位編碼,因此在 UTF-8 中應該沒什麼用。這個錯誤出現時我就報告過,但這個錯誤似乎被歸類為一個功能……也許這只是因為文件是自動加載的,雖然很沒用。

C-M-% 和其他一些綁定在 emacs nox 中不起作用

這是因為終端比 Xorg 更受局限。不過,某些終端可能比其他終端處理更多的綁定。兩種解決方案:

  • 要麼使用圖形版本,
  • 要麼將綁定更改為受支持的綁定。

示例:

.emacs
(global-set-key (kbd "C-M-y") 'query-replace-regexp)

Emacs 掛起

由於 Emacs 的單線程特性,許多操作都會阻塞。這種情況可能有幾種。例如,Emacs 可能正在等待你的輸入(例如,你在一幀中打開了 minibuffer,卻在另一幀中嘗試工作)。或者,Emacs 正在運行的代碼需要一段時間才能完成。又或者,你遇到了一個錯誤。有幾種方法可以在不殺死 Emacs 進程的情況下解鎖 Emacs。

  • 試試按 C-g。根據 Emacs 的操作,您可能需要按多次。
  • 嘗試按 ESC ESC ESC
  • 在另一個終端運行 killall -SIGUSR2 emacs

Emacs-nox 輸出變得凌亂

在終端中工作時,顏色、縮進或任何與輸出相關的內容都可能變得瘋狂。這(很可能?)是因為 Emacs 在某一時刻發送了一個特殊字符,而該字符可能與當前終端衝突。 如果出現這種情況,你可以執行 M-x redraw-display,這將重繪終端顯示。如果這個問題經常出現,你可能需要將命令綁定到某個按鍵上,例如:M-x redraw-display

(global-set-key (kbd "<f7>") 'redraw-display)

在您的 .emacs 文件中。

圖形化 Emacs 沒有這個問題。

在 emacs 終端中顯示奇怪的轉義數字 (utf-8)

將這些值導出到 .bashrc.zshrc 中:

$ ~/.bashrc or ~/.zshrc 
export LANG\='en_US.UTF-8'
export LC_ALL\="en_US.UTF-8"
export TERM\=xterm-256color

這可能會導致錯誤,因為在 Linux 發行版中,正確值使用的是小寫 utf(例如 en_US.utf-8

要查看所有可用的本地語言,請使用 locale -a

在 tmux 的 emacs 中,Shift + 方向鍵不起作用

tmux 配置中啟用 xterm 鍵:

~/.tmux.conf
setw -g xterm-keys on

因為這會破壞其他組合鍵,所以請在 emacs 配置中加入以下內容。

~/.emacs
(defadvice terminal-init-screen
  ;; The advice is named `tmux', and is run before `terminal-init-screen' runs.
  (before tmux activate)
  ;; Docstring. This describes the advice and is made available inside emacs;
  ;; for example when doing C-h f terminal-init-screen RET
  "Apply xterm keymap, allowing use of keys passed through tmux."
  ;; This is the elisp code that is run before `terminal-init-screen'.
  (if (getenv "TMUX")
    (let ((map (copy-keymap xterm-function-map)))
    (set-keymap-parent map (keymap-parent input-decode-map))
(set-keymap-parent input-decode-map map))))

詳見 tmux FAQ

KDE 中不正確的窗口大小調整

KDE 用戶可能會發現 Emacs 窗口不能正確調整大小,而是調整後的部分是透明的,滑鼠點擊會被發送到底層窗口。要糾正這種行為,請將 KDE 的 GTK3 主題改為 oxygen-gtk 以外的其他主題。例如,使用 gtk3 附帶的 Emacs 主題。

要強制 Emacs 在 KDE 中完全最大化,點擊標題欄中的 Emacs 圖標,然後選擇 More Actions > Special Window Settings。然後在 Size & Position 選項卡中選擇 Obey geometry restrictions,在下拉菜單中選擇 Force,並從右側的單選按鈕中選擇 No