Wie kann ich eine Organisationsstruktur in einem zweiten Puffer als dynamisches Inhaltsverzeichnis abrufen?


25

Wenn ich große Dokumente bearbeite, möchte ich sehen, wo ich mich gerade befinde, indem ich die Gliederung (ohne Inhalt) in einem separaten Puffer sehe. Wie beim Lesen einer PDF-Datei befindet sich links ein Inhaltsverzeichnis. (siehe unten)

Im org-Modus ist es möglich, die Gliederung zu erweitern / zu reduzieren. Ist es jedoch möglich, einen statischen Umriss links (oder rechts) in einem separaten Puffer zu haben, sodass der andere Puffer an diese Position verschoben wird, wenn Sie auf die Überschriften klicken?

Irgendwie gefällt das aber für den Org-Modus? Bildbeschreibung hier eingeben

[Bearbeiten]
Das clone-indirect-bufferist sehr nah an dem was ich will. Das fehlende Teil des Puzzles ist, zum selben Ort zu springen, wenn Sie auf eine Überschrift / (oder einen beliebigen Punkt) klicken.

Dazu habe ich versucht, einen Code zu schreiben: In einen anderen geklonten Puffer an den gleichen Punkt verschieben? (Position der indirekten Puffer synchronisieren) (org-mode)

Es funktioniert jedoch nicht, wenn der Inhalt reduziert ist. Wenn das funktioniert, ist der Clone-Inderect-Buffer eine vollständige Lösung für dieses Problem.

[Edit2 Solution]
Der Code im Link oben und in der Antwort unten kombiniert nett, um das Hin und Her zu lösen.

;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
Vielleicht versuchen C-c C-x boder org-tree-to-indirect-buffer.
Samuel Flint

@SWFlint Nach einem kurzen Test sieht es so aus, als würde es etwas anderes tun als das, was das OP will: Es kopiert den aktuellen Teilbaum in einen indirekten Puffer. Was wir brauchen würden, wäre org-sparse-tree-to-indirect-bufferzum Beispiel eine Funktion, die aber nicht zu existieren scheint.
T. Verron

Nachdem Sie ein wenig weiter geschaut haben, versuchen Sie etwas in der Art von Org-Scheiben
Samuel Flint,

Ich denke, es ist auch erwähnenswert, Imenu-Liste . Es fehlen einige der Anforderungen, aber es werden andere angesprochen.
Glühbirne

org-tree-to-indirect-buffer ist großartig.
Ninrod

Antworten:


9

Ein paar Optionen kommen in den Sinn. Die ersten beiden sind speedbar, was angeblich gut mitspielt org-mode, und minimapobwohl ich sie nicht benutzt habe, kann ich nicht für sie persönlich bürgen.

Die einfachste (und auch flexibelste) Möglichkeit wäre die Verwendung eines indirekten Puffers .

In der Praxis würden Sie zu dem orgPuffer gehen, für den Sie eine Gliederung wünschen, drücken M-x clone-indirect-buffer(verwenden C-u M-x clone-indirect-bufferSie, wenn Sie steuern möchten, wie der Klon heißt) und dann boom, es gibt eine weitere Kopie des Puffers, die Sie verwenden können. Legen Sie diesen Klon neben dem ursprünglichen Puffer in ein Fenster oder einen Rahmen und passen Sie den Umriss im Klon Ihren Wünschen an.

Sie erhalten nicht die von Ihnen erwähnte Funktion "Überschrift anklicken", sondern den Geist der Seitenleiste.

Bearbeiten: Als Antwort auf Ihren Kommentar folgt ein einfacher Befehl, der beim Aufrufen aus dem Pufferklon in den Basispuffer wechselt und den Punkt dorthin verschiebt, wo sich der Cursor im Pufferklon befand:

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

Ich habe Speedbar / Sr-Speedbar ausprobiert. Es ist sehr schön, aber es zeigt nur die ersten 2 Ebenen. Ich habe gefragt, ob es möglich ist, hier mehr Ebenen zu haben: emacs.stackexchange.com/questions/9533/… Der indirekte Puffer ist eine nette Option. Ich frage mich, ob es irgendwie möglich ist, den Cursor im anderen Puffer an dieselbe Position wie im geklonten Puffer zu bewegen.
Leo Ufimtsev

Ich habe versucht, Code zu schreiben, der an dieselbe Stelle im anderen Puffer springt, aber es funktioniert nur, wenn alles erweitert ist. Wenn es so funktioniert, dass es sich automatisch ausdehnt, ist der Klonpuffer die perfekte Lösung. Beitrag: emacs.stackexchange.com/questions/9536/…
Leo Ufimtsev

Vielen Dank für den obigen Codeausschnitt. Sehr geschätzt ^ _ ^.
Leo Ufimtsev

16

Wie wäre es mit: M-x occur RET ^*+ RET(Beachten Sie, dass am Ende des regulären Ausdrucks ein Leerzeichen steht).


Ich weiß nicht, warum jemand diese Antwort abgelehnt hat. Ich denke, dies ist tatsächlich eine ziemlich ordentliche, problemlose Lösung. Das einzige Manko ist, dass es dir nicht folgt. Das heißt, es ist nicht offensichtlich, wo Sie sich im Puffer befinden (markieren Sie beispielsweise die aktuelle Überschrift), und es wird kein Bildlauf für lange lange Dokumente ausgeführt. Aber für kleine Dokumente funktioniert es.
Leo Ufimtsev

Ich mag diese einfache, integrierte Lösung. Wenn eine Hervorhebung erforderlich ist, verwenden Sie helm-happen anstelle von happen. Ein zusätzlicher Vorteil besteht darin, dass eine einzige Navigation für mehrere Organisationsdateipuffer verwendet werden kann, indem mehrere Vorkommen verwendet werden. Zuletzt kann man mit happen-edit beide Ansichten, die Gliederungsansicht und die erweiterte Ansicht, bearbeiten. Auf jeden Fall stimme ich dem zu.
Emacs User

Ich werde dem zustimmen, weil es großartig, einfach und effizient ist
Gambo

So einfach. So klug. So hackisch. So genial.
1.

7

Nachdem ich Dans Antwort und Ihre darauf basierende Lösung gelesen habe, habe ich diese zusammengestellt. Es öffnet einen neuen, schmalen Nur-Lese-Klon links vom aktuellen Puffer und bindet <mouse-1>und RETlokal im Klon, um an diese Position im Basispuffer zu springen.

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

Dies funktioniert sowohl mit outline-modeund outline-minor-modeals auch mit darauf aufbauenden Modi wie org-mode. Ich habe einige Informationen zum Abrufen der lokalen Schlüsselkarten gefunden, weiß aber nicht, wie ich die zu kopierende auswählen soll. Es gibt auch diese Seite, die über eine Funktion verfügt, um automatisch pufferspezifische Nebenmodi zum Festlegen von lokalen Pufferschlüsseln zu erstellen. Dies scheint jedoch für dieses Problem nicht relevant zu sein.


1
Vielen Dank für das Teilen. Durch die Verwendung outline-mode-mapanstelle von org-mode-mapich es geschafft, um es arbeiten für AUCTeXmit outline-minor-mode, was schön ist.
Oleg Domanov

Die outline-modeFunktion des hide-bodyversteckt übrigens alles außer Überschriften.
Oleg Domanov

@OlegDomanov Danke für diese Info! Ich habe den Code verbessert, um das outline-mode-mapund zu verwenden hide-body, und ein paar kleinere Verbesserungen.
blujay

2

Schließlich wurde dies in das Paket implementiert org-sidebar:

org-sidebar-tree-Demo


1
Hoooray! Ich habe ein wackeliges Setup, das manchmal einfach nicht mehr funktioniert. Es ist absolut BRILLIANT, wenn es jetzt ein Paket ist!
Am

0

Zwei Vorschläge für niedrige Mieten (was ich mache) von einem Nicht-Programmierer, der gerne Aquamacs für den Texteditor verwendet:

  1. Mit In-Buffer-Befehlen vor und zurück schalten:

STARTUP: Einzug (um den Umriss des Wasserfalltyps als Ganzes besser sehen zu können)

Dies dient zur tabulatorgesteuerten Anzeige des Puffers

und

+ OPTIONEN: H: N, wobei N = = die Anzahl der Ebenen, die beim HTML-Export angezeigt werden sollen (Vorschlag 2)

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

  1. Als HTML exportieren (CC CE hh), um das Inhaltsverzeichnis zu sehen. Ich kann niemanden finden, der leicht die Textausgabe von HTML oder Text (CC CE ta) zum Einrücken bringen kann

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.