• 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

  • 相关阅读:
    ubuntu16下点亮C170摄像头的一波三折
    看完这张图,开源协议门清
    Qt调试信息重定向输出(qInstallMessageHandler)
    C++专业术语
    vim 复制 单个 单词: 移动光标到单词词首,快速摁 yw
    讲真的
    bcp文件, 逗号文件
    缩写: i = i + 1 和 i += 1,可以看做是 i 自加的值 是1。
    $identify 的 “identify” 表示一个Perl标识符,即 identifier
    第八章: 以正则表达式进行匹配
  • 原文地址:https://www.cnblogs.com/cocode/p/12251697.html
Copyright © 2020-2023  润新知