为控制台和GUI启动两个单独的emacs守护程序


14

通常,我使用GUI启动emacs,然后立即使用启动服务器(server-start)。现在,我可以从终端通过emacsclient -n <file>或从文件浏览器轻松地将文档打开到现有的emacs会话中。

但是,有时我想使用在终端中运行emacs emacsclient -t。在编写git commit日志或执行其他非常小的任务时,这种情况最常见。在这些情况下,我的初始化文件已加载到emacs的GUI实例中,这意味着我没有获得任何针对TTY emacs的自定义设置。

我知道我可以跑步

emacs -nw -q -l "some-custom-init-file.el"

但这每次都会重新加载所有软件包。我可以两全其美吗?有没有一种方法可以设置“ TTY守护程序”,以便我可以使用单独的自定义项在终端中运行,而不是在现有emacs窗口中访问文件?


1
您能否指出您的自定义示例,它们在TTY和GUI模式之间是不同的?
stsquad 2014年

1
@stsquad一个非常简单的方法是在GUI模式下使用左边缘,但是由于在TTY模式下该边缘不存在,因此行号和文本之间没有空格。可以(setq linum-format "%d ")在TTY定制文件中解决此问题。另外,我的色彩主题在TTY模式下总是看起来很奇怪,因此我一定会为TTY选择不同的主题。目前我实际上并没有多少区别,但是现在我知道我可以拥有不同的服务器,列表可能会增加。
nispio 2014年

@nispio:我建议您M-x report-emacs-bug并要求提供新功能,例如能够在TTY和GUI框架中具有不同的面部主题(实际上,主题可以为这些不同类型的框架指定完全不同的颜色,因此您也可以调整主题) 。对于这些单独的情况,使用几个守护程序只是一种解决方法,因为Emacs中缺少相应的功能。
Stefan

Answers:


14

使用emacs --daemon=your-server-name -l "custom-init-file"启动新的服务器,并emacsclient -nw -s your-server-name从终端本身连接到它。手册中有关将Emacs用作服务器的部分提供了更多初始化选项。


这可行!除了寻找并删除服务器文件之外,是否还有其他方法可以杀死以这种方式启动的服务器?
nispio 2014年

(我必须添加一个-q开关以使默认设置init.el在自定义init文件之前无法运行。)
nispio 2014年

2
emacsclient -s your-server-name -e "(kill-emacs)"想做什么?以上只是调用emacsclient和evals (kill-emacs)。你可以替换(kill-emacs)使用(save-buffers-kill-emacs)为好。
Vamsi 2014年

我曾经为终端和gui emacs拥有一个通用的init.el,并为单独的定制加载了单独的定制文件。因此,我错过了-q
Vamsi 2014年

1
该解决方案还解决了将'emacsclient -t'与mutt一起使用,以及在单独的工作区中'emacsclient -c'时遇到的问题。简而言之:在'emacsclient -t'之前启动'emacsclient -c'时,守护进程崩溃。谢谢Vamsi
Boccaperta-IT 2014-09-24

9

除了@Vamsi的答案,您还可以通过将建议附加到来在仅运行一台服务器时获得许多相同的好处make-frame-command

例如,在终端中运行时,我希望背景色是black(映射到#202020),但是我想#202020在图形模式下使用。我用以下方法实现了这一点:

(defadvice make-frame-command (after make-frame-change-background-color last activate)
  "Adjusts the background color for different frame types. 
Graphical (X) frames should have the theme color, while terminal frames should match the terminal color (which matches the theme color...but terminal frames can't directly render this color)"
    (if (display-graphic-p)
        (set-background-color "#202020")
      (set-background-color "black")))

您可以使用以下方法从中获得很多收益make-variable-frame-localset-background-color在上面,这已经是本地框架了)。

我不知道这是否是最好的模式,但是如果TTY模式和X模式Emacs之间的差异相对较小,则可以使配置管理更加容易。

上面的代码是从我的.emacs.d中提取的


我一直在想是否有某种方法可以逐帧“检测”我所处的模式。
nispio

1
这样就可以了。(display-graphic-p)给出t,如果当前帧是图形,nil否则。由于框架无法在图形之间移动,因此无法在框架之间移动(afaik),因此在框架创建时附加建议可确保为给定框架达到所需状态。
戴维·史密斯

这绝对是最方便的答案。
马拉巴巴2014年

4

您不需要更改在同一emacs守护程序中运行的不同框架的设置的建议after-make-frame-functions像这样使用钩子

(defvar my/ttheme 'tango-dark)
(defvar my/gtheme 'tango)
(defun my/frame-configuration (frame)
  "configure the current frame depending on the frame type"
  (with-selected-frame frame
    (if (display-graphic-p)
        (progn
          (message "after-make-frame-functions hook: window system")
          (set-frame-size frame 115 60)
          ;; other settings for a graphical frame
          (load-theme my/gtheme t))
      (message "after-make-frame-functions hook: text console")
      (load-theme my/ttheme t)
      (set-frame-parameter frame 'menu-bar-lines 0))))

(add-hook 'after-make-frame-functions 'my/frame-configuration)

;; normal start without daemon
(if (not (daemonp))
  (my/frame-configuration (selected-frame)))

通过这种方式进行定义具有额外的好处,即使您不以守护程序模式启动,它也可以设置所需的帧配置。

不幸的load-theme是,该框架不是本地框架,因此,如果您确实对文本和图形框架使用了不同的主题,那么其他框架也会被着色。

奖励信息:为您的终端配置至少256种颜色,以使您真正感受到所选主题的感觉。在您的Shell启动文件之一中使用以下设置:

TERM=xterm-256color
export TERM

并非所有终端都支持256色,例如xfce4-terminal仍然仅为8(我切换到sakura以获得漂亮的颜色)。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.