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