Запустить функцию с аргументами внутри стандартного хука - PullRequest
0 голосов
/ 12 декабря 2018

Каков наилучший способ запуска функции с аргументами, например.тот, который обычно запускается с run-hook-with-args, внутри обычного хука, например.after-save-hook.

В качестве простого примера я хочу добавить some-function к after-save-hook здесь, но разрешить ему иметь дополнительный аргумент.

(defun some-function (&optional arg)
  (if arg 'do-this 'otherwise-do-this))

;; how to run `some-function' with argument here?
(add-hook 'after-save-hook 'some-function nil 'local)

1 Ответ

0 голосов
/ 12 декабря 2018

Итак, у вас есть что-то вроде этого (я изменил имя функции, чтобы сделать его менее запутанным).

(add-hook 'after-save-hook 'my-function nil 'local)

Но вы спрашиваете, как вы можете это организовать, когда after-save-hook вызываетmy-function он передает ему аргумент.

Во-первых, вы не можете сделать это напрямую, по очевидной причине, что after-save-hook является обычным хуком и поэтому запускается таким образом, чтоt не предоставляет никаких средств для передачи аргументов.

Это означает, что вы должны добавить к хуку функцию, которая фактически делает то, что вы хотите .

Вы могли бы создайте функцию, которая делает то, что вы хотите, так:

(add-hook 'after-save-hook (apply-partially 'my-function ARG) nil 'local)

Но подходы в этом направлении действительно беспорядочные, когда дело доходит до проверки и манипулирования хуком позже, поэтому я рекомендую не делать ничего подобного.

Честно говоря, самый простой подход - очень просто определить именованную функцию, которая делает то, что вам нужно, и добавить , что , в ловушку.

(defun my-function-do-this ()
  "Do This"
  'do-this)

(add-hook 'after-save-hook 'my-function-do-this nil 'local)
...