emacsclient, восстановить все windows в кадре в терминале - PullRequest
0 голосов
/ 10 марта 2020

Объект: в терминале, при запуске, в одном кадре, восстановить рабочее пространство emacs. т.е. восстановить все "windows" до состояния, предшествующего C -x C - c.

. Описание: Восстановление окна можно просто выполнить в emacs GUI, добавив (desktop-save-mode 1) в файл init.el.

Однако, когда emacs запускается как демон, emacsclient не работает так же. При такой же настройке он по-прежнему запоминает основной режим файла, а также другие буферы перед выходом, но макет окна не будет восстановлен. Отображается только 1 главное окно в зависимости от настроек по умолчанию.

Я провел небольшое исследование, изучил некоторые функции / переменные, используя встроенную документацию elisp. Я проверил (desktop-save-buffer 1), framset-save, framset-restore и, похоже, ни один из них не работает. Также я проверил похожие вопросы, опубликованные ранее, и нашел чей-то ответ, используя следующий скрипт:

 (setq desktop-restore-forces-onscreen nil)
    (add-hook 'desktop-after-read-hook
     (lambda ()
       (frameset-restore
        desktop-saved-frameset
        :reuse-frames (eq desktop-restore-reuses-frames t)
        :cleanup-frames (not (eq desktop-restore-reuses-frames 'keep))
        :force-display desktop-restore-in-current-display
        :force-onscreen desktop-restore-forces-onscreen)))

Однако этот скрипт содержит ошибки, он открывает фрейм "GUI" и не может быть правильно закрыт ( открывать автоматически всякий раз, когда закрывается, и, если возможно, я предпочитаю открывать фрейм в терминале, так что возможна настройка терминала «texteditor», с некоторыми другими незначительными достоинствами). Извините за утомительный вопрос, любая помощь будет оценена.

1 Ответ

0 голосов
/ 16 марта 2020

Я действительно не знаю правильный способ сделать это, но мне удалось восстановить набор фреймов, созданный в фрейме GUI, в терминальный фрейм. Новый кадр должен быть достаточно большим, иначе он выдаст ошибку. Я сделал (setq foo (frameset-save (frame-list))) и (pp foo (get-buffer "*scratch*")), чтобы вывести read способное представление набора фреймов в буфер *scratch*. Затем я отредактировал его вручную, чтобы избавиться от (display . ":0.0"). Этого, казалось, было достаточно, чтобы заставить его не форсировать GUI кадр. Затем я сделал (frameset-restore [frameset ...]) на отредактированном наборе кадров.

Если вы посмотрите на frameset.el, существуют функции фильтрации для программного редактирования набора кадров. Также, если вы посмотрите на комментарии, параметр display обрабатывается специально. Вы должны посмотреть на детали там.

...