Я часто сталкиваюсь с такими ситуациями:
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
Насколько я могу судить, конечный результат — это именно то, что вы ищете. Дайте мне знать, если по какой-то причине не получится или если я неправильно понял требования.