2009-10-04 16 views

risposta

9

Se per "finestra" si intende la definizione di finestre di Emacs, vale a dire i riquadri, non proprio.

Se per "finestra" si intende la concezione di finestre di tutti gli altri, che Emacs chiama frame, quindi sì. Ecco un esempio:

(defadvice handle-switch-frame (around switch-frame-set-background) 
    (set-background-color "white") 
    ad-do-it 
    (set-background-color "yellow")) 
(ad-activate 'handle-switch-frame) 

(defadvice delete-frame (after delete-frame-set-background) 
    (set-background-color "yellow")) 
(ad-activate 'delete-frame) 
+1

E se lo desidera per finestra, vorrei solo raccomandare una modeline video inversa. Se hai bisogno di più di un segnale visivo, apri meno finestre. – jrockway

+0

Uh, modeline attiva, cioè. – jrockway

+2

Intendo la finestra di Emacs. L'evidenziazione della linea di modalità non è abbastanza per me. Io uso un grande schermo, molte finestre sono aperte ... e molto spesso ho iniziato a modificare non la finestra che volevo modificare. Proverò se la modalità video inverso sarà un po 'migliorata –

3

Se ciò che si sta cercando di raggiungere è quello di evidenziare il buffer/frame corrente, il mio modo di fare che è attraverso Highlight-Current-Line. Ti mostra la linea in cui si trova il cursore, ma un effetto collaterale è che mostra anche in quale buffer/frame ti trovi. Potresti configurarlo per evidenziare l'intero buffer, o cercare nel codice per vedere come fanno esso.

+0

Sì, ciò che intendevo per "non proprio" era che non si può evidenziare una finestra, solo un buffer, perché qualsiasi modifica al contenuto del buffer influirà su ogni vista del buffer. Per me, il colore del modellino + il cursore lampeggiano bene. –

+0

In effetti il ​​buffer è un termine migliore per quello della finestra. Voglio evidenziare il buffer corrente :) –

6

Questa è un'alternativa che utilizza il colore inattivo della modellazione corrispondente allo sfondo in modo che l'unica finestra con colore sia la finestra attiva. Ho un gancio per entrare e uscire dal minibuffer e anche quando cambio finestre. Io uso grassetto per alcune cose di modeline come sola lettura e il nome del file, in modo che il diverso colore non risulti quando si passa a Windows. Quando inserisco il minibuffer, la modeline della finestra attiva diventa inattiva fino a quando esco dal minibuffer, o quando passo da un minibuffer attivo (lasciandolo aperto) ad un'altra finestra. Ho dovuto impostare anche la casella dello sfondo modello per abbinarla.

(set-face-attribute 'default nil :background "black" :foreground "white" 
    :font "Courier" :height 180) 

(set-face-attribute 'mode-line nil 
    :height 160 ;; affects everything 
    :foreground "black" :background "gray70") 

(set-face-attribute 'mode-line-inactive nil 
    :foreground "gray70" :background "black" :box '(:line-width 1 :color "black")) 

(defun enter-minibuffer-setup() 
    (whitespace-mode t) 
    (set-face-attribute 'mode-line nil 
    :height 160 :foreground "gray70" :background "black" :box '(:line-width 1 :color "black")) 
    (set-face-attribute 'minibuffer-prompt nil :background "black" :foreground "cyan") 
    (set (make-local-variable 'face-remapping-alist) 
    '((default :background "black" :foreground "yellow")))) 

(defun exit-minibuffer-setup() 
    (cond 
    ((or save-as-variable multi-extract-variable multi-attach-variable) 
     (set-face-attribute 'mode-line nil :height 160 :foreground "black" :background "#eab700")) 
    (t (set-face-attribute 'mode-line nil :height 160 :foreground "black" :background "gray70" :box nil))) 
    (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" :box '(:line-width 1 :color "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)) 

ALTERNATIVA RISPOSTA (concetto simile): set-face-attribute è troppo lento per cambiare volti durante redisplay. Il metodo preferito per regolare i volti in quel contesto è con la funzione face-remap-add-relative; tuttavia, questa funzione è un po 'complicata da usare perché i volti si accumulano uno dietro l'altro e diventano ombreggiati. Quindi, dovrò rivedere la seguente bozza di risposta alternativa (in futuro) per incorporare face-remap-add-relative - nel frattempo, sto impostando manualmente lo face-remapping-alist (che non è il metodo preferito secondo il manuale/doc-string).

(defvar modeline-selected-window nil) 

(let ((default-background (face-background 'default nil 'default))) 
(set-face-attribute 'mode-line-inactive nil :background default-background :box nil)) 

(defun modeline-record-selected-window() 
    (setq modeline-selected-window (selected-window))) 

(defun modeline-update-function() 
    (cond 
    ((minibufferp) 
     (let ((default-background (face-background 'default nil 'default))) 
     (with-selected-window (minibuffer-window) 
      (setq-local face-remapping-alist '(
      (default :foreground "blue") 
      (minibuffer-prompt :foreground "red")))) 
      (setq-default face-remapping-alist `((mode-line ,'mode-line-inactive))))) 
    (t 
     (with-selected-window (minibuffer-window) 
     (when (local-variable-p 'face-remapping-alist) 
      (kill-local-variable 'face-remapping-alist))) 
     (setq-default face-remapping-alist nil)))) 

(defun modeline-set-format() 
    (setq mode-line-format '(
    (:eval 
     (if (eq modeline-selected-window (selected-window)) 
     (propertize "SELECTED WINDOW" 'face 'font-lock-warning-face) 
     (propertize "NOT-SELECTED WINDOW" 'face 'font-lock-keyword-face))))) 
    ;; next two lines make the affect immediately apparent 
    (setq modeline-selected-window (selected-window))  
    (force-mode-line-update)) 

(define-minor-mode modeline-mode 
"This is a minor-mode for `modeline-mode`." 
    :init-value nil 
    :lighter " ML" 
    :keymap nil 
    :global t 
    :group nil 
    (cond 
    (modeline-mode 
     (add-hook 'post-command-hook 'modeline-record-selected-window) 
     (add-hook 'buffer-list-update-hook 'modeline-update-function) 
     (add-hook 'text-mode-hook 'modeline-set-format) 
     (when (called-interactively-p 'any) 
     (message "Globally turned ON `modeline-mode`."))) 
    (t 
     (remove-hook 'post-command-hook 'modeline-record-selected-window) 
     (remove-hook 'buffer-list-update-hook 'modeline-update-function) 
     (remove-hook 'text-mode-hook 'modeline-set-format) 
     (when (called-interactively-p 'any) 
     (message "Globally turned OFF `modeline-mode`."))))) 

(modeline-mode 1) ;; globally turn on minor-mode 

modalità

Example http://www.lawlist.com/images/modeline-example.png

+0

Bella idea e screenshot ispiratore! – katspaugh

3

Crosshairs è la soluzione migliore, credo. Non solo attira l'attenzione sulla finestra attiva, ma mostra anche immediatamente dove il cursore si trova in un modo ovvio. Si può facilmente attivare/disattivare (collegarlo a C-+.)

In alternativa è anche possibile utilizzare crosshairs-toggle-when-idle. Non mostra il mirino finché non è trascorso un ritardo. Anche questo è un interruttore.

Ovviamente è possibile utilizzare mirini insieme a una faccia in-faccia mode-line.

2

usavo hiwin-mode come suggerito in questa discussione, ma c'è un open issue con buffer di shell (quando inattivo, il testo diventa invisibile).

Pertanto, un'altra opzione che mi sto godendo finora è auto-dim-other-buffers mode.

Problemi correlati