Hier ist meine supergeile Methode, um die Ereignisbindung beim Herunter- und Hochfahren von Tasten zu simulieren, indem ich Timer nutze.
Insgesamt würde ich vorschlagen, sich Sigmas Antwort anzuschließen, aber Sie haben nach einer Möglichkeit gefragt, die Vorschau zu schließen, indem Sie loslassen, und ich bin verpflichtet, es zu versuchen.
Grundsätzlich können Sie eine Funktion, die Ihre "keydown" -Funktion ist, an eine Tastenkombination binden und in dieser Aktion einen Leerlauf-Timer starten, der eine Funktion ausführt, die Ihre "keyup" -Funktion ist, solange Sie die Taste gedrückt halten Bei bestimmten Tasten wird die Funktion "keydown" immer wieder ausgelöst, und dies verhindert, dass die Leerlaufzeitgeber ausgeführt werden. Natürlich müssen Sie die Tatsache ausgleichen, dass der Befehl immer wieder ausgelöst wird, indem Sie wahrscheinlich die Taste in Ihrer "keydown" -Funktion mit einer Noop-Funktion neu binden und dann die "keydown" -Funktion in der "keyup" -Funktion neu binden.
Für Ihren Anwendungsfall öffnet Ihre "keydown" -Funktion einen Vorschau-Buffer mit dem Inhalt der Datei an der Stelle und bindet in diesem Vorschau-Buffer dieselbe Tastenkombination an einen noop-ähnlichen Befehl. Mit der "Tastendruck" -Funktion wird auch ein Leerlauf-Timer gestartet, der Ihren Vorschau-Puffer löscht und Sie wieder dorthin zurückversetzt, wo Sie sich befanden.
Kurz gesagt, hier ist der Code:
Binden Sie diese Funktion an eine Tastenkombination (die ich verwendet habe C-M-v). Wenn Sie sie oben auf einen Dateinamen drücken, wird ein neuer Puffer geöffnet, der den Inhalt der Datei an dem Punkt anzeigt, an dem Sie loslassen, und Sie werden zum Original zurückgeschaltet Puffer.
(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!"))))
Auch hier ist ein GIF davon in Aktion, alles was ich tue ist:
- platziere meinen Mauszeiger über der Datei
- drücke und halte meine Tastenkombination
- Die Vorschau wird angezeigt
- Wenn ich loslasse, wird die Vorschau beendet und Sie sind wieder da, wo Sie waren.
Eine wichtige Sache, die zu beachten ist, sind die Sekunden des Leerlauf-Timers, die ich in meinem Code verwendet habe, .7
aber es ist eine Art magische Zahl. Sie möchten sie wirklich klein halten bis Sie den richtigen Platz für Ihre Maschine finden.
* Beachten Sie auch, dass ich in der Funktion versuche, den Vorschau-Puffer ein wenig zu fontifizieren, aber nicht zum Laufen bringen kann. Dies ist der nächste Schritt, um ihn nützlicher zu machen. **