vimscript:识别 groovy 缩进文件中的地图

vimscript: identifying maps in groovy indent file

我正在使用 this script 作为 groovy 缩进文件。它工作得很好,但有一个例外:它不会缩进内置地图。例如,我想看到这个:

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

但是我看到的是这样的:

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

如何调整脚本以正确识别地图?我尝试更改第 105、125 和 132 行以包括 [] 除了 {},但这没有按预期工作。

没有任何新的文本对象看到更多它here 假设你在代码的第一行,你可以这样做:

$>i[

$ ......... jump to the end of the line
> ......... indent
i[ ........ inner [

textobjvim_wellle_viml 放入您的 ~/.vimrc 中,您可以执行以下操作:

>in[

代表:indent inner next [

您发布的 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

现在我对 groovy 的了解不足以确保它不会有副作用,但您可以修改我上面的第一个解决方案以使用 SkipGroovyBlanksAndComments(v:lnum -1) 而不是 prev