vimscript:在groovy缩进文件中标识映射

vimscript:在groovy缩进文件中标识映射,vim,groovy,vim-syntax-highlighting,Vim,Groovy,Vim Syntax Highlighting,我将其用作groovy缩进文件。它工作得很好,但有一个例外:它不缩进内置的贴图。例如,我希望看到: def map = [ key1: 'value1', key2: 'value2' ] 但我看到的是: def map = [ key1: 'value1', key2: 'value2' ] 如何调整脚本以使其正确标识贴图?我尝试将第105行、第125行和第132行更改为除了{和}之外还包含[和],但这并没有如预期的那样起作用。如果没有任何新的文本对象,请查看更多信息 假设您位于代

我将其用作groovy缩进文件。它工作得很好,但有一个例外:它不缩进内置的贴图。例如,我希望看到:

def map = [
  key1: 'value1',
  key2: 'value2'
]
但我看到的是:

def map = [
key1: 'value1',
key2: 'value2'
]

如何调整脚本以使其正确标识贴图?我尝试将第105行、第125行和第132行更改为除了
{
}
之外还包含
[
]
,但这并没有如预期的那样起作用。

如果没有任何新的文本对象,请查看更多信息 假设您位于代码的第一行,您可以执行以下操作:

$>i[

$ ......... jump to the end of the line
> ......... indent
i[ ........ inner [
~/.vimrc
中,可以执行以下操作:

>in[

它的标准是:
缩进内部下一步[

您发布的Groovy缩进文件只是对C缩进文件的一个添加。 因此,在这里找不到开口括号的缩进

您必须编写自己的案例,而不是修改案例:

if getline(prev) =~# '[' && getline(prev) !~# ']' && getline(v:lnum) !~# ']' && getline(v:lnum) !~# ':$'
  let theIndent = indent(prev) + &sw
endif
如果插入到第73行,这应该或多或少有效。但您可能需要进行一些微调。根据我的经验,编写正确的工作缩进是语言插件中最难的部分。因此,如果您先阅读教程,这不会有什么坏处

更新

结尾处的
出现的问题来自此块:

  " find start of previous line, in case it was a continuation line
  let lnum = SkipGroovyBlanksAndComments(v:lnum - 1)
  let prev = lnum
  while prev > 1
    let next_prev = SkipGroovyBlanksAndComments(prev - 1)
    if getline(next_prev) !~ ',\s*$'  " <---------lines ending with , are skipped
      break
    endif
    let prev = next_prev
  endwhile
“查找上一行的开头,以防它是续行
设lnum=SkipGroovyBlanksAndComments(v:lnum-1)
设prev=lnum
而prev>1
让next_prev=SkipGroovyBlanksAndComments(prev-1)

如果getline(next_prev)!~“,\s*$”,这允许我手动缩进。我正在尝试让groovy缩进文件自动缩进映射的内部。这似乎不起作用。我仍然得到相同的无缩进尝试将中间行更改为
返回缩进(prev)+&sw
。此外,您可以使用
调试缩进函数:breakadd func GetGroovyIndent
,然后使用
s
逐步完成代码。如上所述,缩进函数一点也不平凡,可能会出错很多。我有手动自动缩进器(
=
键)使用。我现在唯一不知道的是,当我关闭
]
时,如何让它自动取消登录,而不必退出插入模式并点击
=`=
,就像关闭
}
时一样。有什么想法吗?我想这个功能可能来自于C文件。如果有同样的问题,请首先查看调试器。按
c
继续,然后使用
:breakdel
(您可能还需要
breaklist
)删除断点。你的第二个问题有很多可能的解决方案。我会看看哪一个最好,但在我有时间之前可能是星期一。