Emacs服务器模式以及emacsclient配置

Emacs有很多强大的插件,但是插件安装多了会导致启动速度很慢。为了解决这个问题,一个方法是使用emacs提供的server模式。

1|0基本用法[1]

  • 启动emacs server:
$ emacs --daemon
  • 编辑文件
$ emacsclient file $ emacsclient -t file # 字符界面 $ emacsclient -c file # GUI界面

2|0添加命令行别名

为了方便在终端上使用,在~/.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版本。

3|0添加到文件管理器,设为默认编辑器

接下来我们希望双击文本文件时也能够使用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)即可。

4|0给命令行和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)

5|0参考资料

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


__EOF__

本文作者小镜湖
本文链接https://www.cnblogs.com/cocode/p/12251697.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ooosy  阅读(3917)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示