Я играю с блокнотами в emacs. Моя текущая настройка — EIN (emacs-ipython-notebook) для интерактивной поддержки и jupytext для преобразования .ipynb файлов в .py, что полезно для сравнения и проверки кода. Прямо сейчас мне нужно запустить команду оболочки jupytext, чтобы выполнить синхронизацию, но я хотел бы сделать это автоматически при сохранении, аналогично тому, как jupytext поддерживает это из коробки, если вы используете Jupyter. Я попробовал следующее
(defun sync-jupytext ()
"Sync linked files via jupytext."
(shell-command-to-string (format "jupytext --sync %s" buffer-file-name)))
(add-hook 'after-save-hook #'sync-jupytext)
К сожалению, это не работает, поскольку buffer-file-name кажется nil после активации режима ein. (Однако это работает, если я не запускаю интерактивный режим C-c C-o.) Мой e-lisp недостаточно хорош, чтобы выяснить, какую переменную или код нужно написать вместо этого, чтобы получить имя файла. Может ли кто-нибудь помочь с этим?
Эйн использует polymode для поддержки нескольких основных режимов в буфере, и в результате рабочий буфер не связан напрямую с файлом записной книжки.
Путь к блокноту, который должен работать вместо buffer-file-name, доступен через (ein:$notebook-notebook-name (ein:get-notebook)).
Я думаю, что для синхронизации с jupytext вы могли бы добавить совет ein:notebook-save-notebook-success для синхронизации блокнота (может быть более чистый способ с использованием механизма ein:events-on, но я не уверен, как это сделать).
(defun my@sync-jupytext (orig-fn notebook &rest args)
(apply orig-fn notebook args)
(message "[jupytext] %s"
(shell-command-to-string
(format "jupytext --sync %s"
(expand-file-name (ein:$notebook-notebook-name notebook))))))
(advice-add 'ein:notebook-save-notebook-success :around #'my@sync-jupytext)
(expand-file-name (ein:$notebook-notebook-path (ein:get-notebook))) работает? default-directory в буфере ein не установлен каталог проекта?
expand-file-name
действительно работает, но не с ein:$notebook-notebook-path
, так как это дублирует часть пути. ein:$notebook-notebook-name
работает! просто для ясности, следующее делает именно то, что мне нужно: (expand-file-name (ein:$notebook-notebook-name (ein:get-notebook)))
я приму этот ответ как правильный; Вы можете отредактировать свой ответ с исправленной строкой? спасибо!
Не проверял это. Но может быть:
(buffer-name)
Команда может работать, и вы можете создать отсутствующее имя файла:
(concat (buffer-name) ".ipynb")
В emacs есть буфер RAM и соответствующий файл на диске. Это восходит к старым временам, когда сбои были частыми, и они хотели сделать резервную копию диска.
Спасибо! Я думаю, что это почти работает. похоже, что возвращенный здесь путь к блокноту является относительным путем к блокноту, начиная с корневого каталога моего проекта, поэтому, когда я передаю его в jupytext, я получаю сообщение об ошибке «файл не найден». Я немного покопался в отладчике, и кажется, что все переменные, которые я могу найти, являются относительными путями. Есть ли способ получить абсолютный путь или корневой каталог моего проекта, чтобы я мог добавить его к пути?