我通过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变量。
问:有没有办法找出与任何特定帧相关的显示?
答案 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都不需要。
你想要的所有减去积分,伙计们。真相。