Como posso definir links manualmente no modo organizacional?


7

Então, estou tentando criar um "modo de autolinks" para emular a funcionalidade de software de anotação como o Tomboy Notes ou o notes.vim, que vincula automaticamente qualquer texto que seja o título de uma anotação. Mas sou totalmente novo no Emacs e no Elisp. Isto é o que eu tenho até agora (é como o primeiro elisp que eu já escrevi, seja gentil):

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

Por enquanto, tudo bem. Agora eu tenho uma lista de tópicos e uma lista de arquivos correspondentes. Por exemplo, o tópico "James" corresponde a um arquivo organizacional em "/path/to/notes/James.org". Agora, eu quero atualizar manualmente a lista de links da organização para um buffer específico com esta lista de tópicos, para que, quando eu ative este modo, destaque qualquer instância da palavra "James" em um buffer da organização e faça dele um link para /path/to/notes/James.org. O mesmo com um arquivo organizacional com várias palavras, como "Henry James", que apontaria para /path/to/notes/Henry James.org. Observe que não estou tentando substituir todas as instâncias de Jamescom [[James]]ou <James>ou algo, apenas tentando fazer com que esses trechos de texto se comportem como links.

Eu estive navegando no org.el e vi esta variável:

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

Que no meu sistema tem todos os tipos de coisas, provavelmente devido ao org-ref e outras coisas:

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\\):\\([^]    

Portanto, parece que a Org possui a funcionalidade para destacar o texto sem formatação como um link. Só não sei a melhor maneira de fazê-lo. Acho que posso anexar minha lista de palavras de link org-link-re-with-space, talvez? Mas então, como faço para definir suas metas? Qualquer ajuda seria muito apreciada.


Você provavelmente não pode usar links de organização para isso. Parece que você deseja usar o bloqueio de fonte para obter o comportamento desejado. Você pode encontrar alguma inspiração aqui kitchingroup.cheme.cmu.edu/blog/2015/06/22/… . Em particular, o uso do botão lock-set-button para tornar alguns padrões clicáveis.
John Kitchin

Não sei se entendi completamente o que você está tentando fazer, mas por que não substituir apenas todas as ocorrências de Jamescom [[file:/path/to/notes/James.org][James]]no buffer. Em seguida, ele aparecerá como um link se o buffer estiver no org-modemodo principal.
Håkon Hægland

11
A idéia não é criar novos links, mas simular automaticamente os links para qualquer nome de arquivo. Dessa forma, eu posso excluir o James.org, alterar seu nome e não precisar me preocupar em atualizar o link. A vinculação física é tola em comparação com a vinculação automática.
Jonathan

Respostas:


1

Acredito que isso é essencialmente o que você deseja:

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

Você pode incorporar isso em uma função e chamá-lo em um gancho no modo organizacional e ativar o modo de bloqueio de botão. Isso deve fazer com que seus tópicos pareçam links e, quando você clicar neles, abrirá o arquivo. Um possível soluço é a ordem em que os tópicos são pesquisados. Você deseja garantir que "Henry James" seja pesquisado antes de James, o que pode levar a uma ordenação por comprimento ou algo assim.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.