Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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
Emacs 如何使用活动小缓冲区更改模型线颜色并切换到其他窗口_Emacs_Elisp - Fatal编程技术网

Emacs 如何使用活动小缓冲区更改模型线颜色并切换到其他窗口

Emacs 如何使用活动小缓冲区更改模型线颜色并切换到其他窗口,emacs,elisp,Emacs,Elisp,在同一帧内,使用活动的minibuffer,有人能想出一种方法,让切换到其他窗口的行为类似于minibuffer退出挂钩(而不完全退出minibuffer) 基本上,我希望当焦点在微缓冲区中时,主窗口显示非活动模型线颜色,然后当我使用其他窗口从半活动微缓冲区移动到另一个窗口时,将modline更新为活动(对于有焦点的窗口) 例如,在同一帧中有两个窗口(并排)打开--窗口#1是我的笔记--窗口#2是我要修改的记录的Big Brother数据库显示。因此,我打开minibuffer以输入记录修改,然

在同一帧内,使用活动的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)
——非常感谢!