[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[emacs-wiki-discuss] Planner hyperlinks _anywhere!_
From: |
Sacha Chua |
Subject: |
[emacs-wiki-discuss] Planner hyperlinks _anywhere!_ |
Date: |
Sat, 18 Jun 2005 08:47:41 +0800 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/21.3.50 (gnu/linux) |
action-lock.el is part of HOWM, another hypertext module for Emacs. I
have a copy at
http://sacha.free.net.ph/notebook/emacs/howm-1.1.1.1/action-lock.el .
The following code uses action-lock to enable Planner-style links
_anywhere_. Add it to your ~/.emacs and use M-x action-lock-mode to
turn action locking on. This is pretty nifty as you can then use M-x
planner-annotation-from-kill and paste the link in plain text files or
whatever.
Writing an emacs-wiki version should be relatively straightforward, as
planner-action-lock-follow-name-at-point is based on
emacs-wiki-visit-link.
<example>
(add-to-list 'action-lock-default-rules
(list (with-planner emacs-wiki-url-or-name-regexp)
'planner-action-lock-follow-name-at-point))
(setq action-lock-rules action-lock-default-rules)
(defvar planner-action-lock-default-directory planner-directory "Expand files
relative to this directory.")
(defun planner-action-lock-follow-name-at-point (&optional other-window)
(let ((link-name (match-string 0))
(base-buffer (current-buffer))
;; the name of the buffer that contains the link. check
;; whether buffer-name is a WikiName, else make it one
(parent-name (or (emacs-wiki-page-name)
(concat "[[" (buffer-name) "]]"))))
(with-planner
(let ((link (emacs-wiki-wiki-link-target link-name)))
(if (emacs-wiki-wiki-url-p link)
(emacs-wiki-browse-url link other-window)
;; The name list is current since the last time the buffer was
;; highlighted
(let* ((base (emacs-wiki-wiki-base link-name))
(file (emacs-wiki-page-file base))
(tag (and (not (emacs-wiki-wiki-url-p link))
(emacs-wiki-wiki-tag link)))
(find-file-function (if other-window
'find-file-other-window
'find-file))
(parent-allowed-backlink-p
(not (string-match
emacs-wiki-exclude-backlink-parent-regexp
parent-name)))
(parent-backlink (and parent-allowed-backlink-p
(emacs-wiki-get-current-backlink)))
(newbuf
(funcall find-file-function
(or file
(expand-file-name
base
(or planner-action-lock-default-directory
(and (buffer-file-name)
(file-name-directory
(buffer-file-name)))
default-directory)))))
(emacs-wiki-create-backlinks
(and emacs-wiki-create-backlinks parent-allowed-backlink-p))
(make-link-p (and emacs-wiki-create-backlinks
;; insert backlink only in new files
(null file)
(not (string-match
emacs-wiki-exclude-backlink-regexp
(emacs-wiki-page-name
(buffer-file-name newbuf)))))))
(when tag
(goto-char (point-min))
(re-search-forward (concat "^\\.?#" tag) nil t))
(when refresh-buffer
(when make-link-p
(emacs-wiki-insert-backlink parent-name parent-backlink))
;; todo: is with-current-buffer necessary here?
(with-current-buffer newbuf
(add-hook 'after-save-hook
'emacs-wiki-refresh-buffers-once t t)
;; save the new file to avoid another backlink if the
;; buffer is visited again before being saved
(when (or make-link-p
(and (null file)
(not parent-allowed-backlink-p)))
;; set modified status to t: pages with excluded
;; parents may not be modified, but we want to save
;; anyway
(set-buffer-modified-p t)
(save-buffer))))))))))
--
Sacha Chua <address@hidden> - open source geekette
http://sacha.free.net.ph/ - PGP Key ID: 0xE7FDF77C
interests: emacs, gnu/linux, personal information management, CS ed
sachac on irc.freenode.net#emacs . YM: sachachua83
- [emacs-wiki-discuss] Planner hyperlinks _anywhere!_,
Sacha Chua <=