Làm cách nào tôi có thể tự đặt liên kết trong chế độ org?


7

Vì vậy, tôi đang cố gắng tạo một "chế độ tự động nhấp nháy" để mô phỏng chức năng của phần mềm ghi chú như Tomboy Notes hoặc Notes.vim, tự động liên kết bất kỳ văn bản nào là tiêu đề của ghi chú. Nhưng tôi hoàn toàn mới với Emacs và Elisp. Đây là những gì tôi có cho đến nay (nó giống như cuốn sách đầu tiên tôi từng viết, hãy nhẹ nhàng):

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

Càng xa càng tốt. Bây giờ II có một danh sách các chủ đề và một danh sách các tệp tương ứng. Ví dụ: chủ đề "James" tương ứng với tệp org tại "/path/to/notes/James.org". Bây giờ tôi muốn cập nhật thủ công danh sách liên kết của org cho một bộ đệm cụ thể với danh sách chủ đề này, do đó, khi tôi bật chế độ này, nó làm nổi bật bất kỳ trường hợp nào của từ "James" trong bộ đệm org và biến nó thành liên kết đến /path/to/notes/James.org. Tương tự với tệp org nhiều từ, như "Henry James", sẽ trỏ đến /path/to/notes/Henry James.org. Lưu ý rằng tôi không cố gắng để thay thế tất cả các trường hợp James[[James]]hay <James>hoặc một cái gì đó, chỉ cần cố gắng để có được những đoạn văn bản để cư xử như liên kết.

Tôi đã duyệt qua org.el và tôi thấy biến này:

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

Mà trong hệ thống của tôi có tất cả các loại công cụ trong đó, có thể là do org-ref và những thứ khác:

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

Vì vậy, có vẻ như Org có chức năng để có thể làm nổi bật văn bản đơn giản dưới dạng một liên kết. Tôi chỉ không biết cách tốt nhất để làm điều đó. Tôi nghĩ rằng tôi có thể nối thêm danh sách các từ liên kết của tôi vào org-link-re-with-space, có thể? Nhưng làm thế nào để tôi đặt mục tiêu của họ? Bất kì sự trợ giúp nào đều được đánh giá cao.


Bạn có thể không thể sử dụng liên kết org cho việc này. Có vẻ như bạn muốn sử dụng khóa phông chữ để có được hành vi bạn muốn. Bạn có thể tìm thấy một số nguồn cảm hứng ở đây kitchingroup.cheme.cmu.edu/blog/2015/06/22/ . Cụ thể là việc sử dụng nút khóa-khóa-nút để làm cho một số mẫu có thể nhấp.
John Kitchin

Tôi không chắc là tôi hiểu hoàn toàn những gì bạn đang cố gắng để làm, nhưng tại sao không chỉ thay thế tất cả lần xuất hiện của James[[file:/path/to/notes/James.org][James]]trong bộ đệm. Sau đó, nó sẽ xuất hiện dưới dạng một liên kết nếu bộ đệm ở org-modechế độ chính.
Håkon Hægland

1
Ý tưởng không phải là tạo liên kết mới, mà là tự động mô phỏng các liên kết cho bất kỳ tên tệp nào. Bằng cách đó, tôi có thể xóa James.org, thay đổi tên của nó và không phải lo lắng về việc cập nhật liên kết. Liên kết cứng là ngớ ngẩn so với autolinking.
Jonathan

Câu trả lời:


1

Tôi tin rằng đây thực chất là những gì bạn muốn:

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

Bạn có thể nhúng nó vào một chức năng, sau đó gọi nó trong hook-mode-hook và bật chế độ khóa nút. Điều đó sẽ làm cho các chủ đề của bạn trông giống như các liên kết và khi bạn nhấp vào chúng, nó sẽ mở tệp. Một trục trặc có thể là thứ tự mà các chủ đề được tìm kiếm. Bạn muốn chắc chắn rằng "Henry James" được tìm kiếm trước James, có thể sắp xếp theo chiều dài hoặc thứ gì đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.