LINUX.ORG.RU

замена lvimrc

 


0

3

апается(cd..) пока не найдет .lvimrc. Далее имеется возможность повесить на определенный мап какое-то действие(в данном случае деплой проекта)

execute "nnoremap <buffer> ,r :wall!<CR>:cd " . g:localvimrc_script_dir . " <Bar> !clear;./script.py deploy:project.com<CR>"
Чем это заменить в emacs ?

★★★★
Ответ на: комментарий от yoghurt

апается(cd..) пока не найдет .lvimrc. Далее имеется возможность повесить на определенный мап какое-то действие(в данном случае деплой проекта)

bryak ★★★★
() автор топика

Ты хочешь для открытого *.py файлов привязать операцию которая будет искать вышестоящую директорию в которой лежит .lvimrc и выполнять в ней какой-то скрипт, я правильно понял? Тогда тебе должно подойти вот это.

ReanGD
()
Ответ на: комментарий от ReanGD

Это немного не то. Я в каждом .lvimrc формирую то, что я хочу выполнять. Для одного проекта это ./script.py, для другого ./script.py deploy и тд

bryak ★★★★
() автор топика

Чем это заменить в emacs

locate-dominating-file.

(require 'subr-x)

(defun bryak:load-directory-specific-commands ()
  (interactive)
  (when-let ((path (locate-dominating-file (or buffer-file-name
                                               default-directory) ".locals.el")))
    (load (expand-file-name ".locals.el" path))))

Далее вешаем эту команду на определённый режим, например, python-mode:

(add-hook 'python-mode-hook #'bryak:load-directory-specific-commands)

Создаём в директории проекта файл .locals.el с биндингами (в данном случае для примера выводится сообщение в echo area, замени для своего проекта):

(local-set-key [f5] (lambda ()
                      (interactive)
                      (message "Run deploy")))

Теперь при открытии любого Python-файла в проекте будет доступен этот биндинг.

Подобного можно также добиться с помощью directory local variables + eval.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne
еще вариант
(defun desperately-compile ()
  "Traveling up the path, find a Makefile and `compile'."
  (interactive)
  (with-temp-buffer
    (while (and (not (file-exists-p ".locals.el"))
                (not (equal "/" default-directory)))
           (cd ".."))
    (when (file-exists-p ".locals.el")
      (load (expand-file-name ".locals.el")))))
; (compile "make -k"))))

(add-hook 'python-mode-hook #'desperately-compile)

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

(global-set-key (kbd "C-x r") (lambda ()
                                (interactive)
                                (message "Run deploy")
                                (shell-command-to-string "touch /tmp/123.txt")))

bryak ★★★★
() автор топика
Ответ на: комментарий от bryak

еще вариант

Тут ты изобрёл 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 ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 2)
Ответ на: комментарий от theNamelessOne

Самое интересное то, что твой код не работает. Пишет:

File mode specification error: (void-function when-let)

bryak ★★★★
() автор топика
Ответ на: комментарий от bryak

Самое интересное то, что твой код не работает

when-let запилили в Emacs 25. Вот так можно сделать без него:

(defun bryak:load-directory-specific-commands ()
  (interactive)
  (let* ((start-path (or buffer-file-name default-directory))
         (path (locate-dominating-file start-path ".locals.el")))
    (when path
      (load (expand-file-name ".locals.el" path)))))
theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.