org-refile vers un emplacement fixe connu

11

J'essaie d'écrire une fonction qui prendra un en-tête et le ré-archivera à un emplacement spécifique. Le doc pour org-refileest

(org-refile &optional GOTO DEFAULT-BUFFER RFLOC MSG)

et RFLOCest

RFLOC can be a refile location obtained in a different way.

mais je n'ai aucune idée de ce que serait "une manière différente" et je google depuis une demi-journée et je n'ai vu aucun exemple. Je connais le fichier et je connais le titre de la cible mais je ne connais pas la syntaxe pour le former en ce qu'il veut. Le plus proche que j'ai obtenu est:

(org-refile nil #("~/Org/bookmarks.org")

qui me demandera alors le titre, mais bien sûr, je ne veux pas qu'il me demande, je veux le fournir.

Je suis nouveau sur elisp et j'ai deviné toutes les syntaxes auxquelles je peux penser. Quelqu'un sait-il comment exprimer cela?

jtgd
la source
Il doit y avoir un moyen de faire ce que vous voulez réellement ici, mais si vous ne le trouvez pas, voici une solution: stackoverflow.com/questions/7681326/…
Brian Z
J'utilise l'extrait de code suivant pour faire ce que vous cherchez: (let* ( (org-archive-location "/path/to/org-file::* NAME_OF_HEADING") (org-archive-save-context-info nil)) (org-archive-subtree)) je ne mettrai probablement pas cela dans une réponse depuis que vous avez posé des questions org-refile, mais l'extrait de code fait très bien le travail. Les deux colons sont nécessaires. Je l'utilise tout le temps et j'ai même créé une version personnalisée de org-archive-subtreepour supprimer le message afin que je n'en ai pas des centaines lorsque je réorganise automatiquement tout mon fichier org.
lawlist
Merci lawlist, c'est un bel extrait et je vais probablement l'utiliser dans un autre contexte. C'est bien de l'avoir documenté ici.
jtgd

Réponses:

9

Je me suis demandé à quoi devrait ressembler le RFLOC auparavant, mais je n'ai jamais enquêté. En regardant le code source de l'organisation, il devrait s'agir d'une liste composée de:

  • titre
  • fichier
  • re (expression régulière)
  • pos (position du cap cible)

Je n'ai pas expérimenté avec l' reélément, mais voici une fonction simple qui invoquera org-refileavec un RFLOC construit à partir d'un FILE et HEADING donné:

(defun my/refile (file headline)
  (let ((pos (save-excursion
               (find-file file)
               (org-find-exact-headline-in-buffer headline))))
    (org-refile nil nil (list headline file nil pos))))

Cela ouvre le fichier cible et utilise une fonction org pour trouver la position du titre cible, puis crée la liste RFLOC vers laquelle passer org-refile.

glucas
la source
5

Merci beaucoup @glucas, j'ai travaillé votre solution dans ma dernière. L'information clé était de connaître le format du RFLOC. J'ai essayé de fournir une liste de nom de fichier et de texte de titre, mais il me manquait ces autres éléments et le néant supplémentaire. Voici ce que j'ai fini avec:

(defun jay/refile-to (file headline)
    "Move current headline to specified location"
    (let ((pos (save-excursion
                 (find-file file)
                 (org-find-exact-headline-in-buffer headline))))
      (org-refile nil nil (list headline file nil pos))))

(defun jay/refile-to-bookmarks ()
    "Move current headline to bookmarks"
    (interactive)
    (org-mark-ring-push)
    (jay/refile-to "~/Org/bookmarks.org" "New")
    (org-mark-ring-goto))

Le doc pour save-excursiondéclare que nous serons retournés à l'endroit d'où nous sommes partis, mais cela ne semble pas fonctionner de cette façon. Cela me laisse dans la destination cible, ce qui pourrait être approprié pour le général refile-to, mais je voulais simplement lui faire déplacer la ligne et rester où j'étais, alors je sauvegarde et restaure à l'intérieur refile-to-bookmark.

Le flux de travail auquel cela est destiné est que je commence par une liste de liens HTML provenant de mon script pour lire les flux RSS. À l'origine, le script avait produit des fichiers maildir pour mu4e, mais je me suis quand même contenté de suivre les liens vers un navigateur, puis de mettre en signet ceux qui m'intéressaient, alors maintenant je génère simplement une liste de ** [[uri][title]]lignes. Après avoir suivi le lien emacs vers le navigateur uzbl, au lieu de créer un signet (qui génère la même forme de lignes), j'utilise cette commande pour déplacer le lien vers mon bookmarks.org après avoir défini des balises. Juste un peu plus vite puisque j'utilise également les commandes de vitesse org, tpour marquer et bpour cette commande. Je suis heureux maintenant et j'adore en savoir plus!

jtgd
la source
Quelques détails, sans rapport direct avec ce que vous faites ici: le premier élément du RFLOC peut en fait être n'importe quelle chaîne. Il est uniquement utilisé comme nom logique pour l'emplacement cible, indiqué dans le message "refiled to xxx". L'emplacement est vraiment juste défini par le fichier et le marqueur de position. Pour reautant que je sache, l'élément du RFLOC sera ignoré. Il est utilisé dans quelques autres fonctions dans org.el qui traitent des emplacements cibles.
glucas
1
Pour des raisons que je ne comprends pas, je suis en mesure d'obtenir votre refile-tofonction de retour à la position initiale en ajoutant ceci à la fin, après le let: (switch-to-buffer (current-buffer)). Il semble que cela ne devrait rien faire, mais cela fonctionne pour moi.
glucas
Merci encore @glucas. Oui, cela semble fonctionner et j'ai remplacé mon -pushet -gotopar ça. Il semble étrange que vous soyez laissé dans un autre tampon et pourtant il considère que le tampon actuel est le précédent.
jtgd