Clojure中的Slurpage和Barfage

10

我正在使用 vim-sexpvim-sexp-mappings-for-regular-people 插件来编辑Clojure文件。 我不太理解slurpbarf命令的确切作用。

我尝试过操作它们,似乎它们在相邻表单的开头/结尾插入/删除表单。这是正确的吗? 如果不是,请问slurpbarf的正确定义是什么?


注意:有一个专门的网站供vi和vim使用(http://vi.stackexchange.com/)。 - Shahbaz
3个回答

16

slurping 和 barfing 是使用现代结构化代码编辑器的基本操作/概念。熟悉它们后,我完全无法在没有这些工具的情况下编辑代码。与我一起整天编写Clojure 的大约20个人全部都会一直使用它们。所以说它们对于Lisp程序员非常有帮助是非常委婉和礼貌的说法。

slurp: (动词)

“将点所在周围表达式一侧的项包含到表达式中”

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 在他的答案中提到的 paredit 动画指南。


1
我需要你的答案才能最终理解它。现在一切都显而易见了 - 就像所有重要的事情一样。 - siphiuel
您能提供一些链接,以便进行结构导航吗? - Karen Fisher

4

虽然看起来很恶心,但我将呕吐视为呕吐(毕竟它们是同义词),你正在排出某些东西。

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

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

因此,向右呕吐(推出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))

嗯,这里可以使用let来重构(count some-map)

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

但是let没有包含这两个调用,因此我们想要在let s-exp中拉入(slurp)下两个表单,现在在光标位置,先执行两次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将在当前括号集内发生(即 slurping (let [a (count x)])将根据光标位置执行不同操作,因为有3个括号集),因此我在上面的let绑定中特别小心放置光标,否则您将推入/推出错误的括号(这是另一种思考barf/slurping的方式-操纵括号的位置而不是将项拉出/推出S表达式)。


1
你的隐喻会在人们的脑海中留下深刻的印象。 - siphiuel
1
任何有助于可视化的东西 :-) - Mark Fisher

3

我不是lisps、emacs、paredit、vim-sexp或vim-sexp-mappings-for-regular-people方面的专家。(为什么还要发帖呢?)

然而,我知道slurp和barf来自Emacs的paredit模式。这个Emacs模式对于lisp程序员来说非常有用。如果你搜索paredit,我相信你可以找到一篇关于这些主题的好文章。事实上,我为你找到了一篇不错的文章:The Animated Guide to Paredit。从我所知道的情况来看,你对于slurp和barf的猜测是正确的。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接