Các tệp được mở gần đây ở chế độ ido


12

Tôi sử dụng ido-mode, nhưng một điều tôi ghét về điều đó là sau khi C-x C-ftôi không thể sử dụng up/downcác khóa để chuyển qua các tệp được mở gần đây, như trước đây là ví dụ với iswitchb. Làm thế nào tôi có thể thiết lập idođể làm việc theo cách này?

Câu trả lời:


16

Nhìn vào các tùy chọn tùy chỉnh cho ido-mode( M-x customize-group RET ido RET), tôi không thấy bất kỳ tùy chọn nào để bật hành vi đạp xe mà bạn mô tả.

Tuy nhiên, bạn có thể thêm phần sau vào tệp init của mình:

(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)

Với vị trí này, bạn có thể nhấn C-x C-rđể hoàn thành Ido để chọn các tệp đã mở gần đây.

Theo mặc định, 20 tệp gần đây nhất sẽ được lưu giữ trong lịch sử. Tôi đề nghị bạn nên quay số đó lên tới 150 bằng cách cài đặt recentf-max-saved-items:

(setq recentf-max-saved-items 150)

Phần thưởng: Truy cập các tệp gần đây, phiên bản on-steroid

Tôi không thấy nó được đề cập ở nhiều nơi, nhưng Bộ đệm ảo Ido giúp truy cập các tệp gần đây siêu dễ dàng . Cho phép họ như vậy:

(setq ido-use-virtual-buffers t)

Hành vi bạn nhận được là:

Nếu không nil, hãy tham khảo các bộ đệm trong quá khứ ("ảo") cũng như các bộ đệm hiện có.

Về cơ bản, nó hoạt động như sau: Giả sử bạn đang truy cập một tệp và bộ đệm được dọn sạch bởi midnight.el. Sau đó, bạn muốn chuyển sang bộ đệm đó, nhưng thấy nó không còn mở nữa. Khi bộ đệm ảo được bật, tên bộ đệm vẫn nằm trong danh sách bộ đệm (sử dụng ido-virtualkhuôn mặt và luôn ở cuối) và nếu bạn chọn nó, nó sẽ mở lại tệp. Điều này cho phép bạn suy nghĩ ít hơn về việc các tệp được mở gần đây có còn mở hay không. Hầu hết thời gian bạn có thể thoát Emacs, khởi động lại và sau đó chuyển sang bộ đệm tệp đã được mở trước đó như thể nó vẫn còn.


Cho đến nay tôi đã nâng cấp, tôi sẽ chấp nhận sau này khi tôi sẽ kiểm tra nó và hiểu cách thức hoạt động của nó. (hiểu biết của tôi về lisp rất kém).
WeSenseASoulInSearchOfAnswers

@WeSenseASoulInSearchOfAnswers Chắc chắn, hãy dành thời gian của bạn. Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi cụ thể nào về mã tôi đã đăng.
itjeyd

Tôi chấp nhận nhưng thẳng thắn nói rằng tôi không thích nó vì với C-x C-rnó không thể mở tập tin mới. Tôi cũng ngạc nhiên rằng không thể tùy chỉnh nó theo cách đơn giản. Lịch sử C-x C-flà một tính năng rõ ràng đến mức tôi không thể hiểu tại sao chưa được triển khai ido. Ví dụ: M-x up/downchu kỳ thông qua các lệnh gần đây, M-% up/downchu kỳ thông qua thay thế truy vấn gần đây, thậm chí bên ngoài emacs - tất cả các shell như bash hoặc zsh đều sử dụng lên / xuống để gọi lại các lệnh trước đó. Đối với tôi C-x C-f up/downnên chuyển qua các tập tin được mở gần đây. Dấu chấm.
WeSenseASoulInSearchOfAnswers

@WeSenseASoulInSearchOfAnswers Tôi đồng ý với bạn và tôi không biết tại sao điều này không có sẵn hoặc có thể tùy chỉnh ngoài hộp. Đối với cá nhân tôi, đó không phải là vấn đề lớn vì tôi sử dụng tính năng bộ đệm ảo mà tôi mô tả trong câu trả lời của mình, vì vậy việc chuyển sang một tệp gần đây cũng giống như chuyển sang bộ đệm khác; thật sự dễ dàng. Nhưng tôi hiểu rằng nó có thể gây phiền toái nếu một tính năng bạn đã quen sử dụng không có sẵn.
itjeyd

5
+1 cho ido-use-virtual-buffers- một tính năng tuyệt vời cần được bật theo mặc định IMO.
Jon O.

2

Mặc dù các ràng buộc đã phát triển theo thời gian, cho đến ngày hôm nay, khi bạn gọi ido-find-filehoặc ido-find-file-read-only, bạn có thể sử dụng các ràng buộc sau có sẵn trong cấu hình mặc định:

  • M-o viện dẫn ido-prev-work-file
  • C-M-o viện dẫn ido-next-work-file

Ngoài những thứ này không dễ chịu về mặt công thái như các ràng buộc M-pM-ntôi đã từng sử dụng trước khi thử ido , chúng cũng chậm, và cuộc trò chuyện về xe buýt nhỏ gây phiền nhiễu và khó hiểu. ido làm một cái gì đó nhiều hơn là chỉ hiển thị một tên tệp được mở gần đây; nó báo cáo rằng đó là "Tìm kiếm ' tên tệp ' ...", có lẽ do miễn cưỡng cung cấp tên cho một tệp không còn tồn tại.

Thông báo "Tìm kiếm" xuất phát từ chức năng ido-make-merged-file-list. Đọc nguồn , tôi không thấy bất kỳ cách nào để vô hiệu hóa bất kỳ phép thuật nào mà chức năng này đang làm.

Bạn có thể xem xét rebinding sự ido-prev-work-fileido-next-work-filecặp với một cái gì đó tự nhiên hơn như C-M-pC-M-n, hoặc trao đổi dòng điện M-p( ido-prev-work-directory) và M-n( ido-next-work-directory) gán cho các.

Dưới đây là mã Lisp của Emacs để khôi phục M-pM-nchuyển qua các tệp gần đây, di chuyển các liên kết tập trung vào thư mục mặc định sang C-M-pC-M-ntương ứng:

(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
Chào mừng đến với Emacs SE! Vui lòng cố gắng giữ câu trả lời của bạn tập trung vào câu hỏi của người đăng ban đầu. Chắc chắn nhận xét của bạn về "cuộc trò chuyện nhỏ" rất thú vị và có liên quan, nhưng nó làm mất tập trung vào việc tìm câu trả lời thực sự cho câu hỏi. Quan trọng hơn: hãy cố gắng diễn đạt câu trả lời của bạn dưới dạng ... tốt, một câu trả lời. Những gì bạn đã viết giống như một bình luận, không phù hợp cho một trang web Hỏi & Đáp như thế này.
paprika

Vâng, đoạn đầu tiên và danh sách sau đây của nó trả lời câu hỏi ban đầu, đó là tìm kiếm các khóa để chuyển qua các tệp được mở gần đây. Các ràng buộc đó tồn tại theo mặc định, nhưng không có câu trả lời nào khác ở đây đề cập đến các ràng buộc này. Tôi đang làm việc với mã rebinding và sẽ đưa nó vào câu trả lời của mình một khi tôi hài lòng với nó.
seh

2

những gì tôi đã sử dụng trong trường hợp này là quay trở lại hành vi của bộ thu nhỏ thông thường bằng cách nhập Cf vào idomode. Sau đó, bạn sẽ có các phím duyệt lịch sử bình thường. Nếu bạn biết trước, có thể nhanh chóng: Cxff :-)


1

Câu trả lời được đưa ra bởi @itsjeyd là khá đầy đủ. Hãy để tôi chỉ đề xuất một chức năng:

(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)

Lịch sự của WikEmacs


1

Tôi thấy helm-for-fileshoạt động tốt hơn bất kỳ câu trả lời nào ở trên cho mục đích tự động hoàn thành tên tệp và có giao diện tìm kiếm đẹp. Ngoài ra, bạn có thể định cấu hình nó để bao gồm bất kỳ mục tìm kiếm nào bạn muốn.


1
@Drew helm đi kèm với chế độ ido chính nó. Hầu hết thời gian khi mọi người tìm kiếm bài đăng này, họ có thể quan tâm đến việc biết các lựa chọn thay thế khác để giải quyết vấn đề.
dùng10375
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.