Автоматическое сворачивание #defines в vim - PullRequest
4 голосов
/ 23 сентября 2008

Я работаю с небольшим количеством мультиплатформенного кода C / C ++, разделенного общими #defines (#if WIN, #if UNIX и т. Д.). Было бы неплохо, если бы я мог vim автоматически свернуть разделы, которые меня не интересуют, когда я открываю файл. Я просмотрел архивы скриптов vim, но не нашел ничего полезного. Какие-либо предложения? С чего начать?

Ответы [ 5 ]

7 голосов
/ 23 сентября 2008

Просто добавьте область свёртывания к вашему синтаксису http://vim.wikia.com/wiki/Syntax_folding_of_Vim_scripts#Syntax_definitions

:syn region myFold start="\#IF" end="\#ENDIF" transparent fold
:syn sync fromstart
:set foldmethod=syntax
2 голосов
/ 23 сентября 2008

Чтобы добавить к ответу @hometoasts, вы можете добавить эту команду в качестве комментария в первые десять или последние десять строк файла, и vim автоматически использует ее для этого файла.

    /* vim: syn region regionName start="regex" end="regex": */
0 голосов
/ 04 марта 2010

У меня огромная база кода и поэтому большое количество #defines. Каждый файл имеет множество # ifdef и в большинстве случаев они вложенные. Я перепробовал многие скрипты vim, но они всегда имел обыкновение сталкиваться с некоторой ошибкой с кодом, который я имею. Итак, в конце концов я положил все свои определения в заголовочный файл и включил его в файл, с которым я хотел работать, и сделал на нем gcc как это

gcc -E -C -P source.cpp> output.cpp

Команда -E заставляет gcc запускать только препроцессор над файлом, поэтому все нежелательные код внутри неопределенного # ifdef's удаляется. Опция -C сохраняет комментарии в файле. Опция -P запрещает генерацию линейных маркеров на выходе препроцессора.

0 голосов
/ 23 марта 2009

Я всегда использовал forldmethod = marker и определял свои собственные теги свертывания, размещенные в комментариях.

это для определения символов, которые определяют открытые и закрытые сгибы. в этом случае open - это "<(", а close - ")>", замените их на то, что вы хотите.

set foldmethod=marker
set foldmarker=<(,)>

Это моя пользовательская функция, чтобы решить, что отображать сложенный текст:

set foldtext=GetCustomFoldText()
function GetCustomFoldText()
    let preline = substitute(getline(v:foldstart),'<(','<(+)','')
    let line = substitute(preline,"\t",'        ','g')
    let nextLnNum = v:foldstart + 1
    let nextline = getline(nextLnNum)
    let foldTtl = v:foldend - v:foldstart
    return line .  ' | ' . nextline . ' (' . foldTtl .  ' lines)>'
endfunction

Надеюсь, это поможет.

0 голосов
/ 23 сентября 2008

Быстрое добавление к дополнению Дентона: чтобы использовать новое правило синтаксиса с любым кодом C или C ++, добавьте его в файл с именами $VIMRUNTIME/syntax/c.vim и cpp.vim. ($VIMRUNTIME - это место, где живет ваш локальный код Vim: ~/.vim в Unix.) Кроме того, значения start и end в определении синтаксиса являются регулярными выражениями, поэтому вы можете использовать ^#if и ^#endif чтобы убедиться, что они совпадают только с этими строками в начале строки.

...