Получение имени буфера/файла внутри emacs-ipython-notebook

Я играю с блокнотами в 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 недостаточно хорош, чтобы выяснить, какую переменную или код нужно написать вместо этого, чтобы получить имя файла. Может ли кто-нибудь помочь с этим?

Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел "Заголовок" в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
1
0
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Эйн использует 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)

Спасибо! Я думаю, что это почти работает. похоже, что возвращенный здесь путь к блокноту является относительным путем к блокноту, начиная с корневого каталога моего проекта, поэтому, когда я передаю его в jupytext, я получаю сообщение об ошибке «файл не найден». Я немного покопался в отладчике, и кажется, что все переменные, которые я могу найти, являются относительными путями. Есть ли способ получить абсолютный путь или корневой каталог моего проекта, чтобы я мог добавить его к пути?

xph 13.02.2023 17:52

(expand-file-name (ein:$notebook-notebook-path (ein:get-notebook))) работает? default-directory в буфере ein не установлен каталог проекта?

Rorschach 13.02.2023 22:24
expand-file-name действительно работает, но не с ein:$notebook-notebook-path, так как это дублирует часть пути. ein:$notebook-notebook-name работает! просто для ясности, следующее делает именно то, что мне нужно: (expand-file-name (ein:$notebook-notebook-name (ein:get-notebook))) я приму этот ответ как правильный; Вы можете отредактировать свой ответ с исправленной строкой? спасибо!
xph 14.02.2023 05:33

Не проверял это. Но может быть:

(buffer-name)

Команда может работать, и вы можете создать отсутствующее имя файла:

(concat (buffer-name) ".ipynb")

В emacs есть буфер RAM и соответствующий файл на диске. Это восходит к старым временам, когда сбои были частыми, и они хотели сделать резервную копию диска.

Другие вопросы по теме