2013-04-14 15 views
5

Chcę ustawić różne interwały dla migania WŁĄCZONY i dla migania WYŁ. Chodzi mi o to, żeby kursor był widoczny przez 1 sekundę i wyłączony przez 0,2 sekundy. Przeczytałem dokumentację kursora, ale najbliżej znalazłem migający interwał kursora, który zmienia migotanie ON i OFF.Emacs - ustaw różne interwały włączania i wyłączania kursora.

Jaki jest najlepszy sposób dostosowania tego w Emacs?

Odpowiedz

3

Nie ma taka funkcjonalność wbudowana w Emacs, ale można siekać go dodając następujące linie do swojego pliku .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 realizuje miganie kursora z funkcją przełączania nazwie przez zegar. Za każdym razem, gdy funkcja jest wywoływana, ukrywa ona kursor, jeśli jest on aktualnie widoczny, lub wyświetla go, jeśli jest niewidoczny. Niestety, timer wywołuje tę funkcję w ustalonych odstępach czasu.

Aby uzyskać różne czasy opóźnień w zależności od stanu kursora, powyższy kod advises służy do wewnętrznej funkcji wyświetlania lub ukrywania kursora. Za każdym razem, gdy funkcja ta jest wywoływana, rada zmienia czas opóźnienia timera na 1 lub 0.2, w zależności od tego, czy kursor jest widoczny, czy nie. Oznacza to, że za każdym razem, gdy kursor jest ukryty lub pokazany, czas opóźnienia timera zostanie zmieniony.

Całkiem hackish, ale to załatwia sprawę.

+1

Czy mógłbyś wyjaśnić, jak to działa? Jestem całkiem zainteresowany. –

+0

Dzięki za odpowiedź. Łamie się, jeśli wywołasz tryb migającego kursora, ale działa zgodnie z oczekiwaniami :) – Jesse

+0

Czy mógłbyś się zastanowić, kiedy to się złamie? – Thomas

2

Udało mi się zmodyfikować funkcję blink-cursor-timer-function, aby wspierać to, co chcesz.

Po pierwsze, trzeba zmienić wartość blink-cursor-interval do .2

następnie ten kod powinien załatwić sprawę: blink-cursor-timer-function nazywa co blink-cursor-interval sekund. Tak więc ta funkcja będzie wywoływana co 2,2 sekundy. Będzie utrzymywała kursor na 5 połączeniach, a następnie wyłącza ją na 1. Tak więc 5 wywołań z prędkością 2,2 sekundy na każde połączenie daje 1 sekundę czasu włączenia, a następnie tylko .2 sekundy czasu wyłączenia.

;; 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

Twoje rozwiązanie działa dobrze, ale druga odpowiedź wygląda na czystszą i mogę wybrać tylko jedną. W każdym razie, dziękuję też – Jesse