ต่อไปนี้เป็นวิธีแฮ็กสุดของฉันในการจำลองเหตุการณ์สำคัญขึ้น / ลงโดยใช้ประโยชน์จากตัวจับเวลา
โดยรวมแล้วฉันอยากจะแนะนำโดยใช้คำตอบของซิกม่า แต่คุณขอวิธีปิดภาพตัวอย่างโดยปล่อยให้ฉันต้องลองดู
โดยทั่วไปสิ่งที่คุณสามารถทำได้คือผูกบางฟังก์ชั่นที่จะเป็น "keydown" ของคุณเข้ากับการทำ keybinding และภายในการกระทำนั้นให้เริ่มจับเวลาว่างที่ทำหน้าที่ของฟังก์ชั่น "keyup" ของคุณตราบใดที่คุณกด คีย์ที่ได้รับฟังก์ชั่น "keydown" จะเริ่มซ้ำแล้วซ้ำอีกและสิ่งนี้จะยับยั้งตัวจับเวลาที่ไม่ทำงาน แน่นอนว่าคุณต้องชดเชยความจริงที่ว่าคำสั่งจะเริ่มซ้ำไปซ้ำมาโดยการกดปุ่มซ้ำเพื่อฟังก์ชั่น noop ในฟังก์ชั่น "keydown" ของคุณจากนั้นเรียกฟังก์ชั่น "keydown" ในฟังก์ชัน "keyup"
ดังนั้นสำหรับกรณีการใช้งานฟังก์ชัน "keydown" ของคุณจะเปิดบัฟเฟอร์ตัวอย่างพร้อมเนื้อหาของไฟล์ที่จุดและในบัฟเฟอร์ตัวอย่างนั้นผูกคำสั่งผสมคีย์เดียวกันกับคำสั่ง noop like บางอย่าง ฟังก์ชัน "keydown" ของคุณจะเริ่มตัวจับเวลาว่างที่จะลบบัฟเฟอร์แสดงตัวอย่างของคุณและเรียกคืนตำแหน่งที่คุณอยู่
เรื่องสั้นที่นี่คือรหัส:
ผูกฟังก์ชั่นนี้กับคำสั่งผสมคีย์ (ฉันใช้C-M-v) เมื่อคุณกดลงที่ด้านบนของชื่อไฟล์มันจะเปิดบัฟเฟอร์ใหม่ที่แสดงเนื้อหาของไฟล์ที่จุดเมื่อคุณปล่อยคุณจะเปลี่ยนกลับไปเป็นต้นฉบับ กันชน.
(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!"))))
นอกจากนี้ที่นี่เป็น gif ของมันในการดำเนินการทั้งหมดที่ฉันทำคือ:
- วางเคอร์เซอร์ของฉันไว้บนไฟล์
- กดปุ่มลัดของฉันค้างไว้
- ตัวอย่างจะปรากฏขึ้น
- เมื่อฉันปล่อยวางภาพตัวอย่างจะถูกฆ่าและคุณจะกลับไปที่ที่คุณอยู่
สิ่งสำคัญที่ควรทราบคือวินาทีตัวจับเวลาว่างในรหัสของฉันที่ฉันใช้.7
แต่มันเป็นหมายเลขเวทย์มนตร์คุณต้องการให้มันเล็กจริง ๆ แต่ถ้าคุณเห็นตัวอย่างที่กระพริบสองครั้งลองเพิ่ม 1 / 10th ต่อวินาทีในแต่ละครั้ง จนกว่าคุณจะพบจุดที่เหมาะสมสำหรับเครื่องของคุณ
* โปรดทราบว่าในฟังก์ชั่นฉันพยายามที่จะทำให้การแสดงตัวอย่างของบัฟเฟอร์ตัวอย่างบางอย่าง แต่ฉันไม่สามารถใช้งานได้นั่นจะเป็นขั้นตอนต่อไปในการทำให้มีประโยชน์มากขึ้น **