没有Paredit插件,在Emacs上写lisp代码会痛苦无比。最开始是在王垠的博客上看到了这个插件,当时只是为了配置一个较为舒适的Scheme编程环境。当时王垠大大只教了两个功能,不过仅仅这两个功能就使得我写Scheme代码变得很舒服。而后又在Youtube上看到一个关于Paredit的视频,然后决定深入了解下这个插件,于是便有了这篇文章。其实不是因为视频中展示的功能很炫,而是因为里面有一句特装逼的话。
"If you think paredit is not for you then you need to become the kind of person that paredit is for."
顺便Emacs是邪教啊,入教了就出不来了。
好了不废话了,进入正题。首先在Paredit模式下,你打出的括号引号什么的都是成对出现的,这个是最基本的了。然后比如你打算打一个字符串,那么应该是"a-string"
这样的吧。这个没什么问题,但是手滑了忘记了双引号了,哦凑a-string
。怎么办,在开头结尾加双引号吧。每次做这个工作我都觉得心好累,感受到了来自全世界的恶意。但Paredit表示这并不是问题,把光标停留在字符串第一个字符前,按下M-"
,好了这个世界安静了。a-string
自动变成了"a-string"
。不仅仅只有双引号的,还有lisp中最常见的括号,在一个S表达式开头按下M-(
会将这个S表达式放到括号中变成了表。
分割和连接(split & join)
一个表分为两个表,一个字符串分割为两个字符串。这些在Paredit中是十分简单的。只需要在要分割的地方按下M-S
。
;;; 例子,将光标放在world前,按下M-S
(hello world)
(hello) (world)
;;; 字符串的
"Hello,world"
"Hello," "world"
连接的我就不写了,快捷键是M-J
。还有看到上面代码的注释了吧,我要写注释的时候就按M-;
然后注释符自动就打出来了,Paredit就是这么酷。
吞吐S表达式(Barfage & Slurpage)
我觉得这简直就是Paredit的精髓,简直太好用了。吞掉右边的S表达式,C-)
,吐出来C-}
。对应的,吞掉左边的S表达式,C-(
,吐出来C-{
。
(foo bar (baz) quux zot)
;;; 把光标放到(baz)里面,先吞右边(C-))后吞左边(C-()
(foo bar (baz quux) zot)
(foo (bar baz quux) zot)
;;; 吐:把光标放在(bar baz quux)中,先吐左边(C-{)后吐右边(C-})
(foo bar (baz quux) zot)
(foo bar (baz) quux zot)
跳出外围块
这个不太好表达,就写个例子吧。就是下面这个样子的。
(foo (let ((x 5))
(sqrt n)) bar)
;;; 光标停留在(sqrt n)前面,按下M-r
(foo (sqrt n) bar)
;;; 再来一个
(if (pre)
(then)
(otherwise))
;;; 在(then)前面按M-r
(then)
这些我觉得是最常用的,还有很多就不写了,留个官方的手册Paredit Referennce Card。总之Paredit写lisp真的太好用。
打算长期在简书上写博客了,欢迎关注。Markdown还是挺好用的,虽然照Emacs的org-mode差好多。