如何将DISPLAY名称放在GNU EMACS的frame-title中

时间:2012-07-02 20:56:39

标签: emacs

我通过VNC从Windoze PC在多台显示器上使用GNU EMACS。

(目前5 - 4大,我的平板电脑上的小显示器1。两个垂直1200x1920,两个水平1920x1200,加上小。)

我目前正在这样做的方法是在每台显示器上运行一个单独的VNC。然后我打开一个emacs,并使用make-frame-other-display在另一个VNC窗口中打开emacs的帧。

为了让事情变得更复杂 - 我在最新的Ubuntu系统上运行VNC,但是我在一台非常过时的机器上运行emacs,其余的构建工具都存在。即VNC显示与emacs在同一台机器上不是本地的。

而不是xhost +,我在每个VNC中打开一个xterm,然后ssh到运行emacs的机器上。这将创建localhost:16.0形式的DISPLAYS。然后我使用这些localhost DISPLAYs使用make-frame-on-display。

这让人感到困惑。

如果我在xterm窗口中留下“echo $ DISPLAY”会有所帮助。或者对xterm的标题进行更新。

我想同样改变EMACS'帧'标题,以反映每帧的内容是当前的DISPLAY。但是做了

(defvar frame-title-specific-ag "emacs"
 "title element from frame-title-format that is specific to a particular emacs instance; andy glew")
(setq frame-title-format
  (list
    "frame=%F "
    (format "%s" frame-title-specific-ag)
    " " 'system-name
    " DISPLAY="
    (getenv "DISPLAY")
    " %b"
    " " (format "pid:%d" (emacs-pid))
    " user:"(user-login-name))
  )

只获取整个emacs的DISPLAY变量。

问:有没有办法找出与任何特定帧相关的显示?

2 个答案:

答案 0 :(得分:3)

要获取当前帧的显示名称,请使用

(frame-parameter nil 'display)

或用特定框架替换nil以获取其显示的名称而不是当前的名称。例如,使用它来显示标题中的显示:

(setq frame-title-format
      '("DISPLAY=" (:eval (frame-parameter nil 'display))))

请注意,此表单完全引用非常重要,因此使用的列表具有:eval,告知Emacs在呈现帧标题时运行代码。没有它,你可能会想写一些类似的东西:

(setq frame-title-format
      (list "DISPLAY=" (frame-parameter nil 'display)))

但这不起作用。问题是在评估此表单时会立即发生函数调用,结果是一个包含特定字符串的列表,该字符串是此评估发生的任何帧的名称,并且字符串不会神奇地改变。

答案 1 :(得分:-1)

Eli Barzilay指出我们

(frame-parameter nil 'display)

这是那里的90%。

以下内容将与当前所选帧相关联的显示放在其帧标题中。

(setq frame-title-format
  '(
     "DISPLAY="
     (:eval (frame-parameter nil 'display))
    )
  )

Glew:这会在创建帧时显示当前所选帧 (例如,通过制作帧显示) 标题。由于这可能是一个不同的框架,完全不同 显示,它并不总是想要的。

未加引号的,un-:eval'ed表单,显示当前所选框架, 在评估setq时,在标题中。这甚至不是想要的东西。

以下是我最终的结果:

我如上设置了默认的frame-title-format。但我真的没有使用它,因为我 钩住以下内容:

(defun ag-set-frame-title (frame)
  "set frame-title to glew preference, optional arg FRAME / default nil (currently selected frame)"
  (interactive)
  ;; TBD: make-variable-frame-local is deprecated in more recent versions of emacs
  ;; than the antiquated version at my work. use modify-frame-parameters instead
  (let (x)
    (setq x
      (concat
    (or frame-title-specific-ag "emacs")
    " " system-name
    " DISPLAY=" (frame-parameter frame 'display)
    " " (format "pid:%d" (emacs-pid))
    " user:" (user-login-name)
    ;;" " (buffer-name)
    )
      )
    (modify-frame-parameters frame (list (cons 'title x)))
    )
  )

;; TBD: this old emacs does not have modern hooks
(setq after-make-frame-functions '(ag-set-frame-title))

好的方法:

(defun ag-fix-frame-titles ()
  "run ag-set-frame-title on frame-lits"
  (interactive)
  (mapc 'ag-set-frame-title (frame-list))
  )
(ag-fix-frame-titles)

注意:对于每条评论字符串,此处描述的修补程序可能只需要旧版本的emacs,例如21.4.1。 @EliBarzilay表示,他正在使用的任何版本的emacs都不需要。

你想要的所有减去积分,伙计们。真相。