Ось мій супер хакітний спосіб імітувати прив'язку клавіш вниз / вгору, скориставшись таймерами.
В цілому я б запропонував відповісти від Sigma, але ви попросили спосіб закрити попередній перегляд, відпустивши його, тому я зобов'язаний спробувати.
В основному, що ви можете зробити - прив’язати деяку функцію, яка буде вашою функцією "клавіші", для клавіатури, і всередині цієї дії запустіть таймер очікування, який виконує функцію, яка є вашою функцією "клавіатури", поки ви утримуєте клавішу Якщо натиснути клавіші, функція "keydown" буде спрацьовувати знову і знову, і це заважатиме запущеним таймерам працювати. Звичайно, ви повинні компенсувати той факт, що команда буде стріляти знову і знову, ймовірно, повторним прив'язкою ключа до якоїсь функції noop у вашій функції "keydown", потім повторним прив'язкою функції "keydown" у функції "keyup".
Отже, у випадку використання, функція "клавіш" відкриє буфер попереднього перегляду із вмістом файлу в точці, і в цьому буфері попереднього перегляду пов'язують ту саму клавішну комбінацію з якоюсь командою noop типу. Ви "функція клавіатури" також запустить таймер очікування, який видалить попередній буфер і відновить вас там, де ви були.
Короткий сюжет короткий ось код:
Прив’яжіть цю функцію до комбінації клавіш (я використав C-M-v), коли ви натиснете її вгорі на ім'я файлу, вона відкриє новий буфер із відображенням вмісту файлу в момент, коли ви відпустите вас, ви повернетеся до оригіналу буфер.
(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!"))))
Крім того, тут є gif цього дії, і все, що я роблю, це:
- розміщую мій курсор над файлом
- натисніть і утримуйте моє в'язання клавіш
- відображається попередній перегляд
- коли я відпускаю, попередній перегляд вбивається, і ти знову там, де ти був.
Одне важливе, що слід зазначити, - це секундомір простою таймера, у моєму коді я використовував, .7
але це якесь магічне число, ви хочете, щоб воно було дійсно невеликим, але якщо ви бачите, що попередній перегляд блимає двічі, спробуйте підняти його на 1/10 секунди кожен раз поки ви не знайдете потрібне місце для своєї машини.
* Також зауважте, що у цій функції я намагаюся виконати деяку деталізацію буфера попереднього перегляду, але мені не вдалося змусити його працювати, це стане наступним кроком для того, щоб зробити його більш корисним. **