aboutsummaryrefslogtreecommitdiff
path: root/wiki-markup.el
diff options
context:
space:
mode:
Diffstat (limited to 'wiki-markup.el')
-rw-r--r--wiki-markup.el35
1 files changed, 25 insertions, 10 deletions
diff --git a/wiki-markup.el b/wiki-markup.el
index 61cdca8..4b6bc3e 100644
--- a/wiki-markup.el
+++ b/wiki-markup.el
@@ -71,7 +71,10 @@
(wiki-activate-raw-links)
))
-(defvar wiki-outline-re "=+.*=+\ *$")
+(defvar-local wiki-outline-re "=+.+=+\\ *$"
+ "Regexp to match outline headings.")
+(defvar-local wiki-outline-format-re "=+\\ *%s\\ *=+\\ *$"
+ "Regexp format string to match a specific outline heading.")
(defvar-local wiki-site nil
"The identifier of the site of the current wiki buffer.")
@@ -81,7 +84,19 @@
"Button action to follow a wikilink.
The button data is passed as DATA."
- (funcall (wiki-site-fetcher wiki-site) (alist-get 'target data)))
+ (let ((target (alist-get 'target data)))
+ (if (string-prefix-p "#" target)
+ (wiki-goto-heading (string-remove-prefix "#" target))
+ (funcall (wiki-site-fetcher wiki-site) (alist-get 'target data)))))
+
+(defun wiki-goto-heading (heading)
+ (let ((point (point)))
+ (goto-char (point-min))
+ (if (re-search-forward
+ (format wiki-outline-format-re (regexp-quote heading)) nil t)
+ (beginning-of-line 1)
+ (goto-char point)
+ (error "Cannot find heading: %s" heading))))
(defun wiki-guess-site ()
"Guess `wiki-site' from the default directory.
@@ -288,21 +303,21 @@ LIMIT is the limit of the search, used for `font-lock-keywords'."
(font-lock-extra-managed-props
invisible font-lock-face button-data action category
button htmlize-link help-echo display)))
+ (wiki-update-local-settings)
+ )
+
+(defun wiki-update-local-settings ()
(setq-local outline-regexp wiki-outline-re)
(setq-local outline-level 'wiki-outline-level)
;; We have to do this again because `outline-mode' used the default
;; `outline-regexp'.
(setq-local imenu-generic-expression
(list (list nil (concat "^\\(?:" outline-regexp "\\).*$") 0))
- imenu-space-replacement nil)
- )
+ imenu-space-replacement nil))
-(defun set-wiki-site (site)
- "Set `wiki-site' to SITE."
- (interactive (list
- (completing-read "Set wiki site: "
- (mapcar 'car wiki-sites))))
- (setq-local wiki-site (intern site)))
+(add-hook 'hack-local-variables-hook
+ (lambda () (when (derived-mode-p 'wiki-mode)
+ (wiki-update-local-settings))))
(add-hook 'wiki-mode-hook 'wiki-guess-site)
(add-hook 'wiki-mode-hook 'wiki-guess-title)