Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在失去焦点时更改Emacs窗口的外观_Linux_Emacs_Lisp_Elisp_Dot Emacs - Fatal编程技术网

Linux 在失去焦点时更改Emacs窗口的外观

Linux 在失去焦点时更改Emacs窗口的外观,linux,emacs,lisp,elisp,dot-emacs,Linux,Emacs,Lisp,Elisp,Dot Emacs,当我编程时,我使用两个屏幕,两个屏幕上都有Emacs,每个窗口中有两个缓冲区,每次屏幕上总共有4个开源文件 我使用C-x b在缓冲区之间切换,使用Alt TAB在窗口之间切换。我通过为模式行和模式行非活动定义不同的面来更改缓冲区之间切换时的外观。但是,当我通过Alt TAB从Emacs窗口完全切换到另一个Emacs窗口时,如何停用缓冲区 我在Ubuntu11.04和GNOME2.32.1上使用Emacs23.2.1可能也是相关的 PS:问题是在一个不同的目标之后,但是在相同的原始事件“窗口失去焦

当我编程时,我使用两个屏幕,两个屏幕上都有Emacs,每个窗口中有两个缓冲区,每次屏幕上总共有4个开源文件

我使用
C-x b
在缓冲区之间切换,使用
Alt TAB
在窗口之间切换。我通过为
模式行
模式行非活动
定义不同的面来更改缓冲区之间切换时的外观。但是,当我通过
Alt TAB
从Emacs窗口完全切换到另一个Emacs窗口时,如何停用缓冲区

我在Ubuntu11.04和GNOME2.32.1上使用Emacs23.2.1可能也是相关的


PS:问题是在一个不同的目标之后,但是在相同的原始事件“窗口失去焦点”下。我不知道这是否只能用Emacs来完成,但一种可能的替代方法是在shell脚本中运行,该脚本会定期检查哪个窗口具有焦点,如果有更改,它会让Emacs知道,通过该脚本可以将lisp代码发送到正在运行的Emacs进行评估:

-e'
--eval' 告诉Emacs评估一些Emacs Lisp代码,而不是访问 一些文件。如果给定此选项,则 `EmacClient'被解释为要 评估,而不是作为要访问的文件列表


这可能取决于您的窗口管理器,以及用emacs的说法,它如何管理多个窗口或框架。下面的代码在fvwm中就像一个冠军,但在gnome中并不总是这样

我将按键C-o映射到两个帧之间,当你想转到另一个帧时,这会很有帮助,但alt选项卡会带你浏览许多多余的应用程序

如果使用两个帧运行单个emacs实例,可以使用以下内容:

(defun pgr-previous-frame ()
  "go to the previous frame"
  (interactive)
  (pgr-switch-frame (previous-frame)))

(defun pgr-next-frame ()
  "go to the next frame"
  (interactive)
  (pgr-switch-frame (next-frame)))

(defun pgr-switch-frame (frame)
  "go to the specified frame and raise it"
  ;; reset the frame properties here
  (select-frame frame)     
  (raise-frame frame)
  ;;change the display in some manner here
  )

您还可以尝试添加一些建议来提升框架,而降低框架还没有尝试过,但值得一试。

在Emacs 24.4及更高版本中,您可以使用
在钩子中聚焦
在钩子外聚焦
。这段代码似乎有效,因此非活动帧的活动窗口与非活动窗口具有相同的颜色:

(defvar my-mode-line-active-background "gray75")
(defvar my-mode-line-inactive-background "gray40")

(defun my-unhighlight-mode-line ()
  (set-face-attribute 'mode-line nil
                      :background my-mode-line-inactive-background))

(add-hook 'focus-out-hook 'my-unhighlight-mode-line)

(defun my-highlight-mode-line ()
  (set-face-attribute 'mode-line nil
                      :background my-mode-line-active-background))

(add-hook 'focus-in-hook 'my-highlight-mode-line)

我真的很喜欢@logoscia答案,这让我可以做这个更通用的版本。当没有焦点时,它使用非活动的
模式行

(add-hook 'focus-out-hook
      (lambda ()
        (copy-face 'mode-line '--mode-line-backup)
        (copy-face 'mode-line-inactive 'mode-line)))
(add-hook 'focus-in-hook
      (lambda ()
        (copy-face '--mode-line-backup 'mode-line)))

有趣的解决方案,但我希望焦点事件立即更新窗口外观,这需要
wmctrl
检查哪些窗口以极高的速度拥有焦点。我想知道我是否可以捕捉“焦点改变”事件。shell脚本只是一个简单的例子。可能有一种方法可以订阅X中的窗口更改事件,因此您可以编写一个单独的小程序,订阅这些事件,并在X回调时通知emacs。首先要弄清楚术语:缓冲区包含文件,窗口显示缓冲区,窗口以帧显示。使用Alt选项卡可以切换帧。也就是说:据我所知,你不能取消选择一个窗口来免费获得你的行为。谢谢你的澄清。我有点误用术语。我想我用“window”来表示窗口或框架。另外,FrameMove()与WindMove(内置)相结合,在Emacs中创建了一种在窗口/框架之间导航的非常直观的方式。