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-hater

众所周知, lisp有很多括号, 这是个优点.

默认的编辑代码流程中, 代码是行的集合,行是字符的集合, 我们的编辑体验集中于

  1. 基于字母/单词的编辑
  2. 基于行的编辑

无外乎移动光标, 输入, 复制, 粘贴, 删除.

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 向前删除 删除
Tags: clojure emacs lisp clojurescript