插件使用场景
我使用Emacs作为笔记软件,在我想整理某些概念的定义时,我希望能有一个插件来更好地帮助我完成这件事。
当你需要在笔记中加入大量概念定义时,可以使用这个插件。
使用方法
definer-create:创建定义。
definer-note:添加补充说明。
definer-use:使用定义。
definer-get-all:查看所有定义(只向上查找)。
进入definer-mode可以绑定快捷键,见definer-mode定义。
可设置definer-define-word和definer-note-word自定义标识文字。
代码
;; Copyright 2023 Wenhan Zhang
;; Permission is hereby granted, free of charge, to any person obtaining a copy
;; of this software and associated documentation files (the “Software”), to deal
;; in the Software without restriction, including without limitation the rights
;; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
;; copies of the Software, and to permit persons to whom the Software is
;; furnished to do so, subject to the following conditions:
;; The above copyright notice and this permission notice shall be included in
;; all copies or substantial portions of the Software.
;; THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
;; THE SOFTWARE.
(defvar definer-define-word "define")
(defvar definer-note-word "note")
(defun definer-create (name)
(interactive "sName: \n")
(insert (concat "@" definer-define-word " {" name "} := ")))
(defun definer-note ()
(interactive)
(insert (concat "@" definer-note-word " True = ")))
(defun definer-use (name)
(interactive "sName: \n")
(definer-get-info name)
(insert (concat "{" name "}"))
(left-char))
(defun definer-@ ()
(interactive)
(insert "@"))
(defun definer-get-info (name)
(interactive "sName: ")
(print (definer--search-backward
(concat
"@" definer-define-word
" {" name "} :="
".*$"))))
(defun definer-get-all ()
(interactive)
(let ((b (get-buffer-create "**definer**"))
(c (current-buffer))
(d (definer--search-all-definitions (point) nil)))
(progn
(set-buffer b)
(erase-buffer)
(insert (mapconcat (lambda (x)
(concat (number-to-string (car x))
":"
(cadr x)))
d
"\n"))
(set-buffer c)
(display-buffer b))))
(defun definer--search-backward (pattern)
((lambda (p f)
(prog1
(funcall f)
(goto-char p)))
(point)
(lambda ()
(progn
(re-search-backward pattern)
((lambda (m)
(buffer-substring-no-properties
(marker-position (car m))
(marker-position (cadr m))))
(match-data))))))
(defun definer--search-all-definitions (return-point result)
(let ((r (re-search-backward (concat "@"
definer-define-word
" {.*} :=.*$")
nil t)))
(if r
(let ((m (match-data)))
(let ((s (buffer-substring-no-properties
(marker-position (car m))
(marker-position (cadr m)))))
(definer--search-all-definitions return-point
(cons (list (marker-position (car m)) s) result))))
(progn
(goto-char return-point)
result))))
(define-minor-mode definer-mode
"Yet another way to write definitions"
nil
" definer"
'(("@@" . definer-@)
("@d" . definer-create)
("@n" . definer-note)
("@u" . definer-use)
("@a" . definer-get-all)))
示例
@定义 {四边形} := 四条边(a,b,c,d)构成的平面图形
@定义 {平行四边形} := {四边形(a//b且c//d)}
@定义 {菱形} := {四边形(a=b=c=d)}
@定义 {正方形} := x, x属于{平行四边形}且x属于{菱形}