ไฟล์ที่เปิดล่าสุดในโหมด ido


12

ผมใช้ido-modeแต่สิ่งหนึ่งที่ฉันเกลียดเกี่ยวกับเรื่องนี้คือว่าหลังจากที่C-x C-fฉันไม่สามารถใช้คีย์เพื่อวงจรผ่านไฟล์ที่เพิ่งเปิดในขณะที่มันเคยเป็นเช่นกับup/down iswitchbฉันidoจะตั้งให้ทำงานแบบนี้ได้อย่างไร

คำตอบ:


16

ดูที่ตัวเลือกการปรับแต่งสำหรับido-mode( M-x customize-group RET ido RET) ฉันไม่เห็นตัวเลือกใด ๆ สำหรับการเปิดใช้งานพฤติกรรมการปั่นจักรยานที่คุณอธิบาย

อย่างไรก็ตามคุณสามารถเพิ่มสิ่งต่อไปนี้ในไฟล์ init ของคุณ:

(require 'recentf)

(defun ido-recentf-open ()
  "Use `ido-completing-read' to find a recent file."
  (interactive)
  (if (find-file (ido-completing-read "Find recent file: " recentf-list))
      (message "Opening file...")
    (message "Aborting")))

(global-set-key (kbd "C-x C-r") 'ido-recentf-open)

ด้วยสิ่งนี้คุณสามารถกดC-x C-rเพื่อให้เสร็จสมบูรณ์ Ido สำหรับการเลือกไฟล์ที่เพิ่งเปิด

โดยค่าเริ่มต้นไฟล์ล่าสุด 20 ไฟล์จะถูกเก็บไว้ในประวัติ ฉันขอแนะนำให้คุณเหวี่ยงสิ่งนั้นเช่น 150 โดยการตั้งค่าrecentf-max-saved-items:

(setq recentf-max-saved-items 150)

โบนัส: การเข้าถึงไฟล์ล่าสุดเวอร์ชัน on-steroids

ผมไม่เห็นว่ามันกล่าวถึงในหลายสถานที่ แต่สั่นสะท้านบัฟเฟอร์เสมือนทำให้มันง่ายสุดในการเข้าถึงไฟล์ล่าสุด เปิดใช้งานเช่น:

(setq ido-use-virtual-buffers t)

พฤติกรรมที่คุณได้รับคือ:

หากไม่ใช่ - nilอ้างถึงบัฟเฟอร์ในอดีต ("เสมือน") รวมถึงบัฟเฟอร์ที่มีอยู่

เป็นหลักก็ทำงานดังนี้: midnight.elสมมติว่าคุณกำลังเยี่ยมชมไฟล์และกันชนได้รับการทำความสะอาดขึ้นโดย หลังจากนั้นคุณต้องการเปลี่ยนไปใช้บัฟเฟอร์นั้น แต่พบว่าไม่มีการเปิดอีกต่อไป เมื่อเปิดใช้งานบัฟเฟอร์เสมือนชื่อบัฟเฟอร์จะยังคงอยู่ในรายการบัฟเฟอร์ (โดยใช้ido-virtualใบหน้าและท้ายเสมอ) และหากคุณเลือกมันจะเปิดไฟล์สำรองอีกครั้ง วิธีนี้ช่วยให้คุณคิดน้อยลงว่าไฟล์ที่เพิ่งเปิดยังคงเปิดอยู่หรือไม่ เวลาส่วนใหญ่ที่คุณสามารถออกจาก Emacs เริ่มต้นใหม่แล้วสลับไปยังบัฟเฟอร์ไฟล์ที่เปิดไว้ก่อนหน้านี้ราวกับว่ามันยังคงอยู่


จนถึงตอนนี้ฉัน upvoted ฉันจะยอมรับในภายหลังเมื่อฉันจะทดสอบและเข้าใจวิธีการทำงาน (ความเข้าใจในเสียงกระเพื่อมของฉันแย่มาก)
WeSenseASoulInSearchOfAnswers

@WeSenseASoulInSearchOfAnswers แน่ใจว่าใช้เวลาของคุณ แจ้งให้เราทราบหากคุณมีคำถามเฉพาะเกี่ยวกับรหัสที่ฉันโพสต์
itsjeyd

ฉันยอมรับ แต่พูดตรงๆว่าฉันไม่ชอบเพราะC-x C-rฉันไม่สามารถเปิดไฟล์ใหม่ได้ ฉันยังประหลาดใจที่ไม่สามารถกำหนดค่าได้ด้วยวิธีง่าย ๆ ประวัติความเป็นมาC-x C-fเป็นเช่นคุณลักษณะที่เห็นได้ชัดว่าผมไม่เข้าใจว่าทำไมไม่ได้ดำเนินการในidoเลย ตัวอย่างเช่นM-x up/downวนรอบคำสั่งล่าสุด, M-% up/downวนรอบผ่านการแทนที่คิวรีล่าสุด, แม้อยู่นอก emacs - เชลล์ทั้งหมดในฐานะ bash หรือ zsh ใช้ขึ้น / ลงเพื่อเรียกคืนคำสั่งก่อนหน้านี้ สำหรับฉันC-x C-f up/downควรวนไฟล์ที่เพิ่งเปิดใหม่ หยุดเต็ม
WeSenseASoulInSearchOfAnswers

@WeSenseASoulInSearchOfAnswers ฉันเห็นด้วยกับคุณและฉันก็ไม่รู้ว่าทำไมถึงไม่สามารถใช้งานได้หรือปรับแต่งได้ตามต้องการ สำหรับฉันเป็นการส่วนตัวไม่ใช่เรื่องใหญ่เพราะฉันใช้คุณสมบัติบัฟเฟอร์เสมือนที่ฉันอธิบายในคำตอบของฉันดังนั้นการสลับไปยังไฟล์ล่าสุดนั้นเหมือนกับการเปลี่ยนไปใช้บัฟเฟอร์อื่น ง่ายจริงๆ แต่ฉันเข้าใจว่ามันน่าหงุดหงิดหากคุณสมบัติที่คุณคุ้นเคยเคยใช้ไม่ได้
itsjeyd

5
+1 สำหรับido-use-virtual-buffers- เป็นสุดยอดฟีเจอร์ที่ควรเปิดโดย IMO ที่เป็นค่าเริ่มต้น
Jon O.

2

แม้ว่าการเชื่อมโยงจะมีวิวัฒนาการตลอดเวลา ณ วันนี้เมื่อคุณเรียกใช้ido-find-fileหรือido-find-file-read-onlyคุณสามารถใช้การเชื่อมโยงต่อไปนี้ในการกำหนดค่าเริ่มต้น:

  • M-o จะเรียก ido-prev-work-file
  • C-M-o จะเรียก ido-next-work-file

นอกเหนือจากสิ่งเหล่านี้ไม่ได้เป็นที่พอใจตามหลักสรีรศาสตร์เช่นเดียวกับM-pและM-nฉันเคยชินกับการลองใช้idoพวกเขายังช้าและการพูดคุยกันของมินิฟเฟอร์เกอร์มิวนิกก็ทำให้เสียสมาธิและสับสน idoทำอะไรมากกว่าเพียงแค่แสดงชื่อไฟล์ที่เพิ่งเปิด มันรายงานว่าเป็น "ค้นหา" ชื่อไฟล์ "... " อาจไม่เต็มใจที่จะเสนอชื่อไฟล์ที่ไม่มีอยู่อีกต่อไป

"การค้นหา" ido-make-merged-file-listข้อความมาจากฟังก์ชั่น อ่านแหล่งที่มาฉันไม่เห็นวิธีใด ๆ ที่จะปิดการใช้งานฟังก์ชั่นที่เวทมนตร์กำลังทำอยู่

คุณอาจพิจารณาการผูกido-prev-work-fileและido-next-work-fileจับคู่กับสิ่งที่เป็นธรรมชาติมากกว่าC-M-pและC-M-nหรือสลับการผูกM-p( ido-prev-work-directory) และM-n( ido-next-work-directory) ปัจจุบันสำหรับสิ่งเหล่านี้

นี่คือรหัส Emacs Lisp เพื่อเรียกคืนM-pและวนM-nไปตามไฟล์ล่าสุดโดยย้ายการเชื่อมโยงไดเร็กทอรีที่เป็นค่าดีฟอลต์ไปที่C-M-pและC-M-nตามลำดับ:

(add-hook 'ido-setup-hook
          (lambda ()
            (let ((kmap ido-file-dir-completion-map))
              (let ((key '(meta ?n)))
                (define-key kmap (vector (cons 'control key))
                  (lookup-key kmap (vector key)))
                (define-key kmap (vector key) 'ido-next-work-file))
              (let ((key '(meta ?p)))
                (define-key kmap (vector (cons 'control key))
                  (lookup-key kmap (vector key)))
                (define-key kmap (vector key) 'ido-prev-work-file)))))

1
ยินดีต้อนรับสู่ Emacs SE! โปรดพยายามให้คำตอบของคุณมุ่งเน้นไปที่คำถามของผู้โพสต์ดั้งเดิม แน่นอนความคิดเห็นของคุณเกี่ยวกับ "minibuffer chatter" นั้นน่าสนใจและเกี่ยวข้อง แต่มันเบี่ยงเบนความสนใจจากการหาคำตอบที่แท้จริงของคำถาม ที่สำคัญกว่า: โปรดลองวลีคำตอบของคุณในรูปแบบของ ... ดีคำตอบ สิ่งที่คุณเขียนอ่านมากขึ้นเช่นความคิดเห็นซึ่งไม่เหมาะสำหรับไซต์ถามตอบเช่นนี้
paprika

ย่อหน้าแรกและรายการต่อไปนี้ตอบคำถามต้นฉบับซึ่งกำลังค้นหาคีย์เพื่อวนผ่านไฟล์ที่เพิ่งเปิด การผูกเหล่านั้นมีอยู่ตามค่าเริ่มต้น แต่ไม่มีคำตอบอื่นใดที่นี่ที่กล่าวถึงการรวมเหล่านี้ ฉันกำลังทำงานกับรหัสการ rebinding และจะรวมไว้ในคำตอบของฉันเมื่อฉันพอใจกับมัน
seh

2

สิ่งที่ฉันเคยใช้ในกรณีนี้คือการกลับไปสู่พฤติกรรม minibuffer ปกติโดยพิมพ์ Cf ใน idomode จากนั้นคุณจะมีปุ่มเรียกดูประวัติตามปกติ หากคุณรู้ล่วงหน้าอาจเป็นได้อย่างรวดเร็ว: Cxff :-)


1

คำตอบที่ได้รับจาก @itsjeyd ค่อนข้างสมบูรณ์ ผมขอแนะนำฟังก์ชั่น:

(defun ido-choose-from-recentf ()
  "Use ido to select a recently visited file from the `recentf-list'"
  (interactive)
  (find-file (ido-completing-read "Open file: " recentf-list nil t)))

;; bind it to "C-c f"
(global-set-key (kbd "C-c f") 'ido-choose-from-recentf)

ความอนุเคราะห์จากWikEmacs


1

ฉันพบว่าhelm-for-filesทำงานได้ดีกว่าคำตอบใด ๆ ข้างต้นเพื่อวัตถุประสงค์ในการเติมชื่อไฟล์ให้อัตโนมัติและมีอินเทอร์เฟซการค้นหาที่ดี นอกจากนี้คุณสามารถกำหนดค่าให้รวมรายการค้นหาที่คุณต้องการ


1
@Drew helm มาพร้อมกับโหมด ido เอง ส่วนใหญ่เวลาที่ผู้คนค้นหาโพสต์นี้พวกเขาอาจสนใจรู้ทางเลือกอื่น ๆ ในการแก้ปัญหา
user10375
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.