Як я можу отримати контур в режимі org у другому буфері як динамічний зміст?


25

Редагуючи великі документи, я хотів би побачити, де я перебуваю, побачивши контур (без вмісту) в окремому буфері. Як і коли ви читаєте PDF-файл, зліва знаходиться TOC. (Дивись нижче)

У org-режимі можливо розширити / згортати контур. Але чи можливо статичний контур ліворуч (або праворуч) в окремому буфері, щоб при натисканні на заголовки інший буфер переміщувався до цього положення?

Це щось подібне, але для org-mode? введіть тут опис зображення

[Редагувати]
Це clone-indirect-bufferдуже близько до того, що я хочу. Пропущений фрагмент головоломки полягає в тому, щоб перейти на ту саму локацію, клацнувши заголовок / (або дійсно до будь-якої точки).

Для цього я спробував написати якийсь код: Перейти до іншого клонованого буфера до тієї ж точки? (положення синхронізації непрямих буферів) (org-режим)

Але він не функціонує, якщо вміст згортається. Якщо це може працювати так, буфер клонування-непрямий - це повне рішення цього питання.

[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 Після короткого тестування виглядає, що він робить щось інше, ніж те, що хоче ОП: він копіює поточне піддірево у непрямий буфер. org-sparse-tree-to-indirect-bufferНаприклад, нам знадобиться функція, але вона, здається, не існує.
Т. Веррон

Подивившись трохи далі, спробуйте що-небудь уздовж орг-панелей
Самуель Флінт

Я думаю, що також варто згадати імен-список . У ньому відсутні деякі вимоги, але вони стосуються інших.
лампа розжарювання

буфер орг-дерева-непрямого буфера є приголомшливим.
ninrod

Відповіді:


9

Приходить на думку кілька варіантів. Перші два є speedbar, що нібито добре грає org-mode, і minimap, хоча я їх не використовував, не можу поручитися за них особисто.

Найпростішим варіантом (а також найбільш гнучким) може бути використання непрямого буфера .

На практиці ви перейдете до orgбуфера, для якого ви хочете окреслити, натисніть M-x clone-indirect-buffer(використовуйте, C-u M-x clone-indirect-bufferякщо ви хочете керувати тим, що називається клоном), а потім бум, є ще одна копія буфера, яку ви використовуєте. Помістіть цей клон у вікно або кадр поруч з оригінальним буфером, а в клоні - відрегулюйте контур під ваш смак.

Це не дає вам функцію "натиснути на заголовок в контур", яку ви згадали, але надає вам духу бічної панелі.

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

(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)))))

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

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

Дякуємо за фрагмент коду вище. Багато цінував ^ _ ^.
Лев Уфімцев

16

Як щодо: M-x occur RET ^*+ RET(зауважте, що в кінці регулярного вираження є пробіл).


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

Мені подобається це просте, вбудоване рішення. Якщо вам потрібно виділити, використовуйте кермо, а не відбуватися. Додатковою перевагою є можливість використовувати єдину навігацію для декількох буферів файлів org, використовуючи багатопотокові дії. Нарешті, за допомогою події-редагування можна редагувати обидва погляди, контурний вигляд та розгорнутий подання. У будь-якому випадку я це голосую.
Користувач Emacs

Збираємось підтримати це, тому що його дивовижний, простий та ефективний
Gambo

Так просто. Так розумно. Так хакіш. Такий чудовий.
дангом

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, та кілька інших незначних удосконалень.
blujay

2

Нарешті, це було реалізовано в пакеті org-sidebar:

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


1
Ура! У мене є хитка настройка, яка іноді просто перестає працювати, вона абсолютно БРІЛІАНТНА, якщо це пакет зараз!
процвітає

0

дві пропозиції з низькою орендою (що я роблю) від непрограміста, який любить використовувати аквамаки для редактора тексту:

  1. перемикання вперед і назад за допомогою команд вбуфера:

STARTUP: відступ (щоб відобразити контур типу водоспаду легше бачити в цілому)

це для перегляду буфера, керованого вкладками

і

+ ВАРІАНТИ: H: N, де N = = кількість рівнів, які ви хочете побачити в експорті html, що є пропозицією №2

дивіться: https://emacsclub.github.io/html/org_tutorial.html

  1. експортуйте як html (CC CE hh), щоб побачити TOC. Я не можу знайти жодного, хто може легко отримати текстовий вихід HTML або тексту (CC CE ta) до відступу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.