Ini adalah cara saya yang super hacky untuk mensimulasikan pengikatan kunci acara turun / naik dengan memanfaatkan timer.
Secara keseluruhan saya akan menyarankan pergi dengan jawaban Sigma, tetapi Anda meminta cara untuk menutup pratinjau dengan melepaskan jadi saya wajib mencoba.
Pada dasarnya apa yang dapat Anda lakukan adalah mengikat beberapa fungsi yang akan menjadi fungsi "keydown" Anda ke pengikat tombol dan di dalam tindakan itu, mulailah penghitung waktu idle yang menjalankan fungsi yang merupakan fungsi "keyup" Anda, selama Anda menekan tombol diberikan kunci, fungsi "keydown" akan menyala berulang dan ini akan menghambat timer idle dari berjalan. Tentu saja Anda perlu mengimbangi kenyataan bahwa perintah akan menyala berulang-ulang, kemungkinan dengan memutar kembali kunci ke semacam fungsi noop di fungsi "keydown" Anda, kemudian memutarkan fungsi "keydown" di fungsi "keyup".
Jadi untuk kasus penggunaan Anda, fungsi "keydown" Anda akan membuka buffer pratinjau dengan isi file pada titik dan dalam buffer pratinjau mengikat kombo kunci yang sama ke beberapa perintah seperti noop. Fungsi "keydown" Anda juga akan memulai penghitung waktu idle yang akan menghapus buffer pratinjau Anda dan mengembalikan Anda ke tempat semula.
Singkat cerita di sini adalah kode:
Bind fungsi ini ke kombo kunci (saya menggunakan C-M-v), ketika Anda menekannya di atas nama file itu akan membuka buffer baru menampilkan isi file pada titik, ketika Anda melepaskan Anda akan beralih kembali ke aslinya penyangga.
(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!"))))
Juga di sini adalah gif dari itu dalam aksi, semua yang saya lakukan adalah:
- letakkan kursor saya di atas file
- tekan dan tahan tombolbinding saya
- pratinjau ditampilkan
- ketika saya melepaskan, pratinjau terbunuh dan Anda kembali ke tempat semula.
Satu hal penting yang perlu diperhatikan adalah detik pengatur waktu idle, dalam kode saya yang saya gunakan .7
tetapi ini semacam angka ajaib, Anda ingin tetap sangat kecil, tetapi jika Anda melihat pratinjau berkedip dua kali coba naikkan 1/10 per detik setiap kali sampai Anda menemukan tempat yang tepat untuk mesin Anda.
* Juga perhatikan bahwa dalam fungsi saya mencoba untuk melakukan beberapa fontifikasi dari pratinjau buffer tetapi saya tidak dapat membuatnya berfungsi, itu akan menjadi langkah selanjutnya untuk membuatnya lebih berguna. **