comment passer directement à un titre d'organisation?

16

Si je suis dans un fichier org, je veux une commande qui restreint une liste de candidats, dans le style ivy / helm, comprenant tous les titres de l'organisation dans le fichier et me permet de choisir le titre, par le biais d'une recherche floue, vers laquelle je veux passer. à. Y-a-t-il un moyen de faire ça?

ninrod
la source

Réponses:

13

Le nœud Org Manual sur Motion donne une description quelque peu laconique de la commande intégrée org-goto(liaison par défaut:) C-c C-j, dont le comportement peut facilement être personnalisé pour obtenir l'effet souhaité:

  1. Consultez la documentation de la variable personnalisable répertoriée à la fin de ce noeud manuel: C-h v org-goto-interface RET
  2. Si vous êtes heureux de renoncer au org-gotocomportement par défaut de recherche incrémentielle dans le contour du tampon, vous pouvez passer à la sélection d'un titre via l'achèvement:

    (setq org-goto-interface 'outline-path-completion)
  3. Les utilisateurs de packages de complétion tels que ido/ ivy/ helmvoudront probablement modifier le paramètre suivant afin de voir le chemin cible entier à la fois:

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

    Voir ici pour plus de discussion.

Cette approche a l'avantage (sur l' utilisation, par exemple, la helmfonctionnalité spécifique de ) de travailler avec tous les cadres d'achèvement qui se branchent dans la valeur par défaut completing-read, y compris, comme je peux personnellement confirmer, ivy.

ADDENDA:

Lorsque vous utilisez l' outline-path-completioninterface de la org-gotocommande comme décrit dans cette réponse, la variable personnalisable org-goto-max-leveldétermine la profondeur maximale des titres à offrir.

ÉDITER:

J'ai trouvé une question plus ancienne et pertinente avec des réponses utiles: /programming//q/15011703/3084001

CLARIFICATION (comme demandé par le commentaire d'Att Righ):

La définition org-goto-interfacede l'une des deux valeurs reconnues ne signifie pas que vous sacrifiez l'interface alternative. L'appel org-gotoavec un argument préfixe (c'est-à C-u C-c C-j- dire ou C-u M-x org-goto RET) sélectionne automatiquement l'interface alternative pour l'achèvement en cours. De cette façon, vous pouvez définir org-goto-interfacel'interface que vous êtes susceptible d'utiliser le plus souvent et utiliser l'argument préfixe lorsque vous souhaitez changer temporairement de comportement. Si même cela ne répond pas à vos besoins, vous pouvez toujours écrire votre propre wrapper org-goto, selon l'exemple d'Att Righ.

Basilic
la source
> renoncez au comportement org-goto par défaut, vous pouvez contourner cela en utilisant une liaison let autour de l'appel fonctionnel(defun my-org-goto () (let ((org-goto-interface 'outline-path-completion)) (org-goto)))
Att Righ
outline-path-completionne fonctionne pas bien avec helmsur ma boîte (il ne peut pas terminer un niveau - atteint en appuyant sur <TAB>si helm est désactivé: voir helm-completing-read-handlers-alist)
Att Righ
@AttRigh Bien sûr, let-expressions peut être utilisé pour tout type de liaison temporaire; cette question concerne davantage les paramètres / fonctionnalités / packages pertinents. Une manière plus générale de réaliser un changement temporaire d'interface consiste à appeler org-gotoavec un argument préfixe. J'ajouterai une note à cette réponse.
Basil
@AttRigh Je me souviens avoir vu quelque chose de similaire avec ivy, mais uniquement lors du rechargement et avec un paramètre de profondeur incorrect org-refile-targets, car il org-gotoadapte temporairement les paramètres pertinents pour le refile en fonction de ses besoins. Malheureusement, je ne suis pas en mesure d'explorer les helmfonctionnalités pour le moment, peut-être qu'un autre utilisateur peut sonner?
Basil
1
merci @Basil pour la réponse détaillée. Malheureusement, l'achèvement de cette approche ne fonctionne pas aussi bien que worfou counsel-imenu.
ninrod
8

J'utilise le package worf , mais je ne lie qu'une seule de ses fonctions:

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

worf-goto vous donne une liste des en-têtes du tampon dans le mini tampon, que vous pouvez ensuite filtrer.

Le paquet est fait par l'auteur de lierre , donc si vous aimez le lierre, vous aimerez peut-être worf.

Quelques extraits pertinents de 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
la source
1
merci @tirocinium. counsel-imenul'achèvement fonctionne mieux que worf mais ne peut pas rechercher dans les titres des organisations de niveau 1. worfs recherche tous les niveaux, donc je pense que c'est ce que je recherche.
ninrod
@ninrod Avez-vous essayé de définir org-imenu-depthune valeur supérieure à la valeur par défaut de 2?
Sam
5

Je trouve le helm-org-rifle particulièrement agréable. Tout ce qui prend la source imenu pourra également afficher les en-têtes (par exemple, Helm avec imenu).

user673592
la source
Il convient de noter que helm-org-riflerecherche le contenu des entrées de l'organisation en plus de leurs titres. Je n'ai trouvé aucun moyen de modifier ce comportement. helm-org-rifleréférences org-search-gotoqui recherchent tous les titres mais ne prennent pas vraiment en charge la recherche floue.
Att Righ
Att Righ a raison, helm-org-riflene recherche pas uniquement les titres. Il pourrait être développé pour cela, mais il n'y a pas de raison de le faire, car helm-org-in-buffer-headings, etc. existent dans Helm lui-même.
blujay
4

imenuest intégré à Emacs et peut être associé à helm / ivy pour fournir la recherche floue requise. Je recommanderais cependant helm-org-riflesi vous utilisez la barre.

monotux
la source
4

Auto-promotion flagrante, mais vous aimerez peut-être essayer orgnav . Quel est mon type de projet alpha (mais activement utilisé par moi) à cet effet.

orgnav recherche les titres plutôt que le contenu, peut varier la profondeur de la recherche, rechercher les sous-arbres plutôt que le fichier entier (bien que cela puisse également être réalisé avec un rétrécissement).

Voici une vidéo de certaines fonctionnalités: https://asciinema.org/a/1r0fp33xgwh48lfgsh7mllw4u

Vous devriez probablement également être au courant du helm-orgpackage qui fait partie de helmce qui a été l'inspiration pour ce package (ou plutôt dont les limitations ont été l'inspiration pour ce package), ainsi que helm-org-riflediscuté dans d'autres articles.

(Gracieuseté des réponses ici: https://www.reddit.com/r/emacs/comments/69mc6l/how_to_jump_directly_to_an_orgheadline/ ) La worf-gotofonction faisant également partie d' worfun (mode de navigation organisationnelle qui applique un ensemble différent de raccourcis clavier sur "*" avant les titres). Cela semble très analogue à helm-org.

Att Righ
la source
4

La bibliothèque de swiper a une nouvelle fonctionnalité dans 0.9.0, qui est l'achèvement des titres de fichiers dans vos fichiers org-agenda.

conseils-org-agenda-titres

Il vous suffit de configurer votre liste de fichiers d'agenda dans org init.

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

En ce qui concerne la réponse de @ tirocinium, cela fournit la même chose mais pour de nombreux fichiers d'agenda.

Darryl Hebbes
la source
3

J'utilise counsel-imenu; il énumérera les différentes têtes, vous pouvez taper quelques lettres pour affiner votre sélection, puis appuyez simplement sur <return>.

gnuvince
la source
salut @gnuvince. cela ne me permet pas d'accéder directement aux fichiers org de niveau 1?
ninrod
2

Je recommande helm-org-in-buffer-headings. Il est intégré à Helm et respecte les tampons rétrécis, ce qui est important si vous utilisez des tampons indirects pour modifier les sous-arbres indépendamment. Il y a aussi helm-org-parent-headingspour naviguer dans une arborescence et helm-org-agenda-files-headingspour naviguer dans tous les fichiers d'agenda.

blujay
la source