перед збереженням-гаком для режиму cc


13

Я хочу налаштувати cc-modeвиконання функції перед збереженням. Одним з рішень було б змінити cc-modeкарту клавіш, щоб прив'язати C-x C-sдо функції, яка виконує потрібну мені роботу, а потім збереже її.

Моє запитання: чи є гачок, який я міг би налаштувати для цього? В документи CC Гачки не кажучи вже про before-save-hookспеціально для cc-mode. Як це робити через гачок?

Як варіант, як це зробити defadvice? Прочитавши посібник, я міг лише побачити, як включити поради перед збереженням, а потім відключити після закінчення роботи. Це звучить громіздко. Який би був ідіоматичний спосіб використання advices?


3
Функція, яку ви додаєте, before-save-hookможе перевірити поточний основний режим (наприклад (eq major-mode ...)) і нічого не робити, якщо він не відповідає режиму, який ви налаштовуєте.
Костянтин

@ Константин Погодився. Мені хотілося перевірити, чи є щось подібне до "вбудованого". IIRC haskell-modeмає принаймні один after/before-saveгачок, і я припустив, що це стандартна практика для прог-режимів.
Прадхан

@Constantine: ти міг би перетворити свій коментар у відповідь (трохи розширивши, звичайно)?
Дан

1
Дивіться цю тему для прикладу використання after-save-hook; Ви можете використовувати той самий вид процедури, але замінити before-save-hook.
Дан

Відповіді:


12

Один досить поширений спосіб обмеження дії гака на певний основний режим - перевірка значення major-mode.

Наприклад, цей гачок друкує повідомлення перед збереженням буферів, використовуючи 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)

Як бічна примітка: іноді може бути корисно перевірити, чи основний режим походить із режиму CC; ми можемо це зробити, перевіривши, чи c-buffer-is-cc-modeні 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

Крім того, використовуйте локальний гачок:

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

Це додає MY-HOOK-FUNCдо локального before-save-hook буфера кожного буфера режиму C ++ або будь-якого буфера в режимі, похідному від режиму C ++.

Я вважаю це більш елегантним, що явно перевіряє major-mode, і він має ту перевагу, що ви можете відключити before-save-hook локально для кожного буфера, M-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local)не впливаючи на інші буфери.


-1

Колись мені знадобилося щось подібне для автоматичного компілювання моїх файлів elisp, коли вони були збережені, я використав такий підхід (перетворив підхід у режим cc):

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

1
По-перше, ти мав на увазі c-mode-common-hook? По-друге, схоже, що вона додасть функцію before-save-hookпри першому введенні Cмови, що пов'язана, але потім ця функція буде викликана безпосередньо перед кожним збереженням кожного буфера. Що потрібно зробити, це запустити функцію, що залежить від того, що буфер знаходиться в певному режимі (див. Коментар Константина @ як).
Дан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.