Dưới đây là cách siêu hacky của tôi để mô phỏng ràng buộc sự kiện xuống / lên bằng cách tận dụng bộ tính giờ.
Nhìn chung, tôi khuyên bạn nên đi theo câu trả lời của Sigma, nhưng bạn đã hỏi cách đóng bản xem trước bằng cách cho đi nên tôi bắt buộc phải thử.
Về cơ bản những gì bạn có thể làm là liên kết một số chức năng sẽ là chức năng "keydown" của bạn với một keybinding và bên trong hành động đó, hãy bắt đầu một bộ đếm thời gian nhàn rỗi thực thi một chức năng là chức năng "keyup" của bạn, miễn là bạn đang giữ phím các phím đã cho, chức năng "keydown" sẽ kích hoạt liên tục và điều này sẽ ngăn cản các bộ định thời gian không hoạt động. Tất nhiên, bạn cần phải bù cho thực tế là lệnh sẽ lặp đi lặp lại, có khả năng bằng cách đảo ngược phím thành một loại chức năng noop nào đó trong chức năng "keydown" của bạn, sau đó đảo ngược chức năng "keydown" trong chức năng "keyup".
Vì vậy, trong trường hợp sử dụng của bạn, chức năng "keydown" của bạn sẽ mở ra một bộ đệm xem trước với nội dung của tệp tại điểm và trong bộ đệm xem trước đó liên kết cùng một tổ hợp phím với một số lệnh noop. Chức năng "keydown" của bạn cũng sẽ bắt đầu một bộ đếm thời gian nhàn rỗi sẽ xóa bộ đệm xem trước của bạn và khôi phục bạn trở lại vị trí của bạn.
Câu chuyện dài ở đây là đoạn mã:
Liên kết chức năng này với tổ hợp phím (tôi đã sử dụng C-M-v), khi bạn nhấn nó xuống phía trên tên tệp, nó sẽ mở một bộ đệm mới hiển thị nội dung của tệp tại điểm, khi bạn buông tay, bạn sẽ được chuyển về ban đầu đệm.
(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!"))))
Ngoài ra đây là một gif của nó trong hành động, tất cả những gì tôi làm là:
- đặt con trỏ lên tập tin
- nhấn và giữ phím bấm của tôi
- bản xem trước được hiển thị
- Khi tôi buông tay, bản xem trước bị giết và bạn trở lại vị trí của mình.
Một điều quan trọng cần lưu ý là số giây của máy đếm giờ nhàn rỗi, trong mã của tôi tôi đã sử dụng .7
nhưng đó là một số ma thuật, bạn muốn giữ nó thật nhỏ, nhưng nếu bạn thấy bản xem trước nhấp nháy hai lần, hãy thử tăng 1/10 mỗi giây cho đến khi bạn tìm đúng vị trí cho máy của bạn
* Cũng lưu ý rằng trong chức năng tôi cố gắng thực hiện một số phông chữ của bộ đệm xem trước nhưng tôi không thể làm cho nó hoạt động, đó sẽ là bước tiếp theo để làm cho nó hữu ích hơn. **