2013-10-23 36 views
2

在同一个框架与活性小缓冲区,任何人都可以想办法把开关other-window行为类似于一个minibuffer-exit-hook没有完全退出迷你缓冲器)?如何改变模式行颜色与主动小缓冲区并切换到其他窗口

本质上,我想让主窗口在焦点位于minibuffer中时显示非活动模式行颜色,然后当我从半活动状态移动时将modline更新为活动状态(对于具有焦点的窗口)使用other-window将小缓冲器转移到另一个窗口。

例如,在同一个框架(并排)中打开两个窗口 - 窗口#1是我的笔记 - 窗口#2是我想要修改的记录的大哥哥数据库显示。所以我打开迷你缓冲器输入我的记录修改,然后在我的笔记在Window#1和Minibuffer之间来回切换,以复制和粘贴相关部分。当使用other-window在三个区域之间跳转时,仍然很难知道焦点是在小缓冲区还是其他窗口中。

Window # 1 (notes)         |  Window # 2 (bbdb record display) 
                           | 
___________________________|_____________________________________ 
Name: lawlist . . . 

(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 "gray10" :foreground "yellow")))) 

(defun exit-minibuffer-setup() 
(set-face-attribute 'mode-line nil 
    :height 160 :foreground "black" :background "gray70")) 

(add-hook 'minibuffer-setup-hook 'enter-minibuffer-setup) 

(add-hook 'minibuffer-exit-hook 'exit-minibuffer-setup) 
+0

问题是什么?你的代码不是做你想做的? – Drew

+1

当小型缓冲器处于活动状态时,两个窗口的模式状态变为无效。当我在不关闭小缓冲区的情况下使用'other-window'时(例如,当我需要从窗口#1复制名称或地址,然后切换回小缓冲区进行粘贴时),唯一的提示是“闪烁的光标”焦点的变化。我希望当使用'other-window'在minibuffer和Window#1或2之间切换时,modeline也会改变。 – lawlist

+0

我明白了。不知道答案,除非在某个时刻会有缓冲切换挂钩。然而,在[bug#155767](http://debbugs.gnu.org/cgi/bugreport.cgi?bug=15577#53)这个主题中有一些讨论,以及主要模式是否改变进入/退出minibuffer触发模式更改挂钩等。 – Drew

回答

1

一种选择将是 “advise” 的other-window函数来执行某种形式。

例如,下面的代码将会把小缓冲区提示绿色,当你循环回它使用other-window来了,如果你的土地非小缓冲区窗口事实提示灰色:

(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提示符,但我不清楚你正在努力达到什么样的效果。

+0

感谢您提出建议 - 我会我试着在我的第一个工作草案的答案中用'(minibufferp)'代替'(等于(buffer-name)'* Minibuf-1 *“)',它工作的很好,我从未见过' minibufferp)'以前用过 - 非常感谢! – lawlist

+0

你的建议效果很好。 – lawlist

0

更新草案 - 从@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)) 
相关问题