当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 1 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : emacs 光标移动路径点
帖子发表于 : 2013-02-07 2:37 

注册: 2006-03-19 11:39
帖子: 750
送出感谢: 0 次
接收感谢: 7
简单的说,当光标依次移动到 a b c d 位置的时候,用 (beacon) 标记;
然后用(beacon-jump)可以依次返回 d c b a 这几个点,
或者 (C-u 3 beacon-jump) 直接返回 b 点

[lisp]
(defun beacon ()
(interactive)
(let ((k (where-is-internal 'beacon-jump)))
(message (concat (mapconcat 'key-description k " , ")
(if k " or ")
"C-M-c to jump back.")))
(let ((x (point-marker)))
(catch 'exit (and (catch (recursion-depth) (recursive-edit)) (throw 'exit t)))
(switch-to-buffer (marker-buffer x))(goto-char x)))

(defun beacon-jump (&optional n)
(interactive "p")
(let* ((x (recursion-depth))
(i (if (> (or n 1) x)
x n)))
(throw (- x i) t)))
[/lisp]

虽然看起来比较简单,但实际上是非常变态的,
因为(recusive-edit) 或者(exit-recusive-edit)控制权会跨层转移,所以
(dotimes (i 100) (recursive-edit)) 也只能执行一次(recursive-edit),exit-recursive-edit 亦然
为了实现能够退出多层,用了一种比较恶心的方式,元芳你怎么看
[lisp]
;; 在 recursive-edit 时执行的退出代码
(throw (- (recursion-depth) n) t)
;; 接收到退出代码时的动作
(catch 'exit
(and
(catch (recursion-depth)
(recursive-edit))
(throw 'exit t)))
[/lisp]
这段实际展开时差不多是这个样子
[lisp]
(catch 'exit
(and
(catch 0
(catch 'exit
(and
(catch 1
(catch 'exit
(and
(catch 2
(catch 'exit
(and
(catch 3
(catch 'exit
(and
(catch 4
(catch 'exit
(and
(catch 5
(throw 3 t))
(throw 'exit t))))
(throw 'exit t))))
(throw 'exit t))))
(throw 'exit t))))
(throw 'exit t))))
(throw 'exit t)))
[/lisp]


_________________
https://github.com/ran9er


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 1 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译