sebelum-save-hook untuk mode-cc

13

Saya ingin menyesuaikan cc-modeuntuk menjalankan fungsi sebelum menyimpan. Salah satu solusinya adalah memodifikasi cc-modekeymap untuk mengikat C-x C-ske fungsi yang melakukan pekerjaan yang saya butuhkan dan kemudian menyimpannya.

Pertanyaan saya adalah apakah ada kait yang bisa saya sesuaikan untuk ini? The CC Hooks docs tidak menyebutkan before-save-hooksecara khusus untuk cc-mode. Bagaimana ini harus dilakukan melalui hook?

Atau, bagaimana saya melakukan ini defadvice? Dari membaca manual, satu-satunya cara saya bisa melihat adalah mengaktifkan saran sebelum menyimpan dan kemudian menonaktifkan setelah pekerjaan selesai. Ini terdengar rumit. Apa yang akan menjadi cara idiomatik menggunakan advices?

Pradhan
sumber
3
Fungsi yang Anda tambahkan before-save-hookdapat memeriksa mode utama saat ini (mis. (eq major-mode ...)) Dan tidak melakukan apa-apa jika tidak cocok dengan mode yang Anda sesuaikan.
Constantine
@Constantine Setuju. Saya ingin memeriksa apakah ada sesuatu yang lebih "built-in" untuk hal semacam ini. IIRC haskell-modememiliki setidaknya satu after/before-savekait dan saya berasumsi ini adalah praktik standar untuk prog-mode.
Pradhan
@Constantine: bisakah Anda mengonversi komentar Anda menjadi sebuah jawaban (tentu saja sedikit berkembang)?
Dan
1
Lihat utas ini untuk contoh penggunaan after-save-hook; Anda dapat menggunakan jenis prosedur yang sama tetapi sebagai gantinya before-save-hook.
Dan

Jawaban:

12

Salah satu cara yang cukup umum untuk membatasi aksi hook ke mode utama tertentu adalah dengan memeriksa nilainya major-mode.

Misalnya, kait ini mencetak pesan sebelum menyimpan buffer menggunakan 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)

Sebagai catatan tambahan: terkadang berguna untuk memeriksa apakah mode utama diturunkan dari Mode CC; kita dapat melakukan ini dengan memeriksa apakah c-buffer-is-cc-modetidak 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.")))
Constantine
sumber
19

Atau, gunakan pengait lokal:

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

Hal ini menambah MY-HOOK-FUNCke buffer lokal before-save-hook dari setiap buffer C ++ Mode, atau penyangga dalam mode berasal dari C ++ Mode.

Saya menemukan ini lebih elegan yang secara eksplisit memeriksa major-mode, dan memiliki keuntungan bahwa Anda dapat menonaktifkan before-save-hook secara lokal untuk setiap buffer M-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local)tanpa mempengaruhi buffer lainnya.

lunaryorn
sumber
-1

Saya pernah membutuhkan sesuatu seperti itu untuk kompilasi otomatis file elisp saya ketika disimpan, saya menggunakan pendekatan seperti ini (mengubah pendekatan ke mode cc):

(add-hook 'c-common-hook #'(lambda ()
                              (add-hook 'before-save-hook #'(lambda ()
                                                               (funcall #'YOUR-FUNC-HOOK)))))
pengguna3672638
sumber
1
Pertama, maksud Anda c-mode-common-hook? Kedua, sepertinya akan menambah fungsi before-save-hooksaat pertama kali Anda memasukkan Cbahasa yang terkait, tetapi kemudian fungsi itu akan dipanggil sebelum setiap penyimpanan di setiap buffer. Yang perlu OP lakukan adalah menjalankan fungsi kondisional pada buffer dalam mode tertentu (lihat komentar @ Constantine untuk caranya).
Dan