2008-09-23 7 views
4

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

ответ

7

Просто добавьте складную область к вашему синтаксису 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 
+0

Вот почему я люблю vim, ха-ха. – 2008-09-23 14:20:56

+0

Я нахожусь на vim 7.0, и я помещаю 3 строки в конец моего .vimrc, но я вижу, что некоторые разделы моего файла становятся произвольно сложены. Может кто-нибудь, пожалуйста, отправьте точные шаги, чтобы сделать следующее: 1. Сложите на основе env varibles, например. если есть #ifdef, а переменная env не установлена, то сбрасывайте. 2. Сложите все ifdefs (независимо от того, насколько глубоко в иерархии), и если вы хотите их увидеть, вы делаете zo. – 0fnt 2011-02-02 12:51:19

2

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

 
    /* vim: syn region regionName start="regex" end="regex": */ 

0

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

0

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

Это определение символов, определяющих открытые и закрывающие складки. в этом случае open - «< (« и close is »)>« замените их тем, что вы хотите.

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

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

НКУ -E -C -P source.cpp> output.cpp

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

Смежные вопросы