Oto mój super hackerski sposób na symulację powiązania zdarzenia kluczowania / opuszczania za pomocą timerów.
Ogólnie sugerowałbym skorzystanie z odpowiedzi Sigmy, ale poprosiłeś o sposób na zamknięcie podglądu przez zwolnienie, więc muszę spróbować.
Zasadniczo to, co możesz zrobić, to powiązać funkcję, która będzie twoją funkcją „keydown”, z klawiszem i wewnątrz tej akcji, uruchom licznik czasu bezczynności, który wykonuje funkcję, która jest twoją funkcją „keyup”, dopóki przytrzymasz klawisz dane klucze, funkcja „keydown” będzie się uruchamiała w kółko, co uniemożliwi działanie liczników czasu bezczynności. Oczywiście musisz zrekompensować fakt, że polecenie będzie się uruchamiało w kółko, prawdopodobnie przez ponowne przypisanie klawisza do jakiejś funkcji noop w funkcji „keydown”, a następnie ponowne przypisanie funkcji „keydown” w funkcji „keyup”.
Tak więc w twoim przypadku funkcja „keydown” otworzy bufor podglądu z zawartością pliku w punkcie iw tym buforze podglądu wiąże tę samą kombinację klawiszy z jakimś poleceniem noop. Funkcja „keydown” uruchomi również czas bezczynności, który usunie bufor podglądu i przywróci Cię z powrotem tam, gdzie byłeś.
Krótka historia tutaj to kod:
Powiązanie tej funkcji z kombinacją klawiszy (użyłem C-M-v), kiedy naciśniesz ją nad nazwą pliku, otworzy się nowy bufor wyświetlający zawartość pliku w punkcie, kiedy puścisz, nastąpi powrót do pierwotnego bufor.
(setq lexical-binding t)
(defun quick-view-file-at-point ()
"Preview the file at point then jump back after some idle time.
In order for this to work you need to bind this function to a key combo,
you cannot call it from the minibuffer and let it work.
The reason it works is that by holding the key combo down, you inhibit
idle timers from running so as long as you hold the key combo, the
buffer preview will still display."
(interactive)
(let* ((buffer (current-buffer))
(file (thing-at-point 'filename t))
(file-buffer-name (format "*preview of %s*" file)))
(if (and file (file-exists-p file))
(let ((contents))
(if (get-buffer file)
(setq contents (save-excursion
(with-current-buffer (get-buffer file)
(font-lock-fontify-buffer)
(buffer-substring (point-min) (point-max)))))
(let ((new-buffer (find-file-noselect file)))
(with-current-buffer new-buffer
(font-lock-mode t)
(font-lock-fontify-buffer)
(setq contents (buffer-substring (point-min) (point-max))))
(kill-buffer new-buffer)))
(switch-to-buffer (get-buffer-create file-buffer-name))
(setq-local header-line-format "%60b")
(delete-region (point-min) (point-max))
(save-excursion (insert contents))
(local-set-key (kbd "C-M-v") (lambda () (interactive) (sit-for .2)))
(run-with-idle-timer
.7
nil
(lambda ()
(switch-to-buffer buffer)
(kill-buffer file-buffer-name))))
(message "no file to preview at point!"))))
Również tutaj jest gif w akcji, wszystko co robię to:
- umieść kursor nad plikiem
- naciśnij i przytrzymaj moje skrót klawiszowy
- podgląd jest wyświetlany
- kiedy puszczam, podgląd zostaje zabity, a ty wracasz tam, gdzie byłeś.
Jedną ważną rzeczą, na którą należy zwrócić uwagę, są sekundy bezczynnika, w moim kodzie użyłem, .7
ale to rodzaj magicznej liczby, chcesz zachować ją naprawdę małą, ale jeśli widzisz, że podgląd miga dwa razy, spróbuj za każdym razem zwiększać go o 1/10 sekundy aż znajdziesz odpowiednie miejsce dla swojej maszyny.
* Zauważ też, że w funkcji staram się trochę czcionkizować bufor podglądu, ale nie udało mi się go uruchomić, to będzie następny krok, aby uczynić go bardziej użytecznym. **