Vim foldexpr для включения многострочных сигнатур функций - PullRequest
2 голосов
/ 29 ноября 2011

Я хотел бы свернуть исходный код так, чтобы сигнатура функции, которая занимает несколько строк, была включена в сгиб функции. Например, в C ++ я бы хотел

void ClassName::FunctionName(LongType1 LongArgument1,
                             LongType2 LongArgument2,
                             LongType3 LongArgument3) {
  ...
}

складывается в

+-- 5 lines: void ClassName::FunctionName [...]

вместо

void ClassName::FunctionName(LongType1 LongArgument1,
                             LongType2 LongArgument2,
+-- 3 lines: LongType3 LongArgument3) [...]

, где + обозначает закрытую складку.

Единственное решение, которое я мог придумать, - это использовать функцию для foldexpr, которая эффективно перебирает окружающие строки в поисках { или }.

Есть ли более чистый способ сделать это?

Ответы [ 2 ]

1 голос
/ 20 сентября 2014
Плагин

My VimFold4C отобразит что-то ближе к тому, что вы искали (3 года назад ...)

+void ClassName::FunctionName(LongType1 LongArgument1, LongType2 LongArgument2, LongType3 LongArgument3) ----------

Сложный текст на данный момент не идеален, но он может быть улучшен по этой теме в будущем. В любом случае, на этот раз вы получите только одну строку.

0 голосов
/ 30 ноября 2011

Есть две проблемы. Вторая проблема, вероятно, FoldText, где вы на правильном пути. Добавление кода для разбора последующих строк на текст и для закрывающей скобки - лучший способ сделать это. Если вы беспокоитесь, что это замедлит ход событий, не надо. У меня есть функции FoldText, где я делаю далеко, гораздо больше, и это не влияет на вещи заметно. (Функция сгиба текста, вероятно, вызывается не так часто, как вы думаете; она поддерживается только для видимых строк.)

РЕДАКТИРОВАТЬ: сложить часть текста еще проще, чем это. Если вы поместите курсор на первую фигурную скобку подписи, то при выполнении normal! va{y часть sig в ​​скобках будет помещена в @ ". Затем просто получите предварительную фигурную скобку и добавьте к ней join(split((@","\n")).

Другой проблемой, основной проблемой, является правило складывания. Похоже, вы хотите, чтобы сгибы функций были в первой строке сигнатуры функции даже для многострочных сигнатур. Вы можете попробовать использовать метод foldexpression, чтобы приблизиться к тому, что вы хотите. Этот foldexpr будет работать, если каждая функция (и только функции) начинается с 'void' в крайнем левом столбце:

set foldexpr=getline(v:lnum+1)=~'^void'?'<0':'1'

Так как это нереально, вы можете определить некоторый шаблон, который будет соответствовать всем строкам, которые вы хотите, как складные линии, то есть первые строки функции определяют вместе с любыми другими блоками сгиба, которые вы хотите:

function! VimFoldLevel(line)
    "check if this is the last line in a fold block
    if getline(a:line + 1) =~ '[pattern that matches first fold lines]'
        return '<0'
    else
        return '1'
    endif
endfunction

Затем убедитесь, что для foldexpr установлено значение, равное вашему уровню: set foldexpr=VimFoldLevel(v:lnum)

А также установите свой метод сгибания на expr: set foldmethod=expr

Возможно, есть другие способы сделать это, но это тот, который приходит на ум. , , Если есть какой-то обычно используемый метод свертывания (например, синтаксис), который используется для c ++ и который имеет разные уровни свертывания, вам следует изменить его. Пример, который я дал, предлагает только 1 уровень сгибов, функция полностью сложена или полностью развернута.

...