Clojure 中的 Slurpage 和 barfage

Slurpage and barfage in Clojure

我正在使用 vim-sexp and vim-sexp-mappings-for-regular-people 插件来编辑 Clojure 文件。我不太明白 slurpbarf 命令的作用。

我试过玩它们,它们似乎 insert/remove 在相邻形式的 beginning/end 形式。那是对的吗?如果不是,slurpbarf 的正确定义是什么?

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

不过我知道 slurp 和 barf 来自 Emac 的 paredit 模式。这种 Emacs 模式据说对 lisp 编码人员非常有帮助。如果您搜索 paredit,我相信您会找到一篇关于这些主题的有用文章。事实上,我为您找到了一篇不错的文章:The Animated Guide to Paredit。据我所知,您对 slurp 和 barf 的猜测是正确的。

吞咽和呕吐是使用一种现代 结构代码编辑器 的基本条件 operations/concepts。在习惯了它们之后,没有这些我完全无法编辑代码。在整天和我一起写 clojure 的约 20 个人中,所有人 一直都在使用这些。所以说他们是 "helpful for lisp coders" 是一种非常委婉和礼貌的轻描淡写。

啜饮:(动词)

"to include the item to one side of the expression surrounding the point into the expression"

barf:(动词)

"to exclude either the left most or right most item in the expression surrounding the point from the expression"

和一些例子。

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

我们又回到了起点。

当我给 talks/presentations 介绍 paredit 时,我通常只留下 students/attendees 这两个概念,因为我觉得它们足以开始获得结构编辑的好处而不会让人不知所措。一旦您熟悉了这些 ,然后通过学习按表达式而不是按字符移动 forward/backward 和 up/down 来继续结构导航

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

这可能看起来很恶心,但我想像呕吐一样呕吐(毕竟他们是 synonyms),你正在排出一些东西。

咕噜咕噜,我想象着用吸管喝水,然后把饮料吸进去。

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

所以向右呕吐(推出 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 之前的项目。

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

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

啊哈,let 可以进来重构 (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/structural 编辑能力的优秀编辑器也会同时为您进行缩进。

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