Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在vim中为Common Lisp自定义自动格式化/自动缩进的最佳方法_Lisp_Common Lisp_Vim - Fatal编程技术网

在vim中为Common Lisp自定义自动格式化/自动缩进的最佳方法

在vim中为Common Lisp自定义自动格式化/自动缩进的最佳方法,lisp,common-lisp,vim,Lisp,Common Lisp,Vim,我想知道在vim中为Common Lisp定制自动格式化/自动缩进的最佳方法 自动格式化(我通常通过在命令模式下每行键入“==”)对vim中的基本lisp语言非常有效(例如,defmacro、defun、lambda、if,以及输出到字符串),但任何时候定义新的语言构造(例如,使用宏),我发现新构造的格式通常不是我想要的 例如,这里介绍了vim如何格式化“when”(标准lisp构造)和“awhen”(when的常用回指版本;不是lisp标准的一部分) 我想“什么时候自动格式化”就像“什么时候”

我想知道在vim中为Common Lisp定制自动格式化/自动缩进的最佳方法

自动格式化(我通常通过在命令模式下每行键入“==”)对vim中的基本lisp语言非常有效(例如,defmacro、defun、lambda、if,以及输出到字符串),但任何时候定义新的语言构造(例如,使用宏),我发现新构造的格式通常不是我想要的

例如,这里介绍了vim如何格式化“when”(标准lisp构造)和“awhen”(when的常用回指版本;不是lisp标准的一部分)

我想“什么时候自动格式化”就像“什么时候”。你知道我该怎么做吗

编辑:感谢Gilligan和Tamas的Slimv推荐。作为测试,我下载了MacVim(需要使用终端vim,但这是另一个问题)和slimv,将slimv下载同步到~/.vim中,启动MacVim,并加载了一个.lisp文件

然后我启动了lisp服务器(通过MacVim的GUI完成),它加载了我的默认lisp可执行文件和核心文件

而且*由于我的核心文件已经加载了我常用的语言扩展名(当我是其中一个扩展名时),所以当我的核心文件格式正确时,它就可以开箱即用

我真的很喜欢这个解决方案。而不是[1]必须学习如何告诉vim正确缩进特定函数,以及[2]为我定义的每个语言扩展编写明确执行此操作的代码,以及[3]每次添加新的语言构造时更新该代码。相反,我利用slimv为我做格式化。slimv可以“学习”新的语言扩展,只要这些宏已经加载到服务器会话正在使用的lisp核心中。真滑

我发现这对于一类特定的语言扩展非常有效。通常使用&body关键字将其定义为宏。这似乎在大多数情况下“做正确的事情”,但我使用的一些宏仍然无法正确自动格式化。尽管我认为这更可能是宏的编写方式(非标准语言扩展)的问题


所以,这个解决方案在大多数情况下对我来说都很好,我不需要编写(和维护)任何东西。好东西

如果您的文件类型是'lisp',那么我认为您需要在'/vim7x/indent'目录中的'lisp.vim'文件中为您的特殊情况添加缩进规则。您可以在帮助中找到更多信息,网址是
:h indent expr
:h indentexpr

有人可能会更好地告诉您,但我相信默认的lisp.vim缩进文件基本上没有任何作用,因为内置函数lispindent()用于获取缩进值。您将希望:

(1) 将用于获取缩进值(即indentexpr)的函数设置为您自己的indent/lisp.vim文件中的函数,例如GetLispIndent()。

(2) 在GetLispIndent()函数中,将使用lispindent()获取除特殊情况外所有行的缩进值。查看其他语言的缩进文件并阅读文档,了解缩进表达式的工作原理,例如java.vim。

这可能不是对您问题的直接回答,但我强烈建议您安装 slimv插件:


它是一个很好的插件,将SLIME功能集成到vim中,除此之外,它还为clisp&clojure提供了一个改进的缩进。但是它不会按您想要的方式缩进。

对于那些正在寻找此主题并且不想运行Slimv的人,因为他们不使用Common Lisp或其他原因,这里是独家新闻

Vim的Lisp缩进与其他语言不同;它有一个特殊的“Lisp模式”。此模式由打开

:set lisp
这是为
.lisp
文件自动执行的。Lisp模式不是Vim的发明;经典Vi实现使用
:set Lisp
打开Lisp模式。(不幸的是,POSIX没有描述它)

Vim的Lisp模式有一个简单的机制来识别需要运算符样式缩进的表单:即,有一个名为
lispwords
的参数,该参数包含一个逗号分隔的标识符列表

您可以向自己证明,这是所使用的标识符列表,即使您正在编辑带有语法高亮显示的公共Lisp
.Lisp
文件。只需执行
:设置listwords[TAB]
并编辑列表以从中删除某些内容,例如
defun
。然后尝试重新缩进一个
defun
:您现在将看到函数样式缩进,而不是运算符样式缩进

公共Lisp的语法突出显示支持与Lisp模式的
lispwords
参数不同;它有自己的标识符列表。例如,在Vim 7.3中,如果您输入:

(symbol-macrolet ((foo bar))
                 you get indented out to here!)
尽管
符号宏单元
已被识别和着色,这一点仍然存在。为什么?这是因为
symbol macrolet
不会出现在非常稀少的
lispwords
列表中,而会出现在
lisp.vim
语法突出显示定义文件中

结果是,您可以组合一些脚本来扫描
.lisp
文件目录中的宏,并生成一个
set lispwords=…
命令,该命令被放入目录
.vimrc

或者,如果您正在使用自定义的Lisp方言,则可以在加载时使其Vim语法高亮显示文件customize
lispwords

这里有一个实现缺陷:
lispwords
选项没有本地值;不能使用
setlocal lispwords…
为其指定特定于缓冲区的值。换句话说,看起来(至少在我在Ubuntu下使用的Vim 7.3中)不能有两个或更多的缓冲区打开,其中包含不同方言的Lisp和不同标识符的缩进。T
(symbol-macrolet ((foo bar))
                 you get indented out to here!)