Vim Clojure中的Slurpage和barfage

Vim Clojure中的Slurpage和barfage,vim,clojure,s-expression,paredit,Vim,Clojure,S Expression,Paredit,我正在使用和插件来编辑Clojure文件。我不太明白slurp和barf命令到底做了什么 我试着使用它们,似乎它们在相邻表单的开头/结尾插入/删除表单。对吗?如果不是,什么是slurp和barf的正确定义?我不是普通人的lisps、emacs、paredit、vim sexp或vim sexp映射方面的专家。(为什么我的帖子是对的?!) 然而,我知道slurp和barf来自Emac的paredit模式。这种Emacs模式对lisp编码人员非常有帮助。我相信如果你搜索paredit,你会找到一篇关

我正在使用和插件来编辑Clojure文件。我不太明白slurpbarf命令到底做了什么


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

我不是普通人的lisps、emacs、paredit、vim sexp或vim sexp映射方面的专家。(为什么我的帖子是对的?!)


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

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

slurp:(动词)

“将该项包含到表达式中围绕该点的表达式的一侧”

巴夫:(动词)

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

还有一些例子

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动画指南

这看起来很恶心,但我能想象呕吐(毕竟是呕吐),你在呕吐

我咕噜咕噜地想象着用吸管喝一杯,然后吸进饮料

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

因此向右呕吐(推出
4

向右边咕噜咕噜会让你回到第四个(虽然重新摄入你之前吐出的东西可能会很恶心)

向后版本也会执行相同的操作,但会使用当前s-exp之前的项

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

(some-fn1 (count some-map))
(some-fn2 (count some-map))
啊哈,一个let可以在这里重构
(计算一些映射)

但是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将发生在当前的一组括号内(即slurping
(let[a(count x)])
将根据光标所在的位置执行不同的操作,因为有3组括号),因此我在上面的let绑定中小心放置光标的位置,否则你就推错了括号(这是呕吐/咕噜的另一种思维方式——操纵括号的位置,而不是将物品拉入/推出s-exp)。

注意:有一个问题。我需要你的答案才能最终理解它。现在这一切似乎都很明显了——就像所有重要的事情一样。你能给出一些链接来继续结构导航吗?你的隐喻会在脑海中留下持久的印象)任何有助于可视化的东西:-)
(let [c (count some-map)]|)
(some-fn1 c)
(some-fn2 c)
(let [c (count some-map)]|
  (some-fn1 c))
(some-fn2 c)
(let [c (count some-map)]|
  (some-fn1 c)
  (some-fn2 c))