Emacs服務器模式以及emacsclient配置


Emacs有很多強大的插件,但是插件安裝多了會導致啟動速度很慢。為了解決這個問題,一個方法是使用emacs提供的server模式。

基本用法[1]

  • 啟動emacs server:
$ emacs --daemon
  • 編輯文件
$ emacsclient file
$ emacsclient -t file # 字符界面
$ emacsclient -c file # GUI界面

添加命令行別名

為了方便在終端上使用,在~/.bashrc文件中加入如下兩行:

alias ec='emacsclient -t -a ""'
alias sec='sudo emacsclient -t -a ""'

其中-a表示alternative-editor,用於指定無法連接emacs server時使用的編輯器。空字符串有特殊意義,表示先啟動emacs server,再重新連接。
若只有第一行,執行sudo ec file會找不到命令,因為root用戶並沒有定義ec別名。因此定義sec,作為ec的sudo版本。

添加到文件管理器,設為默認編輯器

接下來我們希望雙擊文本文件時也能夠使用emacsclient。創建~/.local/share/applications/emacsclient.desktop

[Desktop Entry]
Name=Emacs (Client)
GenericName=Text Editor
Comment=Edit text
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
Exec=emacsclient -c -a "" %F
Icon=emacs
Type=Application
Terminal=false
Categories=Development;TextEditor;Utility;
StartupWMClass=Emacs

選擇打開方式為Emacs (Client)即可。

給命令行和GUI設置不同的theme (可選)

最后還要處理一個比較細節的問題,終端和GUI版本使用同一套主題可能會有問題。然而遺憾的是,emacs的主題是全局的,無法給frame單獨設置,因此只能采取一些取巧的方法。

  • 解決方法1:
    第一種方法是當創建一個新frame時,根據frame的類型,手動調整它的樣式。例如[2]:
(defun setup-window-system-frame-colours (&rest frame)
  (if window-system
      (let ((f (if (car frame)
		   (car frame)
		 (selected-frame))))
	(progn
	  (set-frame-font "Bera Sans Mono-11")
	  (set-face-background 'default "#232F2F" f)
	  (set-face-foreground 'default "#FFFFFF" f)
	  (set-face-background 'fringe  "#000000" f)
	  (set-face-background 'cursor "#2F4F4F" f)
	  (set-face-background 'mode-line "#2F4F4F" f)
	  (set-face-foreground 'mode-line "#BCBf91" f)))))

(require 'server)
(defadvice server-create-window-system-frame
  (after set-window-system-frame-colours ())
  "Set custom frame colours when creating the first frame on a display"
  (message "Running after frame-initialize")
  (setup-window-system-frame-colours))
(ad-activate 'server-create-window-system-frame)
(add-hook 'after-make-frame-functions 'setup-window-system-frame-colours t)
  • 解決方法2:
    第2種方法類似,根據frame的類型,應用或者取消主題[3]。
(load-theme 'monokai t t)
(defun on-frame-open (frame)
  ;; (select-frame frame)
  (if (display-graphic-p frame)
	  (enable-theme 'monokai)
	  (disable-theme 'monokai)))

(add-hook 'after-make-frame-functions 'on-frame-open)

參考資料

1 https://www.emacswiki.org/emacs/EmacsClient
2 https://www.emacswiki.org/emacs/SettingFrameColorsForEmacsClient
3 https://emacs.stackexchange.com/questions/2096/different-themes-for-terminal-and-graphical-frames-when-using-emacs-daemon


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM