1

我通过 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 DISPLAY 使用 make-frame-on-display。

这变得令人困惑。

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

我想类似地更改 EMACS 框架的标题,以反映每个框架的当前显示。但是做

(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 变量。

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

4

2 回答 2

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)))

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

于 2012-07-02T21:07:25.697 回答
-1

Eli Barzilay 向我们指出

(frame-parameter nil 'display)

这是那里的90%。

下面将与当前选定的框架关联的显示放在其框架标题中。

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

Glew:这会将当前选定帧的显示,在创建帧时(例如,通过 make-frame-on-display)放在标题中。由于这可能是一个不同的框架,在一个完全不同的显示中,它并不总是想要的。

unquoted, un-:eval'ed, 将当前选定帧的显示,在 setq 评估时,放在标题中。这甚至比想要的还要少。

这是我最终得到的结果:

我如上所述设置了默认的框架标题格式。但我并没有真正使用它,因为我挂钩了以下内容:

(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 都不需要。

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

于 2012-07-03T06:00:08.810 回答