Как я могу получить схему режима org во втором буфере как динамическое оглавление?


25

Когда я редактирую большие документы, я хотел бы видеть, где я нахожусь, видя схему (без содержимого) в отдельном буфере. Например, когда вы читаете файл PDF, слева отображается оглавление. (увидеть ниже)

В режиме орг можно развернуть / свернуть контур. Но возможно ли иметь статический контур слева (или справа) в отдельном буфере, чтобы при нажатии на заголовки другой буфер перемещался в эту позицию?

Вроде как, но для орг-режима? введите описание изображения здесь

[Править]
Это clone-indirect-bufferочень близко к тому, что я хочу. Недостающим элементом головоломки является прыжок в то же место при нажатии на заголовок / (или любую точку на самом деле).

Для этого я попытался написать некоторый код: перейти к другому клонированному буферу в ту же точку? (синхронизировать положение косвенных буферов) (org-mode)

Но это не работает, если контент свернут. Если это можно заставить работать, то clone-inderect-buffer является полным решением для этого.

[Edit2 Solution]
Код в ссылке выше и в ответе ниже объединяет niceley для решения прыжков вперед и назад.

;first call 'clone-indirect-buffer'. Then...

;This function works between buffer and it's clone.
(defun my/goto-same-spot-in-other-buffer () 
  "Go to the same location in the other buffer. Useful for when you have cloned indirect buffers"
  (interactive)
  (let ((my/goto-current-point (point)))
       (other-window 1)
       (goto-char my/goto-current-point)
       (when (invisible-p (point))
        (org-reveal)))
)

;This function is a clone-to-buffer jump only:
; It does find the other buffer first thou instead of just jumping to the other 
; window as does the function above.
(defun my/jump-to-point-and-show ()
  "Switch to a cloned buffer's base buffer and move point to the
cursor position in the clone."
  (interactive)
  (let ((buf (buffer-base-buffer)))
    (unless buf
      (error "You need to be in a cloned buffer!"))
    (let ((pos (point))
          (win (car (get-buffer-window-list buf))))
      (if win
          (select-window win)
        (other-window 1)
        (switch-to-buffer buf))
      (goto-char pos)
      (when (invisible-p (point))
        (show-branches)))))


(global-set-key (kbd "<s-mouse-1>") 'my/goto-same-spot-in-other-buffer)
(global-set-key (kbd "s-m") 'my/goto-same-spot-in-other-buffer)
(global-set-key (kbd "<C-s-mouse-1>") 'my/jump-to-point-and-show)
(global-set-key (kbd "C-s-m") 'my/jump-to-point-and-show)

2
Может быть, попробовать C-c C-x bили org-tree-to-indirect-buffer.
Самуэль Флинт

@SWFlint После короткого теста похоже, что он делает что-то отличное от того, что хочет OP: он копирует текущее поддерево в косвенный буфер. org-sparse-tree-to-indirect-bufferНапример, нам нужна была бы функция, но она, кажется, не существует.
Т. Веррон

Посмотрев немного дальше, попробуйте что-нибудь в духе орг-стилей
Сэмюэль Флинт

Я думаю, что стоит упомянуть список имен . В нем отсутствуют некоторые требования, но рассматриваются другие.
Лампа накаливания

org-tree-to-косвенный-буфер является удивительным.
17

Ответы:


9

Несколько вариантов приходят на ум. Первые два speedbar, которые якобы хорошо играют org-mode, и minimap, хотя я ими не пользовался, поэтому не могу поручиться за них лично.

Что может быть самым простым вариантом (а также наиболее гибким), будет использовать косвенный буфер .

На практике вы переходите в orgбуфер, для которого вы хотите наброски, нажимаете M-x clone-indirect-buffer(используйте, C-u M-x clone-indirect-bufferесли хотите контролировать, как называется клон), а затем boom, есть еще одна копия буфера для использования. Поместите этот клон в окно или рамку рядом с исходным буфером и, в клоне, отрегулируйте контур по своему вкусу.

Он не дает вам упомянутую выше функциональность «щелкнуть по заголовку в общих чертах», но дает вам дух боковой панели.

Изменить: в ответ на ваш комментарий, вот простая команда, которая при вызове из буфера клона переключится на базовый буфер и переместит точку туда, где курсор находился в буфере клона:

(defun jump-to-point-and-show ()
  "Switch to a cloned buffer's base buffer and move point to the
cursor position in the clone."
  (interactive)
  (let ((buf (buffer-base-buffer)))
    (unless buf
      (error "You need to be in a cloned buffer!"))
    (let ((pos (point))
          (win (car (get-buffer-window-list buf))))
      (if win
          (select-window win)
        (other-window 1)
        (switch-to-buffer buf))
      (goto-char pos)
      (when (invisible-p (point))
        (show-branches)))))

Я попробовал спидбар / Sr-Speedbar. Это очень приятно, но показывает только первые 2 уровня. Я спросил, возможно ли здесь иметь больше уровней: emacs.stackexchange.com/questions/9533/… Непосредственный буфер - хороший вариант. Интересно, можно ли как-то переместить курсор в другом буфере в ту же позицию, что и в клонированном буфере? ..
Лев Уфимцев,

Я пытался написать код, который будет переходить в то же место в другом буфере, но он работает, только если все развернуто. Если его можно заставить работать так, чтобы он автоматически расширялся, то клон-буфер является идеальным решением. Сообщение: emacs.stackexchange.com/questions/9536/…
Лев Уфимцев

Спасибо за фрагмент кода выше. Очень ценится ^ _ ^.
Лев Уфимцев

16

Как насчет: M-x occur RET ^*+ RET(обратите внимание, что в конце регулярного выражения есть пробел).


Я не знаю, почему кто-то опроверг этот ответ, я думаю, что на самом деле это довольно аккуратное решение без лишних хлопот. Единственная странность в том, что она не преследует вас. Т.е. это не очевидно в буфере возникновения, где вы находитесь (например, выделите текущий заголовок), и он не прокручивается для длинных длинных документов. Но для небольших документов это работает.
Лев Уфимцев

Мне нравится это простое, встроенное решение. Если нужно подсвечивать, используйте helm-emer вместо begin. Дополнительным преимуществом является возможность использовать единую навигацию для нескольких буферов файлов org с помощью функции многократного использования. И наконец, с помощью типового редактирования можно редактировать оба вида, контурный вид и расширенный вид. В любом случае, я голосую за это.
Emacs User

Переход к upvote это , потому что его удивительный, простой и эффективный
Gambo

Так просто. Такой умный. Так хакерски. Так круто.
dangom

7

Прочитав ответ Дэна и основанное на нем ваше решение, я собрал все воедино. Он открывает новый узкий доступный только для чтения клон слева от текущего буфера и связывается <mouse-1>и RETлокально в клоне, чтобы перейти к этой позиции в базовом буфере.

(defun my/open-tree-view ()
  "Open a clone of the current buffer to the left, resize it to 30 columns, and bind <mouse-1> to jump to the same position in the base buffer."
  (interactive)
  (let ((new-buffer-name (concat "<tree>" (buffer-name))))
    ;; Create tree buffer
    (split-window-right 30)
    (if (get-buffer new-buffer-name)
        (switch-to-buffer new-buffer-name)  ; Use existing tree buffer
      ;; Make new tree buffer
      (progn  (clone-indirect-buffer new-buffer-name nil t)
              (switch-to-buffer new-buffer-name)
              (read-only-mode)
              (hide-body)
              (toggle-truncate-lines)

              ;; Do this twice in case the point is in a hidden line
              (dotimes (_ 2 (forward-line 0)))

              ;; Map keys
              (use-local-map (copy-keymap outline-mode-map))
              (local-set-key (kbd "q") 'delete-window)
              (mapc (lambda (key) (local-set-key (kbd key) 'my/jump-to-point-and-show))
                    '("<mouse-1>" "RET"))))))

(defun my/jump-to-point-and-show ()
  "Switch to a cloned buffer's base buffer and move point to the cursor position in the clone."
  (interactive)
  (let ((buf (buffer-base-buffer)))
    (unless buf
      (error "You need to be in a cloned buffer!"))
    (let ((pos (point))
          (win (car (get-buffer-window-list buf))))
      (if win
          (select-window win)
        (other-window 1)
        (switch-to-buffer buf))
      (goto-char pos)
      (when (invisible-p (point))
        (show-branches)))))

Это будет работать с outline-modeи outline-minor-mode, а также с режимами, которые на них основаны, например org-mode. Я нашел некоторую информацию о том, как получить карты локальных ключей, но я не знаю, как выбрать, какую из них скопировать. Также есть эта страница, на которой есть функция автоматического создания специфичных для буфера второстепенных режимов для установки локальных ключей буфера, но эта проблема выходит за рамки данной проблемы.


1
Спасибо за то, что поделился этим. Используя outline-mode-mapвместо этого, org-mode-mapмне удалось заставить его работать AUCTeXс outline-minor-mode, что приятно.
Олег Доманов

Кстати, эта outline-modeфункция hide-bodyскрывает все, кроме заголовков.
Олег Доманов

@OlegDomanov Спасибо за эту информацию! Я улучшил код, чтобы использовать outline-mode-mapи hide-body, и несколько других незначительных улучшений.
Блюджей

2

Наконец, это было реализовано в пакете org-sidebar:

демонстрация org-sidebar-tree


1
Hoooray! У меня есть установка Shakey, которая иногда просто перестает работать, это абсолютно БЛИЗКО, если это пакет сейчас!
процветает

0

два предложения низкой арендной платы (что я делаю) от непрограммиста, который любит использовать aquamacs для текстового редактора:

  1. переключаться между командами в буфере:

ЗАПУСК: отступ (чтобы наглядно показать контур типа водопада в целом)

это для просмотра буфера через табуляцию

а также

+ ОПЦИИ: H: N, где N = = количество уровней, которые вы хотите видеть в экспорте html, что является предложением № 2

см .: https://emacsclub.github.io/html/org_tutorial.html

  1. экспорт в формате HTML (CC CE чч), чтобы увидеть оглавление. Я не могу найти никого, кто может легко получить текстовый вывод HTML или текст (CC CE та), чтобы отступ

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.