2010-03-01 6 views
9

Tôi muốn có Emacs hỏi tôi liệu tôi có muốn lưu bộ đệm đã sửa đổi không, khi bộ đệm đó không được liên kết với một tệp. Để mở một bộ đệm mới (không truy cập vào một tập tin) Tôi có chức năng sau đây trong tập tin emacs của tôi:Emacs - Không thể nhận được bộ đệm-cung cấp-tiết kiệm làm việc

;; Creates a new empty buffer 
(defun new-empty-buffer() 
    "Opens a new empty buffer." 
    (interactive) 
    (let ((buf (generate-new-buffer "untitled"))) 
    (switch-to-buffer buf) 
    (funcall (and default-major-mode)) 
    (setq buffer-offer-save t))) 

Tôi nghĩ thiết "đệm-phục vụ-tiết kiệm" một cái gì đó không bằng không sẽ làm các trick. Nhưng bất cứ khi nào tôi giết bộ đệm bằng "kill-this-buffer", nó sẽ bị giết ngay lập tức mà không hỏi bất cứ điều gì.

Điều này xảy ra trên GNU Emacs 23.1.1

Bất kỳ ý tưởng nào?

Cảm ơn, W

+0

sẽ liên kết bộ đệm với tệp, trong 'bộ đệm trống mới' giải quyết được sự cố? – Cheeso

Trả lời

2

Edited thêm sử dụng buffers-offer-save. Lưu ý: biến số buffer-offer-save is only used upon exiting Emacs.

Bạn có thể bắt đầu với mã này và tùy chỉnh nó với những gì bạn muốn:

(add-to-list 'kill-buffer-query-functions 'ask-me-first) 
(defun ask-me-first() 
    "prompt when killing a buffer" 
    (if (or buffer-offer-save 
      (eq this-command 'kill-this-buffer) 
      (and (buffer-modified-p) (not (buffer-file-name)))) 
     (y-or-n-p (format "Do you want to kill %s without saving? " (buffer-name))) 
    t)) 

Sau khi phản ánh thêm, đó là một chút nặng tay bởi vì bạn nhận được nhắc nhở cho tất cả bộ đệm mà bị giết, và thường có rất nhiều bộ đệm tạm thời mà Emacs sử dụng. Nếu bạn chỉ muốn được nhắc khi bạn cố gắng tương tác giết một bộ đệm (không liên quan đến một tệp).

Bạn có thể sử dụng lời khuyên này mà chỉ nhắc bạn khi bạn đang tương tác cố gắng để giết một bộ đệm:

(defadvice kill-buffer (around kill-buffer-ask-first activate) 
    "if called interactively, prompt before killing" 
    (if (and (or buffer-offer-save (interactive-p)) 
      (buffer-modified-p) 
      (not (buffer-file-name))) 
     (let ((answ (completing-read 
        (format "Buffer '%s' modified and not associated with a file, what do you want to do? (k)ill (s)ave (a)bort? " (buffer-name)) 
        '("k" "s" "a") 
        nil 
        t))) 
     (when (cond ((string-match answ "k") 
        ;; kill 
        t) 
        ((string-match answ "s") 
        ;; write then kill 
        (call-interactively 'write-file) 
        t) 
        (nil)) 
      ad-do-it) 

     t) 
    ;; not prompting, just do it 
    ad-do-it)) 
+0

sẽ liên kết bộ đệm với một tệp, trong 'bộ đệm trống mới' giải quyết được sự cố? – Cheeso

+0

@Cheeso Vâng, làm điều đó trong 'new-empty-buffer' sẽ đưa yêu cầu vào cuối sai, như khi anh ta tạo ra một bộ đệm mới. Điều đó nói rằng, ông có thể sửa đổi 'new-empty-buffer' để thiết lập một lá cờ mà lời khuyên/chức năng có thể tắt. Tôi đoán tôi thích một giải pháp w/out resorting để sử dụng 'mới-empty-buffer'. –

+0

gotcha, cảm ơn. – Cheeso

1

Sửa đổi 'new-empty-buffer dường như để làm cho nó làm việc như tôi dự định với defadvice Trey của.

 
;; Creates a new empty buffer 
(defun new-empty-buffer() 
"Opens a new empty buffer." 
(interactive) 
(let ((buf (generate-new-buffer "untitled"))) 
    (switch-to-buffer buf) 
    (funcall (and default-major-mode)) 
    (put 'buffer-offer-save 'permanent-local t) 
    (setq buffer-offer-save t))) 

Điều này làm cho địa chỉ vĩnh viễn trong bộ đệm mới của chúng tôi, vì vậy nó sẽ không bị giết với phần còn lại của biến cục bộ khi chuyển chế độ chính.

1

buffer-offer-save yêu cầu thoát Emacs nhưng không đóng bộ đệm theo cách thủ công không có ý nghĩa, vậy tại sao không "mở rộng" trách nhiệm của nó?

(defadvice kill-buffer (around kill-buffer-ask activate) 
    "If `buffer-offer-save' is non-nil and a buffer is modified, 
prompt before closing." 
    (if (and buffer-offer-save (buffer-modified-p)) 
     (when (yes-or-no-p "The document isn't saved. Quit? ") 
     ad-do-it) 
    ad-do-it)) 

Nó sẽ không nhắc nếu untitled bộ đệm mới được tạo. Nó sẽ không nhắc nếu bạn sử dụng kill-buffer từ Elisp. Nó sẽ không nhắc trên bộ đệm hệ thống Emacs như *Messages*. Nhưng nó sẽ nhắc nhở nếu bạn tạo ra một bộ đệm trống và viết một cái gì đó trong đó.

Xem thêm my answer on creating an empty buffer.