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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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 и соответствующий файл на диске. Это восходит к старым временам, когда сбои были частыми, и они хотели сделать резервную копию диска.

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