自己做笔记用的Emacs插件

插件使用场景

我使用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属于{菱形}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值