2013-04-14 13 views
5

Desidero impostare diversi intervalli per il lampeggio ON e per il lampeggio OFF. Voglio dire, voglio che il cursore rimanga visibile per 1 secondo e OFF per 0,2 secondi. Ho letto la documentazione del cursore ma il più vicino che ho trovato è l'intervallo del cursore lampeggiante che cambia sia ON che OFF lampeggiante.Emacs - imposta intervalli diversi per il lampeggiamento del cursore on e off

Qual è il modo migliore per personalizzare questo in Emacs?

risposta

3

Non esiste una funzionalità incorporata in Emacs, ma si può incidere aggiungendo le seguenti righe al file .emacs:

(defvar blink-cursor-interval-visible 1) 
(defvar blink-cursor-interval-invisible 0.2) 

(defadvice internal-show-cursor (before unsymmetric-blink-cursor-interval) 
    (when blink-cursor-timer 
    (setf (timer--repeat-delay blink-cursor-timer) 
      (if (internal-show-cursor-p) 
       blink-cursor-interval-visible 
      blink-cursor-interval-invisible)))) 
(ad-activate 'internal-show-cursor) 

Emacs implementa il lampeggio del cursore con una funzione di commutazione chiamato da un timer. Ogni volta che viene chiamata la funzione, nasconde il cursore se è attualmente visibile o lo mostra se è invisibile. Sfortunatamente, il timer chiama questa funzione a intervalli fissi.

Per realizzare tempi di ritardo diversi a seconda dello stato del cursore, il codice sopra riportato advises la funzione interna che mostra o nasconde il cursore. Ogni volta che viene chiamata la funzione, il consiglio cambia il tempo di ritardo del timer su 1 o su 0,2, a seconda che il cursore sia visibile o meno. Cioè, ogni volta che il cursore viene nascosto o mostrato, il tempo di ritardo del timer viene modificato.

Abbastanza hacker, ma fa il trucco.

+1

Ti dispiacerebbe spiegare come funziona? Sono abbastanza interessato. –

+0

Grazie per la risposta. Si interrompe se si chiama la modalità lampeggiamento del cursore, ma funziona come previsto :) – Jesse

+0

Ti dispiacerebbe elaborare quando si rompe? – Thomas

2

Sono stato in grado di modificare la funzione blink-cursor-timer-function per supportare ciò che si desidera credere.

In primo luogo, è necessario modificare il valore di blink-cursor-interval-0,2

allora questo codice dovrebbe fare il trucco: blink-cursor-timer-function è chiamato ogni blink-cursor-interval secondi. Quindi questa funzione verrà chiamata ogni2 secondi, manterrà il cursore su 5 chiamate per poi spegnerlo per 1. Quindi 5 chiamate a 2 secondi per chiamata ti daranno 1 secondo di tempo ON, quindi solo .2 secondi di tempo di spegnimento.

;; change the interval time to .2 
(setq blink-cursor-interval .2) 

;; create a variable that counts the timer ticks 
(defvar blink-tick-counter 0) 

;; this function will be called every .2 seconds 
(defun blink-cursor-timer-function() 
    "Timer function of timer `blink-cursor-timer'." 
    (if (internal-show-cursor-p) 
     (progn 
    (if (> blink-tick-counter 4) 
     (progn 
      (internal-show-cursor nil nil) 
      (setq blink-tick-counter 0)) 
     (setq blink-tick-counter (1+ blink-tick-counter)))) 
    (internal-show-cursor nil t))) 
+0

La tua soluzione funziona bene, ma l'altra risposta sembra più pulita e posso sceglierne solo una. Comunque, grazie anche a – Jesse