Вопрос : как я могу контролировать, где org
появляется буфер ключевых слов todo?
Ввод todo
ключевого слова с помощью C-c C-t
( org-todo
) открывает новый буфер с параметрами ключевого слова, а затем снова закрывает его после выбора. Все идет нормально. Тем не менее, для этого требуется другое окно, что не очень хорошо, тем более что ему действительно нужно отображать только одну или две строки с ключевыми словами.
Таким образом, при следующей компоновке нажатие C-c C-t
в левом окне ( some-org-buffer
) откроет *Org todo*
в правом окне:
+---------------------+---------------------+
| | |
| | |
| | |
| | |
| some-org-buffer | some-other-buffer |
| | |
| | |
| | |
| | |
+---------------------+---------------------+
Вместо этого я хотел бы, чтобы небольшое окно всплыло как вертикальное разделение, как показано ниже:
+---------------------+---------------------+
| | |
| | |
| some-org-buffer | some-other-buffer |
| | |
| | |
+---------------------+ |
| | |
| *Org todo* | |
| | |
+---------------------+---------------------+
Пользуясь
этим ответом , я написал функцию для добавления в display-buffer-alist
:
(defun org-todo-position (buffer alist)
(let ((win (car (cl-delete-if-not
(lambda (window)
(with-current-buffer (window-buffer window)
(memq major-mode
'(org-mode org-agenda-mode))))
(window-list)))))
(when win
(let ((new (split-window win -5 'below)))
(set-window-buffer new buffer)
new))))
(add-to-list 'display-buffer-alist
(list " \\*Org todo\\*" #'dan-org-todo-position))
Однако это не работает. Вздох. Что я сделал не так с display-buffer-alist
? Если говорить более конкретно, как я могу получить
todo
буфер ключевых слов, чтобы он появлялся там, где я хочу?
org-switch-to-buffer-other-window
чтобы сделать то, что вы хотите - вы можете создать условие, которое делает все, что вы хотите.org-switch-to-buffer-other-window
целой куче других уродливыхorg
внутренностей. Смотрите ответ на позорное «решение».win
. Есть ли причина, которую вы не можете просто использовать(selected-window)
здесь?Ответы:
Вздох. Я нашел «решение», но уродливое, которое требует перезаписи существующей
org
функции. Я бы предпочел тот, который не требует измененияorg
исходного кода, но я помещаю результаты моего археологического исследования здесь на тот случай, если кто-то еще сможет его использовать.Как я заметил в прошлом с другими
org
функциями,org-mode
он довольно самоуверен в том, как он обрабатывает окна.Глубоко в исходном коде
org-todo
находится вызов функцииorg-fast-todo-selection
. Эта функция, в свою очередь, вызываетorg-switch-to-buffer-other-window
, чья строка документации читает, частично:Ооо
Хорошо, я укушу: давайте посмотрим
org-switch-to-buffer-other-window
. Он используетorg-no-popups
макрос. Его строка документа гласит:Оказывается, это
display-buffer-alist
одна из переменных,let
привязанная кnil
.( Голова взрывается. )
В конечном счете, мы можем заставить его не игнорировать
display-buffer-alist
, отредактировавorg-fast-todo-selection
и заменивorg-switch-to-buffer-other-window
строку на старуюswitch-to-buffer-other-window
:источник
flet
здесь, чтобы привязатьorg-switch-to-buffer-other-window
? Хотите знать, если вы можете посоветовать или иным образом обернуть,org-fast-todo-selection
а не перезаписать его.org-switch-to-buffer-other-window
просто(switch-to-buffer-other-window args)
. Я также удалил&rest
из функции аргументы.Недавно я понял, как сделать захват в режиме Org в новом кадре . Изменить этот код для использования вашей функции довольно просто. Вот как я это сделаю:
Для полноты, вот определение
my/with-advice
макроса из другого ответа:источник
Просматривая чужой конфиг , я нашел способ контролировать, где
*Org Src.*
и где*Org todo*
появляются буферы. Теперь, когда я нажимаюC-c C-t
илиC-c '
эти буферы отображаются в новом окне в нижней части моего текущего макета окна, и выбор состояния TODO или нажатиеC-c '
(org-edit-src-exit
) возвращает мою конфигурацию окна в исходное расположение.Это решение включает в себя использование кандалов и некоторых Elisp:
Шаг 1
Скачать
shackle
с MELPA. Вот как я настроил этоuse-package
в моем файле инициализации:Важные настройки здесь:
☞ Источник
Обратите особое внимание на пространство между
"
и*Org
в нижней строке. Я не тестировал настройки:align
в других местах, но,shackle
похоже, довольно гибок, поэтому стоит прочитать документацию и поэкспериментировать с ней.Шаг 2
Теперь мы заставляем
org-mode
слушать ещеshackle
немного Elisp в нашем файле инициализации. Чтобы получить*Org Src.*
буферы для подражанияshackle-rules
:☞ Источник
К сожалению
org-mode
, не предоставляет аналогичные настройки для*Org todo*
буферов. Этот хак восполняет это (и, вероятно, делает(setq org-src-window-setup 'other-window)
излишним, но кто-то более знающий должен будет вмешаться):☞ Источник
источник