trước-save-hook cho chế độ cc


13

Tôi muốn tùy chỉnh cc-modeđể thực hiện một chức năng trước khi lưu. Một giải pháp sẽ là sửa đổi cc-modesơ đồ bàn phím để liên kết C-x C-svới một chức năng thực hiện công việc tôi cần và sau đó lưu nó.

Câu hỏi của tôi là liệu có một cái móc tôi có thể tùy chỉnh cho điều này? Các tài liệu CC Hook không đề cập before-save-hookcụ thể cho cc-mode. Làm thế nào điều này nên được thực hiện thông qua một cái móc?

Ngoài ra, làm thế nào để tôi làm điều này thông qua defadvice? Từ việc đọc hướng dẫn, cách duy nhất tôi có thể thấy là bật lời khuyên trước khi lưu và sau đó tắt sau khi hoàn thành công việc. Điều này nghe có vẻ rườm rà. Cách sử dụng thành ngữ advicelà gì?


3
Chức năng bạn thêm vào before-save-hookcó thể kiểm tra chế độ chính hiện tại (ví dụ (eq major-mode ...)) và không làm gì nếu nó không phù hợp với chế độ bạn đang tùy chỉnh.
Constantine

@Constantine Đồng ý. Tôi muốn kiểm tra xem có thứ gì "tích hợp" hơn cho loại điều này không. IIRC haskell-modecó ít nhất một after/before-savemóc và tôi cho rằng đây là tiêu chuẩn thực hành cho chế độ prog.
Pradhan

@Constantine: bạn có thể chuyển đổi nhận xét của mình thành câu trả lời (tất nhiên là mở rộng một chút) không?
Dân

1
Xem chủ đề này cho một ví dụ sử dụng after-save-hook; bạn có thể sử dụng cùng một loại thủ tục nhưng thay thế before-save-hook.
Dân

Câu trả lời:


12

Một cách khá phổ biến để hạn chế hành động của hook vào một chế độ chính cụ thể là kiểm tra giá trị của major-mode.

Ví dụ, hook này in một thông báo trước khi lưu bộ đệm bằng cách sử dụng c++-mode:

(defun my-c++-mode-before-save-hook ()
  (when (eq major-mode 'c++-mode)
    (message "It's never too early to start saving (C++ code)!")))

(add-hook 'before-save-hook #'my-c++-mode-before-save-hook)

Như một lưu ý phụ: đôi khi có thể hữu ích để kiểm tra xem một chế độ chính có nguồn gốc từ Chế độ CC hay không; chúng ta có thể làm điều này bằng cách kiểm tra nếu c-buffer-is-cc-modekhông nil:

(defun my-cc-mode-before-save-hook ()
  (when c-buffer-is-cc-mode
    (message "Saving a buffer with a major-mode derived from CC Mode.")))

19

Ngoài ra, sử dụng một hook cục bộ:

(add-hook 'c++-mode-hook
          (lambda () (add-hook 'before-save-hook MY-HOOK-FUNC nil 'local)))

Điều này thêm MY-HOOK-FUNCvào bộ đệm cục bộ before-save-hook của từng bộ đệm Chế độ C ++ hoặc bất kỳ bộ đệm nào trong chế độ có nguồn gốc từ Chế độ C ++.

Tôi thấy điều này thanh lịch hơn khi kiểm tra rõ ràng major-modevà nó có lợi thế là bạn có thể vô hiệu hóa before-save-hook cục bộ cho từng bộ đệm M-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local)mà không ảnh hưởng đến bất kỳ bộ đệm nào khác.


-1

Tôi đã từng cần một cái gì đó tương tự để tự động biên dịch các tệp elisp của mình khi được lưu, tôi đã sử dụng một cách tiếp cận như thế này (chuyển đổi cách tiếp cận sang chế độ cc):

(add-hook 'c-common-hook #'(lambda ()
                              (add-hook 'before-save-hook #'(lambda ()
                                                               (funcall #'YOUR-FUNC-HOOK)))))

1
Đầu tiên, ý bạn là c-mode-common-hookgì? Thứ hai, có vẻ như nó sẽ thêm chức năng vào before-save-hooklần đầu tiên bạn nhập Cngôn ngữ có liên quan, nhưng sau đó chức năng đó sẽ được gọi ngay trước mỗi lần lưu trên mỗi bộ đệm. Những gì OP cần làm là chạy chức năng có điều kiện trên bộ đệm ở chế độ cụ thể (xem bình luận của @ Constantine để biết cách thức).
Dân
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.