add facility for browsing documentation
This commit is contained in:
parent
2e6309d2e2
commit
37541b27ce
@ -22,10 +22,18 @@
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'thingatpt)
|
||||
(require 'url-parse)
|
||||
|
||||
(defgroup systemd ()
|
||||
"Major mode for editing systemd units."
|
||||
:group 'tools)
|
||||
|
||||
(defcustom systemd-browse-url-function 'eww
|
||||
"Browser to use for HTTP(S) documentation."
|
||||
:group 'systemd
|
||||
:type '(choice function))
|
||||
|
||||
(defcustom systemd-comment-start "#"
|
||||
"String to insert to start a new comment."
|
||||
:group 'systemd
|
||||
@ -53,6 +61,48 @@
|
||||
"Default expressions to highlight in `systemd-mode'. See systemd.unit(5)
|
||||
for details on unit file syntax.")
|
||||
|
||||
(defun systemd-get-value (start)
|
||||
"Joins lines in the key value starting at buffer position START,
|
||||
possibly broken by a backslash, and returns a string containing
|
||||
the value."
|
||||
(save-excursion
|
||||
(let ((break "\\\\\n")
|
||||
end)
|
||||
(while (progn (goto-char (- (line-end-position) 1))
|
||||
(looking-at break))
|
||||
(forward-line))
|
||||
(setq end (line-end-position))
|
||||
(replace-regexp-in-string break " " (buffer-substring start end)))))
|
||||
|
||||
(defun systemd-doc-find ()
|
||||
"Find the value of the unit's “Documentation” keys and return
|
||||
as a list of strings, otherwise nil."
|
||||
(let ((key "^Documentation=")
|
||||
string)
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(while (re-search-forward key nil t)
|
||||
(setq string (concat string " " (systemd-get-value (point))))))
|
||||
(when string
|
||||
(split-string string))))
|
||||
|
||||
(defun systemd-doc-open (url)
|
||||
"Open URL. Interactively completes the documentation in the
|
||||
current unit file, defaulting to the link under point, if any."
|
||||
(interactive
|
||||
(let* ((uri (thing-at-point-url-at-point))
|
||||
(prompt (concat "URL"
|
||||
(when uri (format " (default %s)" uri))
|
||||
": ")))
|
||||
(list (completing-read prompt (systemd-doc-find) nil nil nil nil uri))))
|
||||
(let ((link (url-generic-parse-url url)))
|
||||
(pcase (url-type link)
|
||||
("file" (find-file (url-filename link)))
|
||||
("man" (url-man link))
|
||||
("info" (url-info link))
|
||||
((or "http" "https") (apply systemd-browse-url-function `(,url)))
|
||||
(_ (user-error "Invalid link")))))
|
||||
|
||||
(defvar systemd-mode-syntax-table
|
||||
(let ((table (make-syntax-table)))
|
||||
(modify-syntax-entry ?\" ". " table)
|
||||
@ -61,6 +111,12 @@ for details on unit file syntax.")
|
||||
table)
|
||||
"Syntax table used in `systemd-mode' buffers.")
|
||||
|
||||
(defvar systemd-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(define-key map (kbd "C-c C-o") 'systemd-doc-open)
|
||||
map)
|
||||
"Keymap used in `systemd-mode' buffers.")
|
||||
|
||||
;;;###autoload (add-to-list 'auto-mode-alist '("\\.automount\\'" . systemd-mode))
|
||||
;;;###autoload (add-to-list 'auto-mode-alist '("\\.busname\\'" . systemd-mode))
|
||||
;;;###autoload (add-to-list 'auto-mode-alist '("\\.mount\\'" . systemd-mode))
|
||||
@ -77,7 +133,10 @@ for details on unit file syntax.")
|
||||
"Major mode for editing systemd unit files. See
|
||||
http://www.freedesktop.org/wiki/Software/systemd/ for more
|
||||
information about systemd. The hook `systemd-mode-hook' is run
|
||||
at mode initialization."
|
||||
at mode initialization.
|
||||
|
||||
Key bindings:
|
||||
\\{systemd-mode-map}"
|
||||
(set-syntax-table systemd-mode-syntax-table)
|
||||
(setq-local comment-start systemd-comment-start)
|
||||
(setq-local font-lock-defaults '(systemd-font-lock-keywords))
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user