Jak uzyskać kontur trybu org w 2. buforze jako dynamiczny spis treści?

25

Kiedy edytuję duże dokumenty, chciałbym zobaczyć, gdzie jestem, widząc kontur (bez zawartości) w osobnym buforze. Podobnie jak podczas czytania pliku PDF po lewej stronie znajduje się spis treści. (patrz poniżej)

W trybie organizacji można rozwinąć / zwinąć kontur. Ale czy możliwe jest umieszczenie statycznego konturu po lewej (lub po prawej) w osobnym buforze, aby po kliknięciu nagłówków drugi bufor przesunął się do tej pozycji?

Trochę tak, ale dla trybu org? wprowadź opis zdjęcia tutaj

[Edit] jest bardzo zbliżony do tego, co chcę. Brakującym elementem układanki jest przeskoczenie w to samo miejsce po kliknięciu nagłówka / (lub dowolnego punktu naprawdę).
clone-indirect-buffer

W tym celu próbowałem napisać kod: Przenieś do innego sklonowanego bufora w tym samym punkcie? (pozycja synchronizacji buforów pośrednich) (tryb org)

Ale nie działa, jeśli zawartość jest zwinięta. Jeśli można to zrobić, to bufor indonect-clone jest kompletnym rozwiązaniem tego problemu.

[Edit2 Solution]
Kod w linku powyżej i w odpowiedzi poniżej łączą nicejkę, aby rozwiązać przeskakiwanie tam iz powrotem.

;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)
Lew Ufimcew
źródło
2
Może spróbuj C-c C-x blub org-tree-to-indirect-buffer.
Samuel Flint
@SWFlint Po krótkim teście wygląda na to, że robi coś innego niż chce OP: kopiuje bieżące poddrzewo do bufora pośredniego. Potrzebujemy org-sparse-tree-to-indirect-bufferna przykład funkcji, ale wydaje się, że nie istnieje.
T. Verron
Po dokładniejszych poszukiwaniach spróbuj czegoś podobnego do paneli org
Samuel Flint
Myślę, że warto również wspomnieć o liście imenu . Brakuje niektórych wymagań, ale dotyczy innych.
incandescentman
org-tree-to-niebuforowy bufor jest niesamowity.
ninrod

Odpowiedzi:

9

Przychodzi mi na myśl kilka opcji. Pierwsze dwa są speedbar, z którymi rzekomo dobrze się bawi org-modei minimapchociaż nie korzystałem z nich, nie mogę ich osobiście ręczyć.

Najprostszą (i jednocześnie najbardziej elastyczną) opcją byłoby użycie bufora pośredniego .

W praktyce chodzisz do orgbufora, dla którego chcesz zarys, naciskasz M-x clone-indirect-buffer(użyj, C-u M-x clone-indirect-bufferjeśli chcesz kontrolować, jak nazywa się klon), a następnie bum, jest kolejna kopia bufora do użycia. Umieść ten klon w oknie lub ramce obok oryginalnego bufora i, w klonie, dostosuj kontur do własnych upodobań.

Nie zapewnia ci funkcji „kliknij na nagłówek w zarysie”, o której wspomniałeś, ale ducha paska bocznego.

Edycja: w odpowiedzi na twój komentarz, oto proste polecenie, które po wywołaniu z klonu bufora przełączy się na bufor podstawowy i przeniesie punkt tam, gdzie kursor znajdował się w klonie bufora:

(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)))))
Dan
źródło
Wypróbowałem Speedbar / Sr-Speedbar. Jest bardzo fajny, ale pokazuje tylko pierwsze 2 poziomy. Zapytałem, czy można mieć tutaj więcej poziomów: emacs.stackexchange.com/questions/9533/… Bufor pośredni jest dobrą opcją. Zastanawiam się, czy da się w jakiś sposób przesunąć kursor w drugim buforze do tej samej pozycji, co w sklonowanym buforze.
Leo Ufimtsev
Próbowałem napisać kod, który przeskakiwałby w to samo miejsce w drugim buforze, ale działa to tylko wtedy, gdy wszystko jest rozwinięte. Jeśli można sprawić, by działał tak, aby automatycznie się rozwijał, wówczas bufor klonowania jest idealnym rozwiązaniem. Post: emacs.stackexchange.com/questions/9536/…
Leo Ufimtsev
Dziękujemy za fragment kodu powyżej. Bardzo doceniam ^ _ ^.
Lew Ufimcew
16

Co powiesz na: M-x occur RET ^*+ RET(zauważ, że na końcu wyrażenia regularnego jest spacja).

Moja inna zupa to barszcz
źródło
Nie wiem, dlaczego ktoś przegłosował tę odpowiedź, myślę, że jest to właściwie całkiem fajne, bezproblemowe rozwiązanie. Jedynym dziwactwem jest to, że nie podąża za tobą. To znaczy, że nie jest to oczywiste w buforze wystąpień, w którym się znajdujesz (na przykład zaznacz bieżący nagłówek) i nie przewija się w przypadku długich długich dokumentów. Ale w przypadku małych dokumentów to działa.
Lew Ufimcew
Podoba mi się to proste, wbudowane rozwiązanie. Jeśli trzeba wyróżnić, użyj steru-wystąpienia zamiast wystąpienia. Dodatkową korzyścią jest możliwość korzystania z jednej nawigacji dla wielu buforów plików organizacji za pomocą wielu wystąpień. Na koniec, za pomocą komendy edit-edit można edytować oba widoki, widok konspektu i widok rozwinięty. W każdym razie głosuję za tym.
Emacs User,
Głosuję za tym, ponieważ jest niesamowity, prosty i wydajny
Gambo
Tak prosty. Taki mądry. Taki hackish. Niesamowite.
dangom
7

Po przeczytaniu odpowiedzi Dana i twojego opartego na niej rozwiązania, zebrałem to razem. To otwiera nowy, wąski, read-only clone na lewo od bieżącego bufora, a to wiąże <mouse-1>i RETlokalnie w klonie, aby przejść do tej pozycji w buforze bazowej.

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

Będzie to działać z outline-modea outline-minor-mode, jak również tryby, które opierają się na nich, jak np org-mode. Znalazłem informacje na temat uzyskiwania lokalnych map kluczy, ale nie wiem, jak wybrać, którą z nich skopiować. Jest też strona, która ma funkcję automatycznego ustawiania specyficznych dla bufora trybów pomocniczych do ustawiania lokalnych kluczy bufora, ale wydaje się to poza zakresem tego problemu.

blujay
źródło
1
Dziękujemy za udostępnienie tego. Dzięki użyciu outline-mode-mapzamiast org-mode-mapudało mi się sprawić, że działa AUCTeXz outline-minor-mode, co jest miłe.
Oleg Domanov
Nawiasem mówiąc, outline-modefunkcja hide-bodyukrywa wszystko oprócz nagłówków.
Oleg Domanov
@OlegDomanov Dzięki za te informacje! Poprawiłem kod, aby używać outline-mode-mapi hide-bodyoraz kilka innych drobnych usprawnień.
blujay,
2

Wreszcie zostało to zaimplementowane w pakiecie org-sidebar:

demo-sidebar-tree demo

blujay
źródło
1
Hoooray! Mam wstrząsającą konfigurację, która czasami po prostu przestaje działać, jest absolutnie genialna, jeśli jest to teraz pakiet!
Kwitnie
0

dwie propozycje niskiego czynszu (co robię) od nieprogramisty, który lubi używać aquamacs do edytora tekstu:

  1. przełączaj się tam iz powrotem za pomocą poleceń w buforze:

URUCHAMIANIE: wcięcie (aby pokazać kontur typu wodospadu, aby był lepiej widoczny jako całość)

służy to do przeglądania bufora na podstawie kart

i

+ OPCJE: H: N, gdzie N = = liczba poziomów, które chcesz zobaczyć w eksporcie HTML, co jest sugestią # 2

patrz: https://emacsclub.github.io/html/org_tutorial.html

  1. eksportuj jako html (CC CE hh), aby zobaczyć spis treści. nie mogę znaleźć nikogo, kto mógłby łatwo uzyskać tekst w formacie HTML lub tekst (CC CE ta) do wcięcia
richrat
źródło
0

Potrzebowałem czegoś podobnego, więc ustawiłem outline-toctryb . Powinno działać w przypadku dokumentów w trybie org.

abingham
źródło