Wie springe ich direkt zu einer Org-Überschrift?

15

Wenn ich mich in einer Organisationsdatei befinde, möchte ich einen Befehl, der eine Kandidatenliste im Efeu / Helm-Stil einschränkt, die alle Organisationsüberschriften in der Datei enthält, und mir die Wahl der Überschrift durch Fuzzy-Suche ermöglicht, zu der ich springen möchte zu. Gibt es eine Möglichkeit, das zu tun?

Ninrod
quelle

Antworten:

13

Der Org Manual-Knoten in Motion enthält eine etwas lakonische Beschreibung des integrierten Befehls org-goto(Standardbindung:) C-c C-j, dessen Verhalten leicht angepasst werden kann, um den gewünschten Effekt zu erzielen:

  1. Überprüfen Sie die Dokumentation der anpassbaren Variablen, die am Ende dieses Handbuchknotens aufgeführt ist: C-h v org-goto-interface RET
  2. Wenn Sie das Standardverhalten org-gotodes inkrementellen Durchsuchens der Pufferkontur gerne aufgeben möchten, können Sie nach Abschluss des Vorgangs zum Auswählen einer Überschrift wechseln:

    (setq org-goto-interface 'outline-path-completion)
  3. Benutzer - of - Completion - Pakete wie ido/ ivy/ helmwird wahrscheinlich will die folgende Einstellung ändern , um den gesamten Zielpfad auf einmal zu sehen:

    (setq org-outline-path-complete-in-steps nil)

    Weitere Informationen finden Sie hier .

Dieser Ansatz hat den zusätzlichen Vorteil (über mit, sagen wir, helm-spezifische Funktionen) der mit allen Abschluss - Frameworks , dass Stecker in die Standardarbeits completing-read, einschließlich, wie ich kann persönlich bestätigen, ivy.

NACHTRAG:

Wenn Sie die in dieser Antwort beschriebene outline-path-completionSchnittstelle zum org-gotoBefehl verwenden, bestimmt die anpassbare Variable org-goto-max-leveldie maximale Tiefe der angebotenen Überschriften.

BEARBEITEN:

Ich habe eine ältere, relevante Frage mit nützlichen Antworten gefunden: /programming//q/15011703/3084001

ERKLÄRUNG (wie in Att Righs Kommentar gefordert):

Das Einstellen org-goto-interfaceeines der beiden erkannten Werte bedeutet nicht, die alternative Schnittstelle zu opfern. Durch Aufrufen org-gotomit einem Präfix-Argument (dh C-u C-c C-joder C-u M-x org-goto RET) wird automatisch die alternative Schnittstelle für die aktuelle Vervollständigung ausgewählt. Auf diese Weise können Sie org-goto-interfacedie Schnittstelle festlegen , die Sie wahrscheinlich am häufigsten verwenden, und das Präfix-Argument verwenden, wenn Sie das Verhalten vorübergehend ändern möchten. Wenn auch dies nicht Ihren Anforderungen entspricht, können Sie immer einen eigenen Wrapper schreiben org-goto, wie im Beispiel von Att Righ beschrieben.

Basilikum
quelle
> Verzichten Sie auf das standardmäßige org-goto-Verhalten. Sie können dies umgehen, indem Sie eine let-Bindung für den Funktionsaufruf verwenden(defun my-org-goto () (let ((org-goto-interface 'outline-path-completion)) (org-goto)))
Att Righ
outline-path-completionspielt nicht gut mit helmmeiner Box (es kann nicht über ein Level hinaus abgeschlossen werden - erreicht durch Drücken von, <TAB>wenn helm deaktiviert: siehe helm-completing-read-handlers-alist)
Att Righ
@AttRigh Sicher, let-Ausdrücke können für jede Art von temporärer Bindung verwendet werden. In dieser Frage geht es mehr um relevante Einstellungen / Funktionen / Pakete. Eine allgemeinere Möglichkeit, einen temporären Wechsel der Schnittstelle zu erreichen, besteht darin, org-gotoein Präfixargument aufzurufen . Ich werde dieser Antwort eine Notiz hinzufügen.
Basil
@AttRigh Ich erinnere mich, dass ich etwas Ähnliches mit gesehen habe ivy, aber nur beim Nachfüllen und mit einer falschen Tiefeneinstellung org-refile-targets, da die für org-gotodas Nachfüllen relevanten Einstellungen vorübergehend an seine Bedürfnisse angepasst werden. Leider bin ich im helmMoment nicht in der Lage, die Funktionalität zu erkunden , vielleicht kann sich ein anderer Benutzer einschalten?
Basil
1
danke @Basil für die detaillierte Antwort. Leider funktioniert die Vervollständigung in diesem Ansatz nicht so gut wie worfoder counsel-imenu.
8.
8

Ich benutze das Paket worf , binde aber nur eine seiner Funktionen:

 (use-package worf
    :diminish worf-mode
    :bind (:map org-mode-map ("C-c h" . worf-goto)))

worf-goto gibt Ihnen eine Liste der Überschriften im Puffer im Minipuffer, die Sie dann filtern können.

Das Paket wird vom Autor gemacht ivy , wenn Sie also wie Efeu, die Sie mögen worf könnten.

Einige relevante Ausschnitte aus worf.el:

;;  - "g" (`worf-goto'): select an outline in the current buffer, with
;;    completion.  It's very good when you want to search/navigate to
;;    a heading by word or level. See https://github.com/abo-abo/lispy
;;    for a package that uses this method to navigate Lisp code.

(defun worf-goto-action (x)
  (with-ivy-window
    (goto-char (cdr x))
    (outline-show-children 1000)
    (worf-more)))

(defun worf-goto ()
  "Jump to a heading with completion."
  (interactive)
  (let ((cands (worf--goto-candidates)))
    (cond ((eq worf-completion-method 'helm)
           (require 'helm-multi-match)
           (let (helm-update-blacklist-regexps
                 helm-candidate-number-limit)
             (helm :sources
                   `((name . "Headings")
                     (candidates . ,cands)
                     (action . worf-goto-action)
                     (pattern-transformer . worf--pattern-transformer)))))
          ((eq worf-completion-method 'ivy)
           (ivy-read "Heading: " cands
                     :action 'worf-goto-action)))))
Tirocinium
quelle
1
danke @tirocinium. counsel-imenuDie Vervollständigung funktioniert besser als WORF, kann jedoch nicht in den Überschriften der Organisationsebene 1 suchen. worfs durchsucht alle Ebenen, also denke ich, dass dies das ist, wonach ich suche.
8.
@ninrod Haben Sie versucht, einen Wert festzulegen, der org-imenu-depthüber dem Standardwert von 2 liegt?
Sam
5

Ich finde das Ruderorggewehr besonders schön. Auch alles, was imenu source benötigt, kann Header anzeigen (zB Helm mit imenu).

user673592
quelle
Es ist zu beachten, dass zusätzlich zu den Titeln auch helm-org-rifleder Inhalt von Organisationseinträgen durchsucht wird . Ich habe keine Möglichkeit gefunden, dieses Verhalten zu ändern. helm-org-rifleReferenzen, org-search-gotodie alle Überschriften durchsuchen, aber die Fuzzy-Suche nicht wirklich unterstützen.
Att Righ
Att Righ ist richtig, helm-org-riflesucht nicht nur nach Überschriften. Es könnte erweitert werden, um dies zu tun, aber es gibt wenig Grund, dies zu tun, da helm-org-in-buffer-headingsusw. in Helm selbst existieren.
blujay
4

imenuist in Emacs integriert und kann mit Helm / Efeu kombiniert werden, um die erforderliche Fuzzy-Suche zu ermöglichen. Ich würde empfehlen, helm-org-riflewenn Sie jedoch Helm verwenden.

Monotux
quelle
4

Offensichtliche Eigenwerbung, aber Sie möchten vielleicht orgnav ausprobieren . Welches ist meine Art von Alpha-Projekt (aber von mir aktiv genutzt) für diesen Zweck.

orgnav sucht eher nach Überschriften als nach Inhalten, kann die Suchtiefe variieren, sucht eher nach Teilbäumen als nach der gesamten Datei (obwohl dies auch mit einer Verengung erreicht werden kann).

Hier ist ein Video mit einigen Funktionen: https://asciinema.org/a/1r0fp33xgwh48lfgsh7mllw4u

Sie sollten sich wahrscheinlich auch des helm-orgPakets bewusst sein , dessen Bestandteil helmdie Inspiration für dieses Paket war (bzw. dessen Einschränkungen die Inspiration für dieses Paket waren) und helm-org-rifledas in anderen Posts diskutiert wurde.

(Mit freundlicher Genehmigung von Antworten hier: https://www.reddit.com/r/emacs/comments/69mc6l/how_to_jump_directly_to_an_orgheadline/ ) Möglicherweise ist auch die worf-gotoFunktion als Teil von worf(einem Organisationsnavigationsmodus, für den ein anderer Satz von Tastenkombinationen angewendet wird ) von Interesse "*" vor Überschriften). Dies scheint sehr ähnlich zu sein helm-org.

Att Righ
quelle
4

Die Swiper- Bibliothek verfügt in 0.9.0 über eine neue Funktion, die das Vervollständigen der Überschriften von Dateien in Ihren Organigrammdateien ermöglicht.

counsel-org-agenda-schlagzeilen

Sie müssen lediglich Ihre Agenda-Dateiliste in org init einrichten.

(setq org-agenda-files (list "~/org/work.org"
                             "~/org/school.org" 
                             "~/org/home.org"))

In Bezug auf die Antwort von @ tirocinium liefert dies dasselbe, jedoch für viele Agenda-Dateien.

Darryl Hebbes
quelle
3

Ich benutze counsel-imenu; Es werden die verschiedenen Köpfe aufgelistet. Sie können einige Buchstaben eingeben, um Ihre Auswahl einzugrenzen, und dann einfach drücken <return>.

Gnuvince
quelle
hi @gnuvince. dies erlaubt mir nicht, zu Level 1-Organisationsdateien zu springen, oder?
Donnerstag,
2

Ich empfehle helm-org-in-buffer-headings. Es ist in Helm integriert und berücksichtigt verengte Puffer. Dies ist wichtig, wenn Sie indirekte Puffer verwenden, um Teilbäume unabhängig voneinander zu bearbeiten. Es gibt auch Funktionen helm-org-parent-headingszum Navigieren in einem Baum und helm-org-agenda-files-headingszum Navigieren in allen Agenda-Dateien.

blujay
quelle