LINUX.ORG.RU

История изменений

Исправление theNamelessOne, (текущая версия) :

еще вариант

Тут ты изобрёл locate-dominating-file.

Кстати, у меня не получается с local-set-key. Работает только с global-set-key. Почему так ?

Вангую, что из-за with-temp-buffer. local-set-key определяет биндинг в локальном keymap текущего буффера, который определяется с помощью функции (current-local-map). В большинстве случаев (как и в моём примере), локальный keymap — это keymap текущего major mode. Т.к. bryak:load-directory-specific-command выполняется как хук к python-mode, это биндинг определяется в python-mode-map (это можно проверить, если выполнить (lookup-key python-mode-map [f5]).

Однако, в твоём случае load (и, соответственно, local-set-key) выполняется не в контексте python-буффера, а в контексте временного буффера, созданного макросом with-temp-buffer. Временный буффер выполняется в fundamental major mode, для которого current-local-map возвращает nil. В этом случае local-set-key создаёт новый keymap для временного буфера, в котором и определяется биндинг, что не имеет никакого смысла/эффекта, т.к. а) этот буффер удаляется при выходе из with-temp-buffer, б) у него свой keymap, в то время как тебе нужен python-mode-map.

Твоё решение заработает, если вместо (local-set-key ...) явно устанавливать биндинг для python-mode-map: (define-key python-mode-map ...). Также ты можешь избавиться от with-temp-buffer или вынести загрузку файла из блока with-temp-buffer. Но такие решения не имеют никаких преимуществ перед решением с locate-dominating-file + local-set-key.

Исправление theNamelessOne, :

еще вариант

Тут ты изобрёл locate-dominating-file.

Кстати, у меня не получается с local-set-key. Работает только с global-set-key. Почему так ?

Вангую, что из-за with-temp-buffer. local-set-key определяет биндинг в локальном keymap текущего буффера, который определяется с помощью функции (current-local-map). В большинстве случаев (как и в моём примере), локальный keymap — это keymap текущего major mode. Т.к. bryak:load-directory-specific-command выполняется как хук к python-mode, это биндинг определяется в python-mode-map (это можно проверить, если выполнить (lookup-key python-mode-map [f5]).

Однако, в твоём случае load (и, соответственно, local-set-key) выполняется не в контексте python-буффера, а в контексте временного буффера, созданного макросом with-temp-buffer. Временный буффер выполняется в fundamental major mode, для которого current-local-map возвращает nil. В этом случае local-set-key создаёт новый keymap для временного буфера, в котором и определяется биндинг, что не имеет никакого смысла/эффекта, т.к. а) этот буффер удаляется при выходе из with-temp-buffer, б) у него свой keymap, в то время как тебе нужен python-mode-map.

Твоё решение заработает, если вместо (local-set-key ...) явно устанавливать биндинг для python-mode-map: (define-key python-mode-map ...). Также ты можешь избавиться от `with-temp-buffer` или вынести загрузку файла из `with-temp-buffer`. Но такие решения не имеют никаких преимуществ перед решением с locate-dominating-file + local-set-key.

Исходная версия theNamelessOne, :

еще вариант

Тут ты изобрёл locate-dominating-file.

Кстати, у меня не получается с local-set-key. Работает только с global-set-key. Почему так ?

Вангую, что из-за with-temp-buffer. local-set-key определяет биндинг в локальном keymap текущего буффера, который определяется с помощью функции (current-local-map). В большинстве случаев (как и в моём примере), локальный keymap — это keymap текущего major mode. Т.к. bryak:load-directory-specific-command выполняется как хук к python-mode, это биндинг определяется в python-mode-map (это можно проверить, если выполнить (lookup-key python-mode-map [f5]).

Однако, в твоём случае load (и, соответственно, local-set-key) выполняется не в контексте python-буффера, а в контексте временного буффера, созданного макросом with-temp-buffer. Временный буффер выполняется в fundamental major mode, для которого current-local-map возвращает nil. В этом случае local-set-key создаёт новый keymap для временного буфера, в котором и определяется биндинг, что не имеет никакого смысла/эффекта, т.к. а) этот буффер удаляется при выходе из with-temp-buffer, б) у него свой keymap, в то время как тебе нужен python-mode-map.

Твоё решение заработает, если вместо (local-set-key ...) явно устанавливать биндинг для python-mode-map: (define-key python-mode-map ...), но такое решение не имеет никаких преимуществ перед решением с locate-dominating-file + local-set-key.