2010-02-09 26 views
13

Thỉnh thoảng tôi bị ngón tay ngứa và giết một số bộ đệm mà tôi muốn chôn. Vấn đề là, tôi sử dụng tramp để chỉnh sửa các tập tin từ nhiều máy, và những tên tập tin có được lâu dài và khó chịu và chỉ nói chung tôi không phải là tốt ở việc tìm kiếm nơi các tập tin của tôi là anyways. Vì vậy, tôi muốn có emacs theo dõi các tập tin tôi chỉ đóng cửa để tôi có thể mở lại chúng một cách dễ dàng (thông qua, lý tưởng, một dấu nhắc ido).Làm thế nào để có được một danh sách các tập tin đóng cửa cuối cùng trong emacs?

Dưới đây là những gì tôi có cho đến nay, đó không hoạt động:

(defvar closed-files '()) 

(defun track-closed-file() 
    (message buffer-file-name) 
    (and buffer-file-name 
     (cons buffer-file-name closed-files))) 

(defun last-closed-files() 
    (interactive) 
    (find-file (ido-completing-read "Last closed: " closed-files))) 

(add-hook 'kill-buffer-hook 'track-closed-file) 

Tôi thực sự không giỏi elisp và có lẽ lộn xộn lên đâu đó trong việc xác định các biến và thêm tế bào để nó ...

[tôi biết về recentf, nhưng điều đó theo dõi các tập tin mở ra, thay vì file khép kín.]

Trả lời

16

tôi vừa thử nghiệm này và nó hoạt động với việc sử dụng một danh sách và add-to-list này cũng loại bỏ các mục trùng lặp. Điều này có đáp ứng nhu cầu của bạn không?

(defvar closed-files (list)) 

(defun track-closed-file() 
    (message buffer-file-name) 
    (and buffer-file-name 
     (add-to-list 'closed-files buffer-file-name))) 

(defun last-closed-files() 
    (interactive) 
    (find-file (ido-completing-read "Last closed: " closed-files))) 

(add-hook 'kill-buffer-hook 'track-closed-file) 

Cập nhật

tôi rất thích tính năng này và đã đặt nó trong cấu hình emacs của tôi. Bạn cũng có thể hưởng lợi từ những thay đổi tôi đã thực hiện.

Phần bổ sung này sẽ đẩy các tệp được đóng gần đây nhất vào đầu danh sách ngay cả khi chúng đã bị đóng trước đó (và đã có trong danh sách closed-files).

(defun track-closed-file() 
    (and buffer-file-name 
     (message buffer-file-name) 
     (or (delete buffer-file-name closed-files) t) 
     (add-to-list 'closed-files buffer-file-name))) 

vấn đề ban đầu của bạn là cons sẽ trở lại cho bạn những danh sách mới, không thao tác các danh sách đầu vào:

(setq mylist '(2 3)) 
=> (2 3) 
(cons 1 mylist) 
=> (1 2 3) 
mylist 
=> (2 3) 

trong trường hợp này bạn sẽ cần phải làm:

(setq mylist (cons 1 mylist)) 
    => (1 2 3) 
mylist 
    => (1 2 3) 
+0

Nó hoạt động. Một độ phân giải năm mới để học lisp cho những điều rất cơ bản là chắc chắn do! – polyglot

+0

Điều này thực sự tiện dụng. Tôi cũng đã thêm nó vào .emacs của mình. Cảm ơn. – seth

+0

Tuyệt vời! Cảm ơn! – ThePower

0

Có bạn nghĩ về rebinding "Cx k" để chôn vùi-đệm thay vì giết-đệm? (Sau đó bạn có thể làm sạch danh sách bộ đệm của bạn theo định kỳ với một cái gì đó như 'midnight.el' nếu cần thiết.)

+0

oh, chúa. Vì nó là, tôi thường có khoảng 50 bộ đệm mở .... Nhưng luôn luôn có một cách khác. –

+0

Vâng tôi đã rebinded bury-buffer để shift-F4 và kill-buffer thành ctrl-F4, và đôi khi tôi bị nhầm lẫn :) Nhưng tôi khá là một freak sạch đối với các bộ đệm mở của tôi mà tôi rìa với kinh dị không phải để giết tất cả tệp nhật ký khổng lồ mà tôi tạm thời mở để kiểm tra. – polyglot

+0

Cá nhân tôi chỉ để cho bộ đệm đóng, và tôi sử dụng chính xác tích hợp ido/recentf mà OtherMichael đề cập để mở lại chúng nếu cần thiết. Nếu bạn đang mở và sau đó đóng các tệp nhanh chóng, như bạn đề xuất là trường hợp với những tệp nhật ký đó, thì không có nhiều khác biệt giữa các tệp đã mở gần đây và các tệp đã đóng gần đây. – sanityinc

5

Bạn đã thử sử dụng recentf? Nó sẽ được cung cấp với Emacs.

tôi ban đầu thấy nó qua XSteve's Emacs power-user tips nơi ông đề nghị ràng buộc nó đến F12, và cung cấp một giao diện tương tác:

;;recentf 
(require 'recentf) 
(recentf-mode 1) 
(setq recentf-max-saved-items 500) 
(setq recentf-max-menu-items 60) 
(global-set-key [(meta f12)] 'recentf-open-files) 

(defun xsteve-ido-choose-from-recentf() 
    "Use ido to select a recently opened file from the `recentf-list'" 
    (interactive) 
    (let ((home (expand-file-name (getenv "HOME")))) 
    (find-file 
    (ido-completing-read "Recentf open: " 
          (mapcar (lambda (path) 
            (replace-regexp-in-string home "~" path)) 
            recentf-list) 
          nil t)))) 

[cập nhật]: whups, chỉ thấy ghi chú của bạn về nhận thức recentf. Đúng, nó dành cho tất cả các tệp đã mở, do đó, nó bao gồm cả những tệp hiện đang có trong bộ đệm mở. Vì tôi đã từng truy cập nó khi tôi đang cố gắng theo dõi một tệp đã đóng gần đây, tôi chưa bao giờ nghĩ về điều đó. Tuy nhiên, có thể lọc các tệp đang mở từ đầu ra đó có thể dễ dàng hơn là phát minh lại toàn bộ bánh xe?

0

tính năng xinh đẹp này cũng có sẵn như là một phần của gói "bất cứ điều gì". Rất mạnh đề xuất cho phép điều này.

Nhưng "mọi thứ" có phiên bản mới hơn có tên "helm" có vẻ như không có tính năng này .

Các vấn đề liên quan