Emacs 如何使用活动小缓冲区更改模型线颜色并切换到其他窗口
在同一帧内,使用活动的minibuffer,有人能想出一种方法,让切换到Emacs 如何使用活动小缓冲区更改模型线颜色并切换到其他窗口,emacs,elisp,Emacs,Elisp,在同一帧内,使用活动的minibuffer,有人能想出一种方法,让切换到其他窗口的行为类似于minibuffer退出挂钩(而不完全退出minibuffer) 基本上,我希望当焦点在微缓冲区中时,主窗口显示非活动模型线颜色,然后当我使用其他窗口从半活动微缓冲区移动到另一个窗口时,将modline更新为活动(对于有焦点的窗口) 例如,在同一帧中有两个窗口(并排)打开--窗口#1是我的笔记--窗口#2是我要修改的记录的Big Brother数据库显示。因此,我打开minibuffer以输入记录修改,然
其他窗口
的行为类似于minibuffer退出挂钩
(而不完全退出minibuffer)
基本上,我希望当焦点在微缓冲区中时,主窗口显示非活动模型线颜色,然后当我使用其他窗口
从半活动微缓冲区移动到另一个窗口时,将modline更新为活动(对于有焦点的窗口)
例如,在同一帧中有两个窗口(并排)打开--窗口#1是我的笔记--窗口#2是我要修改的记录的Big Brother数据库显示。因此,我打开minibuffer以输入记录修改,然后在窗口#1中的注释和minibuffer之间来回切换以复制和粘贴相关部分。使用other window
在这三个区域之间跳转时,仍然很难知道焦点是在minibuffer中还是在其他窗口中
Window # 1 (notes) | Window # 2 (bbdb record display)
|
___________________________|_____________________________________
Name: lawlist . . .
(取消进入微缓冲区设置()
(设置面属性“模式行为零”
:高度160:前景“灰色70”:背景“黑色”)
(设置(使局部变量的面重新映射)
((默认值:背景“灰色10”:前景“黄色”))
(取消退出小型缓冲区设置()
(设置面属性“模式行为零”
:高度160:前景“黑色”:背景“灰色70”))
(添加挂钩“迷你缓冲区设置挂钩”进入迷你缓冲区设置)
(添加挂钩“迷你缓冲区退出挂钩”退出迷你缓冲区设置)
更新草案——借用@Carl Groner的(minibufferp)
(defun enter-minibuffer-setup ()
(set-face-attribute 'mode-line nil
:height 160 :foreground "gray70" :background "black")
(set (make-local-variable 'face-remapping-alist)
'((default :background "black" :foreground "yellow")))
(set-face-attribute 'minibuffer-prompt nil
:background "black" :foreground "cyan"))
(defun exit-minibuffer-setup ()
(set-face-attribute 'mode-line nil
:height 160 :foreground "black" :background "gray70")
(set-face-attribute 'minibuffer-prompt nil
:background "black" :foreground "cyan"))
(add-hook 'minibuffer-setup-hook 'enter-minibuffer-setup)
(add-hook 'minibuffer-exit-hook 'exit-minibuffer-setup)
(defun lawlist-minibuffer-conditions ()
(cond
((minibufferp)
(set-face-attribute 'mode-line nil
:height 160 :foreground "gray70" :background "black")
(set-face-attribute 'minibuffer-prompt nil
:background "black" :foreground "cyan"))
(t
(set-face-attribute 'mode-line nil
:height 160 :foreground "black" :background "gray70")
(set-face-attribute 'minibuffer-prompt nil
:background "black" :foreground "gray70")) ))
(defun lawlist-forward-window ()
(interactive)
(other-window 1)
(lawlist-minibuffer-conditions))
(defun lawlist-backward-window ()
(interactive)
(other-window -1)
(lawlist-minibuffer-conditions))
一个选项是“在切换到微型缓冲区时,使用其他窗口
函数执行某种形式
例如,当您使用其他窗口
循环返回到minibuffer时,以下代码将使minibuffer提示变为绿色,如果您降落在非minibuffer窗口上,则将提示变为灰色:
(defadvice other-window (after adv-other-window-minibuffer
(COUNT &optional ALL-FRAMES))
"Make minibuffer prompt green when switched to"
(if (minibufferp)
(set-face-attribute 'minibuffer-prompt nil
:foreground "green" :background "black")
(set-face-attribute 'minibuffer-prompt nil
:foreground "dark grey" :background "black")))
(ad-activate 'other-window)
当然,您不仅限于设置minibuffer提示符,但我不清楚您想要达到什么效果 问题是什么?您的代码不符合您的要求吗?当minibuffer处于活动状态时,两个窗口的modeline状态都变为非活动状态。当我在不关闭小缓冲区的情况下使用
其他窗口
时(例如,当我需要从窗口#1复制名称或地址,然后切换回小缓冲区粘贴时),唯一的指示是闪烁的光标
,以指示焦点的改变。我希望在使用other window
在minibuffer和window#1或window#2之间切换时,modeline也会发生变化。我明白了。不知道答案,除非在某个点上有缓冲区切换挂钩。然而,在线程中对此进行了一些讨论,以及在进入/退出minibuffer时主模式的更改是否会触发模式更改挂钩等。是否可以使用键映射的可用性来代替主模式或次模式来指定条件的存在或不存在,例如。,当minibuffer local map
处于活动状态时,将mode line设置为红色,否则设置为蓝色?是的,您可以这样做。但您也可以只检查主模式的值<代码>(添加钩子的微型缓冲区设置钩子(lambda()(消息“主模式:%s”主模式)(睡眠1))
。或者您可以检查(当前缓冲区)的值
。问题不在于能否检查微型缓冲区是否为当前缓冲区、窗口或模式,而在于找到正确的触发器:对某些事件或更改采取行动。感谢您提出的建议——我会尝试一下。我只是尝试用(微型缓冲区)
替换(相等(缓冲区名称)“*Minibuf-1*”)
在我的第一个工作草稿答案中,它工作得很好。我以前从未见过使用(minibufferp)
——非常感谢!