多行中间缩进

多行中间缩进

我经常遇到这样的情况:

title : Jekyll Bootstrap
tagline: Site Tagline
author :
  name : Name Lastname
  email : [email protected]
  github : username
  twitter : username
  feedburner : feedname

如果参数没有很好地排列,是否有一种标准方法vim可以将其格式化为每个相应参数与最近的缩进对齐,其中缩进定义为 2 个空格,而不必逐行遍历到,例如以下内容:

title   : Jekyll Bootstrap
tagline : Site Tagline
author  :
  name      : Name Lastname
  email     : [email protected]
  github    : username
  twitter   : username
  feedburner: feedname

更新:

我相信表格.vim是我正在寻找的插件,但我很难形成正则表达式,在决定某些内容应该成为块的一部分时,该正则表达式会考虑行开头的空格数,即Tabularize/:产生:

title       : Jekyll Bootstrap
tagline     : Site Tagline
author      :
  name      : Name Lastname
  email     : [email protected]
  github    : username
  twitter   : username
  feedburner: feedname

这是一个例子文档其中以下内容是通过正则表达式实现的:

abc,def,ghi
a,b
a,b,c

:制表 /^[^,]*\zs,/r0c0l0

abc,def,ghi
  a,b
  a,b,c

但我不确定当考虑同一块前面的每一行具有相同数量的空格时如何制定这一点,同时仍然评估子块,如下所示,比我原来的示例更复杂:

comments :
  provider : disqus
  disqus :
    short_name : jekyllbootstrap
  livefyre :
    site_id : 123
  intensedebate :
    account : 123abc
  facebook :
    appid : 123
    num_posts : 5
    width : 580
    colorscheme : light

将转变tabularize\some_regular_expression_I_cant_figure_out为:

comments :
  provider      : disqus
  disqus        :
    short_name    : jekyllbootstrap
  livefyre      :
    site_id       : 123
  intensedebate :
    account       : 123abc
  facebook      :
    appid         : 123
    num_posts     : 5
    width         : 580
    colorscheme   : light

答案1

表格化vim 插件可以完全满足您的需求。归结为打字Tabularize /:

然而,这可能不会保留左侧的缩进。

编辑您更新的问题:我无法直接使用 Tabular 来执行此操作,但我可以使用第二个命令来执行此操作,该命令是在范围内进行搜索和替换:

 :%s/\([ ]*\)[[:alpha:][:punct:]]*[ ]*/\0\1/

这会搜索 前面的一定量的空格:,并将它们粘贴到分号之前。

答案2

所以,坏消息和好消息。坏消息是,如果不做一些工作,Tabular 就无法真正满足您的要求 - 手头的问题需要比 Tabular 通常可以访问的更多上下文。好消息是 Tabular 被设计为可以用作极其灵活的通用文本操作工具,在这种情况下,让 Tabular 做你想做的事情并不难。

~/.vim/after/plugin/TabularizeRecord.vim创建一个以以下内容命名的文件(希望有足够多的注释):

" Create a new tabular pipeline named 'record' that includes all adjacent
" lines containing a : in its default range, and manipulates those lines by
" passing them through the TabularizeIndentedRecord function
AddTabularPipeline! record /:/ TabularizeIndentedRecord(a:lines)

function! TabularizeIndentedRecord(lines)
  " A list containing each of the lines with leading spaces removed
  let text = map(copy(a:lines), 'substitute(v:val, "^ *", "", "")')
  " A list containing just the leading spaces for each line
  let spaces = map(copy(a:lines), 'substitute(v:val, "^ *\\zs.*", "", "")')
  " Tabularize only the text, not the leading spaces.  This pattern is more
  " complicated than just /:/ to handle lines with multiple colons.
  call tabular#TabularizeStrings(text, '[^:]*\zs:', 'l1')
  " Tack the spaces back on to the beginning of each line, and store the
  " resulting lines back in the a:lines list
  call map(a:lines, 'remove(spaces, 0) . remove(text, 0)')
endfunction

一旦该文件存在,重新启动 vim,然后您应该能够通过执行以下操作获得您想要的缩进:

:Tab record

据我所知,最终结果正是您想要的 - 但是,如果它由于某种原因没有奏效,或者我误解了要求,请告诉我。

相关内容