2009-12-19 22 views
10

làm cách nào để tôi tìm ra điều này?emacs: là trước khi lưu-móc một biến địa phương?

Tôi đã thêm delete-trailing-whitespace vào before-save-hook trong c-mode-common-hook, nhưng có vẻ như delete-trailing-whitespace đang được gọi cho mọi tệp, không chỉ bộ đệm sử dụng chế độ c và dẫn xuất.

Tôi có thể tạo vùng đệm before-save-hook cục bộ không?

+1

Ngoài ra còn có 'ws-trim', đó là những gì tôi sử dụng: ftp://ftp.lysator.liu.se/pub/emacs/ws-trim.el –

Trả lời

18

Thêm nó vào write-contents-functions thay vì:

(add-hook 'c-mode-common-hook 
    (lambda() 
    (add-hook 'write-contents-functions 
     (lambda() 
     (save-excursion 
      (delete-trailing-whitespace))) 
     nil t))) 

Như Manual Emacs Lisp tham khảo giải thích:

Điều này hoạt động giống như chức năng ghi tệp, nhưng nó được thiết kế cho các móc liên quan đến nội dung của bộ đệm, không phải cho tệp được truy cập cụ thể hoặc vị trí của nó. Các móc như vậy là thường được thiết lập bởi các chế độ chính, như các liên kết bộ đệm cục bộ cho biến này. Biến này tự động trở thành bộ đệm cục bộ bất cứ khi nào nó được thiết lập; chuyển sang chế độ chính mới luôn đặt lại biến này, nhưng gọi là set-visited-file-name thì không.

Điều này làm việc phù hợp với tôi trong Emacs 24.2.1 (nghĩa là nó xóa tất cả khoảng trống cuối của tệp C nhưng vẫn giữ khoảng trắng ở cuối trong tất cả các loại tệp khác).

+0

Cảm ơn; Tôi sửa chữa lỗi tương ứng trên EmacsWiki và chỉ trở lại đây để ghi có. –

+1

(Hầu hết) tất cả các móc đều là cục bộ và toàn cục. Chỉ cần sử dụng đối số 'local 'của' add-hook' để nói liệu bạn có muốn thêm hàm của mình trên toàn cục hoặc vùng đệm cục bộ hay không. 'local-write-file-hooks' đã lỗi thời vì Emacs-22.1 là' write-file-hooks' (được thay thế bằng 'write-file-functions'), vì vậy bạn có thể muốn cập nhật tài liệu tham khảo của bạn. – Stefan

+0

Cảm ơn, tôi đã cập nhật câu trả lời của mình. –

3

Chưa bao giờ muốn làm điều này trước đây, nhưng điều này sẽ làm việc:

(set (make-local-variable 'before-save-hook) '((lambda() (rg-msg "foobie")))) 

Nói chung C-h v sẽ nhắc nhở cho một tên biến và hiển thị một mô tả nói cho bạn xem var là đệm cục bộ.

trước khi lưu-móc là biến được xác định trong `files.el '. Giá trị của nó là nil

Biến này có khả năng nguy hiểm khi được sử dụng làm biến cục bộ tệp.

Tài liệu: Móc bình thường chạy trước khi bộ đệm được lưu vào tệp của nó.

Bạn có thể tùy chỉnh biến này.

vs

next-lỗi-chức năng là một biến định nghĩa trong `simple.el'. Giá trị của nó là nil

Tự động trở thành vùng bộ đệm khi được đặt theo bất kỳ kiểu nào. Biến số này có khả năng nguy hiểm khi được sử dụng làm biến cục bộ của tệp.

Tài liệu: Chức năng sử dụng để tìm lỗi lỗi tiếp theo trong bộ đệm hiện tại. Các hàm được gọi với 2 thông số:

[...]

+1

Tôi không chắc liệu điều này có đúng không thời gian nó được viết, nhưng tài liệu hiện hành nói "Không sử dụng' make-local-variable' để tạo một biến hook-local hook. Thay vào đó, sử dụng 'add-hook' và chỉ định' t' cho đối số LOCAL. " – phils

0

Sử dụng write-contents-function thay vì:

write-contents-functions is a variable defined in `files.el'. 
Its value is nil 

    Automatically becomes buffer-local when set in any fashion. 

Documentation: 
List of functions to be called before writing out a buffer to a file. 
If one of them returns non-nil, the file is considered already written 
and the rest are not called and neither are the functions in 
`write-file-functions'. 

This variable is meant to be used for hooks that pertain to the 
buffer's contents, not to the particular visited file; thus, 
`set-visited-file-name' does not clear this variable; but changing the 
major mode does clear it. 

For hooks that _do_ pertain to the particular visited file, use 
`write-file-functions'. Both this variable and 
`write-file-functions' relate to how a buffer is saved to file. 
To perform various checks or updates before the buffer is saved, 
use `before-save-hook'. 

Bạn nên tạo một wrapper để gọi delete-trailing-whitespace như bạn muốn đảm bảo rằng bạn quay trở lại nil từ wrapper, để chế biến tiếp (và tiết kiệm cuối cùng) diễn ra.

+2

Tại sao một người sử dụng chức năng ghi nội dung thay vì các tập tin cục bộ-ghi-móc? –

15

Không, biến số before-save-hook không phải là vùng đệm tự nhiên cục bộ. Tài liệu của biến không nói là bộ đệm cục bộ hoặc nói nó sẽ tự động trở thành bộ đệm cục bộ khi được thiết lập.

Nếu bạn muốn thêm một cái móc đệm cục bộ với nó, cách chính xác để làm điều này là chỉ để sử dụng tham số LOCAL bắt buộc của tiêu chuẩn add-hook chức năng:

(add-hook 'before-save-hook 'foo nil t) 

Các tài liệu add-móc nói :

Đối số thứ tư tùy chọn, LOCAL, nếu không phải, cho biết sửa đổi giá trị bộ đệm cục bộ của móc thay vì giá trị toàn cầu của móc. Điều này làm cho bộ đệm móc cục bộ, và nó làm cho t một thành viên của giá trị bộ đệm cục bộ . Nó hoạt động như một lá cờ để chạy móc các chức năng của giá trị toàn cầu cũng như trong giá trị cục bộ.

Câu trả lời được chọn để thêm nó vào local-write-file-hooks là sai, tôi tin. Nếu bạn xem tài liệu cho hàm đó, trên các emacs 24.3, nó nói biến đã lỗi thời kể từ 22.1 và bạn nên sử dụng write-file-functions. Và nếu bạn tra cứu tài liệu của write-file-functions, nó mô tả hành vi phức tạp hơn và nói ở cuối rằng "Để thực hiện các kiểm tra hoặc cập nhật khác nhau trước khi bộ đệm được lưu, hãy sử dụng` trước khi lưu-móc '".

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