Wie kann ich Links im Organisationsmodus manuell festlegen?

7

Ich versuche also, einen "Autolinks-Modus" zu erstellen, um die Funktionalität von Notetaking-Software wie Tomboy Notes oder notes.vim zu emulieren, die automatisch jeden Text verknüpft, der zufällig der Titel einer Notiz ist. Aber ich bin völlig neu bei Emacs und Elisp. Dies ist, was ich bisher habe (es ist wie das erste Elisp, das ich jemals geschrieben habe, sei sanft):

;; Set directory of files to search for *.org files 
(setq autolinks-mode-dir "~/Dropbox/Org/")

;; Get all .org files in this directory. 
(setq autolinks-mode-files (directory-files autolinks-mode-dir t "[.]org\\'"))

;; Convert it to a list of just the filenames, without paths.
(setq autolinks-mode-files-bare
      (mapcar 'file-name-nondirectory autolinks-mode-files))

;; Strip extensions
(setq autolinks-mode-topics
      (mapcar 'file-name-sans-extension autolinks-mode-files-bare))

So weit, ist es gut. Jetzt habe ich eine Liste von Themen und eine Liste der entsprechenden Dateien. Das Thema "James" entspricht beispielsweise einer Organisationsdatei unter "/path/to/notes/James.org". Jetzt möchte ich die Liste der Links von Organisationen für einen bestimmten Puffer manuell mit dieser Liste von Themen aktualisieren, sodass beim Aktivieren dieses Modus jede Instanz des Wortes "James" in einem Organisationspuffer hervorgehoben und zu einem Link zu gemacht wird /path/to/notes/James.org. Gleiches gilt für eine mehrwortige Organisationsdatei wie "Henry James", auf die verwiesen wird /path/to/notes/Henry James.org. Beachten Sie, dass ich nicht alle Instanzen zu ersetzen versuchen , Jamesmit [[James]]oder <James>oder etwas, nur versuchen , diese Textausschnitte zu bekommen verhalten als Links.

Ich habe org.el durchsucht und diese Variable gesehen:

(defvar org-link-re-with-space nil
  "Matches a link with spaces, optional angular brackets around it.")

Was in meinem System alle möglichen Dinge enthält, wahrscheinlich aufgrund von org-ref und anderen Dingen:

org-link-re-with-space is a variable defined in ‘org.el’.
Its value is
"<?\\(A\\(?:cp?\\|utocite[*s]?\\)\\|Cite\\(?:a\\(?:l[pt]\\|uthor\\*?\\)\\|[pst]\\)?\\|Gls\\(?:pl\\)?\\|Notecite\\|P\\(?:arencites?\\|notecite\\)\\|Smartcites?\\|Textcites?\\|a\\(?:c\\(?:p\\|r\\(?:full\\|long\\|short\\)\\)?\\|ddbibresource\\|uto\\(?:cite[*s]?\\|ref\\)\\)\\|b\\(?:bdb\\|ib\\(?:entry\\|liography\\(?:style\\)?\\|tex\\)\\)\\|cite\\(?:a\\(?:l\\(?:[pt]\\*\\|[pt]\\)\\|uthor\\*?\\)\\|date\\*?\\|num\\|p\\*\\|t\\(?:\\*\\|ext\\|itle\\*?\\)\\|url\\|year\\*?\\|[*pst]\\)?\\|do\\(?:cview\\|i\\)\\|e\\(?:l\\(?:feed\\|isp\\)\\|qref\\)\\|f\\(?:ile\\(?:\\+\\(?:\\(?:emac\\|sy\\)s\\)\\)?\\|notecite\\|oot\\(?:cite\\(?:s\\|texts?\\)?\\|fullcite\\)\\|tp\\|ullcite\\)\\|g\\(?:ls\\(?:desc\\|link\\|\\(?:p\\|symbo\\)l\\)?\\|nus\\)\\|h\\(?:elp\\|ttps?\\)\\|i\\(?:n\\(?:dex\\|fo\\)\\|pynb\\|rc\\)\\|l\\(?:abel\\|ist-of-\\(?:\\(?:figur\\|tabl\\)es\\)\\)\\|m\\(?:ailto\\|\\(?:essag\\|h\\|u4\\)e\\)\\|n\\(?:ameref\\|ews\\|o\\(?:bibliography\\|\\(?:te\\)?cite\\)\\)\\|orgit\\(?:-\\(?:log\\|rev\\)\\)?\\|p\\(?:a\\(?:geref\\|rencite[*s]?\\)\\|notecite\\|rint\\(?:bibliography\\|index\\)\\)\\|r\\(?:ef\\|mail\\)\\|s\\(?:hell\\|martcites?\\|upercites?\\)\\|textcites?\\|w3m\\):\\([^]    

Es scheint also, dass Org die Funktionalität hat, einfachen Text als Link hervorzuheben. Ich weiß einfach nicht, wie ich es am besten machen soll. Ich denke, ich kann meine Liste der Linkwörter org-link-re-with-spacevielleicht anhängen ? Aber wie setze ich dann ihre Ziele? Jede Hilfe wäre sehr dankbar.

Jonathan
quelle
Sie können hierfür wahrscheinlich keine org-Links verwenden. Es hört sich so an, als ob Sie die Schriftsperre verwenden möchten, um das gewünschte Verhalten zu erzielen. Vielleicht finden Sie hier Inspiration. Kitchingroup.cheme.cmu.edu/blog/2015/06/22/… . Insbesondere die Verwendung von Button-Lock-Set-Button, um einige Muster anklickbar zu machen.
John Kitchin
Ich bin nicht sicher, ob ich vollständig verstehe, was Sie versuchen, aber warum nicht einfach alle Vorkommen von Jamesdurch [[file:/path/to/notes/James.org][James]]im Puffer ersetzen . Dann wird es als Link angezeigt, wenn sich der Puffer im org-modeHauptmodus befindet.
Håkon Hægland
1
Die Idee ist nicht, neue Links zu erstellen, sondern automatisch Links für jeden Dateinamen zu emulieren. Auf diese Weise kann ich James.org löschen, seinen Namen ändern und muss mich nicht um die Aktualisierung des Links kümmern. Hartes Verknüpfen ist im Vergleich zum automatischen Verknüpfen albern.
Jonathan

Antworten:

1

Ich glaube, das ist im Wesentlichen das, was Sie wollen:

;; Set directory of files to search for *.org files
(setq autolinks-mode-dir "/Users/jkitchin/vc/journal/2018/08/07/")

;; Get all .org files in this directory.
(setq autolinks-mode-files (directory-files autolinks-mode-dir t "[.]org\\'"))

;; Convert it to a list of just the filenames, without paths.
(setq autolinks-mode-files-bare
      (mapcar 'file-name-nondirectory autolinks-mode-files))

;; Strip extensions
(setq autolinks-mode-topics
      (mapcar 'file-name-sans-extension autolinks-mode-files-bare))

(button-lock-set-button
 (regexp-opt autolinks-mode-topics)
 (lambda (event)
   (interactive "e")
   (let ((click-pos (posn-point (event-end event))))
     (save-mark-and-excursion
      (save-match-data
    ;; This is clunky, but with grouping the properties may not extend to
    ;; the whole regexp, e.g. if you set properties on a subgroup.
    (goto-char (previous-single-property-change click-pos
                            'button-lock))
    ;; now make sure we see it again to get the match-data
    (while (not (looking-at (regexp-opt autolinks-mode-topics)))
      (backward-char))
    (find-file (expand-file-name
            (concat (match-string 0) ".org")
            autolinks-mode-dir))))))
 :face (list 'org-link))

Sie können dies in eine Funktion einbetten und dann in einem org-mode-hook aufrufen und den button-lock-mode aktivieren. Dadurch sollten Ihre Themen wie Links aussehen, und wenn Sie darauf klicken, wird die Datei geöffnet. Ein möglicher Schluckauf ist die Reihenfolge, in der die Themen durchsucht werden. Sie möchten sicherstellen, dass "Henry James" vor James durchsucht wird. Dies kann eine Sortierung nach Länge oder Ähnlichem erfordern.

John Kitchin
quelle