9

我正在使用vim-sexpvim-sexp-mappings-for-regular-people插件来编辑 Clojure 文件。我不太明白slurpbarf命令究竟做了什么。

我试着和他们一起玩,似乎他们在相邻表单的开头/结尾插入/删除表单。那是对的吗?如果不是,那么slurpbarf的正确定义是什么?

4

3 回答 3

14

slurping 和 barfing 是使用现代结构代码编辑器之一的基本操作/概念。在习惯了它们之后,如果没有这些,我完全无法编辑代码。大约 20 个人整天和我坐在一起写 clojure ,他们都一直在使用这些。所以说它们“对 lisp 编码器有帮助”是一种非常委婉和礼貌的轻描淡写。

啜饮:(动词)

“将项目包含在表达式的一侧,围绕该点进入表达式”

barf:(动词)

“从表达式中排除围绕该点的表达式中最左边或最右边的项目”

和一些例子。

1 2 (3 4) 5 6

啜饮权利:

1 2 (3 4 5) 6

右巴:

1 2 (3 4) 5 6

向左啜饮:

1 (2 3 4) 5 6

酒吧左:

1 2 (3 4) 5 6

我们又回到了开始的地方。

当我进行介绍 paredit 的演讲/演示时,我通常只给学生/与会者留下这两个概念,因为我觉得它们足以开始获得结构编辑的好处而不会让人不知所措。一旦您对这些感到满意,然后通过学习通过表情而不是字符来前进/后退和上/下 移动,继续进行结构导航。

即使它列出了 emacs 键绑定,我仍然强烈推荐 Peter Rincker 在他的回答中提到的动画指南。

于 2015-05-11T22:11:48.537 回答
2

我不是以下方面的专家:lisps、emacs、paredit、vim-sexp 或 vim-sexp-mappings-for-regular-people。(为什么我发的正确?!)

但是我知道 slurp 和 barf 来自 Emac 的 paredit 模式。这种 Emacs 模式据说对 lisp 编码器很有帮助。如果你搜索 paredit,我相信你可以找到一篇关于这些主题的有用的文章。事实上,我为您找到了一篇不错的文章:Paredit 动画指南。据我所知,您对 slurp 和 barf 的猜测是正确的。

于 2015-05-11T22:04:29.407 回答
2

它可能看起来很恶心,但我想象像呕吐一样的呕吐(它们毕竟是同义词),你正在排出一些东西。

啜饮,我想象通过吸管喝一杯并吸入饮料。

管道符号是这些插图中的光标。

所以向右吐(推出4

1 2 (3 |4) 5 6 -> 1 2 (3|) 4 5 6

然后向右啜饮让你回到 4 (重新摄取你之前吐出的东西可能很恶心)

1 2 (3|) 4 5 6 -> 1 2 (3 4) 5 6

向后版本做同样的事情,但在当前 s-exp 之前的项目。

我发现我使用的前/右版本比左版本多得多,因为我通常在前面添加一些东西,比如let绑定,所以会话可能是:

(some-fn1 (count some-map))
(some-fn2 (count some-map))

啊哈,可以在这里重构(count some-map)

(let [c (count some-map)]|)
(some-fn1 c)
(some-fn2 c)

但是 let 没有包装 2 个调用,所以我们想在 let s-exp 中拉入(slurp)接下来的 2 个表单,所以现在在光标位置,slurp 两次,这将在第一个之后给出:

(let [c (count some-map)]|
  (some-fn1 c))
(some-fn2 c)

然后在第二个:

(let [c (count some-map)]|
  (some-fn1 c)
  (some-fn2 c))

并且任何具有paredit /结构编辑的体面编辑器也将为您同时进行缩进。

同样重要的是要注意 barf/slurp 将发生在当前的一组括号内(即(let [a (count x)]),根据光标所在的位置,slurp 会做不同的事情,因为有 3 组括号),因此为什么我要小心将光标在上面的 let 绑定中,否则您将推入/推出错误的支架(这是 barf/slurping 的另一种思考方式 - 操纵支架的位置而不是将项目拉入/推入/推出 s-exp )。

于 2015-05-12T12:15:40.860 回答