emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[O] company-mode completions for noweb references


From: Nik Clayton
Subject: [O] company-mode completions for noweb references
Date: Tue, 6 Nov 2018 19:32:20 +0100

Hoi,

I've been writing a few things using Org where I'm making frequent use of noweb references in SRC blocks, and decided that completion would be handy for them.

This function will complete "^<<" with a list of the defined named blocks in the current file, if you're in a SRC block.

It could be made smarter (e.g., only offer the completion if ":noweb yes" is set, only offer to complete from named blocks with the same language as the current block), but I thought I'd throw it out here in case anyone else finds it useful.

Best, N

(defun my/org-src-block-name-backend (command &optional arg &rest ignored)
  "Complete `<<' with the names of defined SRC blocks."
  (interactive (list 'interactive))
  (cl-case command
    (interactive (company-begin-backend 'my/org-src-block-name-backend))
    (init (require 'org-element))
    (prefix (and (eq major-mode 'org-mode)
         (eq 'src-block (car (org-element-at-point)))
         (cons (company-grab-line "^<<\\(\\w*\\)" 1) t)))
    (candidates
     (org-element-map (org-element-parse-buffer) 'src-block
       (lambda (src-block)
     (let ((name (org-element-property :name src-block)))
       (when name
         (propertize
          name
          :value (org-element-property :value src-block)
          :annotation (org-element-property :raw-value (org-element-lineage src-block '(headline)))))))))
    (sorted t)            ; Show candidates in same order as doc
    (ignore-case t)
    (duplicates nil)               ; No need to remove duplicates
    (post-completion               ; Close the reference with ">>"
     (insert ">>"))
    ;; Show the contents of the block in a doc-buffer. If you have
    ;; company-quickhelp-mode enabled it will show in a popup
    (doc-buffer (company-doc-buffer (get-text-property 0 :value arg)))
    (annotation (format " [%s]" (get-text-property 0 :annotation arg)))))

(add-to-list 'company-backends 'my/org-src-block-name-backend)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]