İşte zamanlayıcılardan yararlanarak tuş aşağı / yukarı olay bağlamasını simüle etmenin süper hacky yolu.
Genel olarak Sigma'nın cevabına girmeyi öneririm, ama denemek zorunda olduğum için önizlemeyi kapatmanın bir yolunu istediniz.
Temelde yapabileceğiniz şey, "tuşlama" işleviniz olacak bazı işlevleri bir tuşa bağlamak ve bu eylemin içinde, tuşunu basılı tuttuğunuz sürece "keyup" işleviniz olan bir işlevi yürüten bir boşta kalma zamanlayıcısı başlatın. tuşlar verildiğinde, "keydown" fonksiyonu tekrar tekrar tetiklenir ve bu da rölanti zamanlayıcılarının çalışmasını engeller. Tabii ki, komutun muhtemelen "keydown" fonksiyonunuzda bir çeşit noop fonksiyonunun anahtarını yeniden bağlayıp "keyup" fonksiyonundaki "keydown" fonksiyonunu yeniden takarak tekrar tekrar tetikleneceği gerçeğini telafi etmeniz gerekir.
Bu nedenle, kullanım durumunuz için "keydown" işleviniz, dosyanın içeriği ile birlikte bir önizleme arabelleği açar ve bu önizleme arabelleğinde, aynı tuş kombinasyonunu noop benzeri komutlara bağlar. "Keydown" işlevi, önizleme arabelleğinizi silecek ve bulunduğunuz yere geri dönmenizi sağlayacak boşta bir zamanlayıcı da başlatacaktır.
Uzun hikaye kısa burada kod:
Bu işlevi bir tuş kombinasyonuna bağlayın (kullandım C-M-v), bir dosya adının üstüne bastırdığınızda, dosyanın içeriğini görüntüleyen yeni bir tampon açacak, bıraktığınızda orijinaline geri döneceksiniz tampon.
(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!"))))
Ayrıca burada eylem bir gif, tek yaptığım:
- imlecimi dosyanın üzerine getir
- tuş takımımı basılı tut
- önizleme görüntülenir
- bıraktığımda, önizleme öldürüldü ve bulunduğun yere geri döndün.
Unutulmaması gereken önemli bir şey, kullandığım kodda boşta kalma zamanlayıcısının saniyeleridir, .7
ancak bu biraz sihirli bir sayıdır, gerçekten küçük tutmak istersiniz, ancak önizlemenin iki kez yanıp söndüğünü görürseniz, her seferinde 1/10. makineniz için doğru yeri bulana kadar.
* Ayrıca fonksiyonda önizleme arabelleğinin bazı yazı tiplerini yapmaya çalıştığımı ancak işe yarayamayacağımı, daha kullanışlı hale getirmenin bir sonraki adımı olacağını unutmayın. **