Vim вже відображає складки як єдиний рядок. Однак у складі Віма indent
всі рядки, що мають однаковий відступ, включені в складку. Отже, на екрані екрана рядки, які ви називаєте "заголовками" (наприклад, той, що починається collection_base_url
), не знаходяться в складках.
Ви можете домогтися чогось подібного до складання Atom, скориставшись Vim foldexpr
foldmethod
:
" Finds the indent of a line. The indent of a blank line is the indent of the
" first non-blank line above it.
function! FindIndent(line_number, indent_width)
" Regular expression for a "blank" line
let regexp_blank = "^\s*$"
let non_blank_line = a:line_number
while non_blank_line > 0 && getline(non_blank_line) =~ regexp_blank
let non_blank_line = non_blank_line - 1
endwhile
return indent(non_blank_line) / a:indent_width
endfunction
" 'foldexpr' for Atom-style indent folding
function! AtomStyleFolding(line_number)
let indent_width = &shiftwidth
" Find current indent
let indent = FindIndent(a:line_number, indent_width)
" Now find the indent of the next line
let indent_below = FindIndent(a:line_number + 1, indent_width)
" Calculate indent level
if indent_below > indent
return indent_below
elseif indent_below < indent
return "<" . indent
else
return indent
endif
endfunction
set foldexpr=AtomStyleFolding(v:lnum)
set foldmethod=expr
Це визначає вираз складки (див. :help fold-expr
) Наступним чином:
- Для рядків, що безпосередньо передують відступним лініям, він повертає відступ блоку, що випливає.
- Для відступних рядків повертає відступ. (Ділиться на ширину зсуву, тому кожен рівень відступу збільшує повернене значення на 1)
- Для рядків у кінці блоку відступних рядків він повертає рядок
"<N"
, де N встановлюється до відступу. Це говорить Віму, що складка рівня N закінчується на цьому рядку.
Оновлення
@alxndr запитує в коментарях, чи можна розширити це, щоб включити обриси Рубі end
в складки. Ви можете почати, замінивши " Calculate indent level
розділ наступним:
if indent_below > indent
return indent_below
elseif getline(a:line_number) =~ '^\s*end\s*$'
return "<" . (indent + 1)
else
return indent
endif
Насправді це не найнадійніше рішення (наприклад, воно вийде з ладу, якщо end
оператор буде на тому ж рядку, після крапки з двокрапкою). Ви можете налаштувати регулярний вираз та оточуючий код для вирішення цього питання, але оскільки ви зараз перебуваєте в царині розбору фактичного синтаксису файлу, я підозрюю, що все може скластися набагато складніше, перш ніж ви матимете хороше рішення.