Отступ в середине нескольких строк

Отступ в середине нескольких строк

Я часто сталкиваюсь с такими ситуациями:

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

TheТабличноплагин для 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

Насколько я могу судить, конечный результат — это именно то, что вы ищете. Дайте мне знать, если по какой-то причине не получится или если я неправильно понял требования.

Связанный контент