Voici ma façon super hacky de simuler la liaison d'événements bas / haut en profitant des minuteurs.
Dans l'ensemble, je suggère de suivre la réponse de Sigma, mais vous avez demandé un moyen de fermer l'aperçu en le lâchant, donc je suis obligé d'essayer.
Fondamentalement, ce que vous pouvez faire est de lier une fonction qui sera votre fonction "keydown" à une liaison de touches et à l'intérieur de cette action, démarrez un temporisateur inactif qui exécute une fonction qui est votre fonction "keyup", tant que vous maintenez la touche étant donné les touches, la fonction "keydown" se déclenchera encore et encore et cela empêchera les minuteries inactives de fonctionner. Bien sûr, vous devez compenser le fait que la commande se déclenchera encore et encore, probablement en reliant la clé à une sorte de fonction noop dans votre fonction "keydown", puis en reliant la fonction "keydown" dans la fonction "keyup".
Donc, pour votre cas d'utilisation, votre fonction "keydown" ouvrira un tampon de prévisualisation avec le contenu du fichier au point et dans ce tampon de prévisualisation liera le même combo de touches à une commande de type noop. Votre fonction "keydown" démarrera également une minuterie inactive qui supprimera votre tampon d'aperçu et vous ramènera où vous étiez.
En bref, voici le code:
Liez cette fonction à un combo de touches (j'ai utilisé C-M-v), lorsque vous appuyez dessus au-dessus d'un nom de fichier, il ouvrira un nouveau tampon affichant le contenu du fichier au point, lorsque vous relâcherez, vous reviendrez à l'original 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!"))))
Voici également un gif de celui-ci en action, tout ce que je fais est:
- placer mon curseur sur le fichier
- appuyez et maintenez ma liaison
- l'aperçu s'affiche
- quand je lâche prise, l'aperçu est tué et vous êtes de retour où vous étiez.
Une chose importante à noter est les secondes de la minuterie inactive, dans mon code que j'ai utilisé .7
mais c'est une sorte de nombre magique, vous voulez le garder vraiment petit, mais si vous voyez l'aperçu clignoter deux fois, essayez de l'augmenter 1 / 10e de seconde à chaque fois jusqu'à ce que vous trouviez le bon endroit pour votre machine.
* Notez également que dans la fonction, j'essaie de faire une police de caractères du tampon d'aperçu, mais je n'ai pas pu le faire fonctionner, ce sera la prochaine étape pour le rendre plus utile. **