August 3, 2019
By: Kevin
lisp 代码编辑
编辑lisp代码是个享受, 是的, 是个享受. 有Paredit伴你左右, 编辑代码树会成为你最重要的编程习惯.
括号会变成你最好的朋友, 像空气, 虽一无所觉, 但无所不在, 生死相托.
OH: "If you think paredit is not for you then you need to become the kind of person that paredit is for."
这么多括号...

众所周知, lisp有很多括号, 这是个优点.
默认的编辑代码流程中, 代码是行的集合,行是字符的集合, 我们的编辑体验集中于
- 基于字母/单词的编辑
- 基于行的编辑
无外乎移动光标, 输入, 复制, 粘贴, 删除.
lisp的代码的天然对应lisp的语法树(syntax tree), 这个对应是深入骨髓的, 一方面提供了强大的宏(macro)元编程能力(meta programing)
另一方面直达编辑过程, lisp编辑的自然元素是表达式(s-expression), 不是字符, 也不是行.
理解树的结构化编辑才能让代码在你的之间跳舞.
- 以结构化的方式看待代码
- AST(Abstract syntax tree)在lisp语言中没有那么A(抽象),你的代码就是你的树
- 结构以括号代表
- 结构都是表达式(s-expression 递归的表达结构,参见SICP或者little schemaer,咱们书架上有)
paredit是结构化编辑的一种模式, 几乎所有的成熟编辑器都有paredit插件. Emacs Vim, Intellij, VSCode...
在这个由括号构成的丛林中, 选择/编辑一个结构和遍历/修改树的节点是同义语.
- 跳转
- 到父级节点
- 到子级节点
- 到同级节点
- 编辑
- 插入新节点
- 删掉上级节点
- 当前节点拆分
- 合并两个节点
- 合并同级别单节点
- 把内层的表达式推出去
概念上, 只要把节点替换为表达式, 一切就了然了.
下面都是emacs的例子,其他编辑器的paredit快捷键会有差异,但编辑方式是一致的.
跳转
c-m-d下层表达式
c-m-u上层表达式
c-m-f下一个表达
c-m-b前一个表达式
补全, 匹配和缩进
(-> paredit-open-round[-> paredit-open-square{-> paredit-open-curly
注意:代码缩进和括号关闭都不需要我们处理
干掉上层表达式
M-up
干掉下层表达式
M-down
拆分和合并
对表达式和字符串均有效
M-S & M-J
表达式吞吐
C-)右边吞进C-(左边吞进C-{左边吐出C-}右边吐出
包围表达式&字符串
M-(用圆括号包围表达式M-"用引号包围表达式, 变成字符串
删除
C-k删除, 自己体会吧M-d向前删除词M-delte向后删除词C-d向前删除