2014-01-08 9 views
2

Я работаю с кодом LLVM-IR, созданным clang -emit-llvm и хочу получить код, складывающий работу.Синтаксис LLVM-IR складной для Vim

До сих пор я использую foldmethod=expr и foldexpr=LLVMFold(). Я хотел бы использовать сгибание на основе синтаксиса (т. Е. foldmethod=syntax) с использованием файла синтаксиса из репозитория llvm. Available here.

Обратите внимание, что первое регулярное выражение из файла синтаксиса для метки.

function! LLVMFolds() 
    let thisline = getline(v:lnum) 
    if match(thisline, '^[-a-zA-Z$._][-a-zA-Z$._0-9]*:') >= 0 
     return ">2" 
    elseif match(thisline, '^\}$') >= 0 
     return "<1" 
    elseif match(thisline, '{$') >= 0 
     return ">1" 
    else 
     return "=" 
    endif 
endfunction 

Которая зажимает закрывающие фигурные скобки на уровне 2 складок.

также попытался было foldmethod=indent, не фолд достаточно и foldmethod=marker с foldmark="{,}" В идеале для этого образца неполной LLVM-IR код:

define i32 @main() nounwind { 
entry: 
    %retval = alloca i32, align 4 

for.cond:           ; preds = %entry 
    %4 = load i32* %i, align 4 
    %cmp1 = icmp slt i32 %4, 10 
    br i1 %cmp1, label %for.body, label %for.end 
} 

Я хотел сгибы быть от { в define к } и в каждой помеченной секции, то есть от entry: до четкой линии.

ответ

0

я использовал эту функцию в настоящее время

function! LLVMFolds() 
    let thisline = getline(v:lnum) 
    let nextline = getline(v:lnum + 1) 
    " match start of global var block 
    if match(thisline, '^@') == 0 && foldlevel(v:lnum - 1) <= 0 
     return ">1" 
    " match start of global struct block 
    elseif match(thisline, '^%') == 0 && foldlevel(v:lnum - 1) <= 0 
     return ">1" 
    " matches lables 
    elseif match(thisline, '^[-a-zA-Z$._][-a-zA-Z$._0-9]*:') >= 0 
     return ">2" 
    " keep closing brace outside l2 fold 
    elseif match(nextline, '^\}$') >= 0 
     return "<2" 
    " keep closing brace in l1 fold 
    elseif match(thisline, '^\}$') >= 0 
     return "<1" 
    " open new l1 fold for open brace 
    elseif match(thisline, '{$') >= 0 
     return ">1" 
    " for the next line being empty, close the fold for the var and struct blocks 
    elseif match(nextline, '^$') >= 0 
     if match(thisline, '^@') == 0 && foldlevel(v:lnum - 1) == 1 
      return "<1" 
     elseif match(thisline, '^%') >= 0 && foldlevel(v:lnum - 1) == 1 
      return "<1" 
     else 
      return "=" 
     endif 
    else 
     return "=" 
    endif 
endfunction 

что исключает закрывающую фигурную скобку от уровня в 2 раза, и складывает начальные списки глобальных структур и переменных.

+0

Это подсветка синтаксиса и ftdetect доступны на моем [GitHub] (https://github.com/EdJoJob/llvmir-vim) – EdJoJob

1

Я не думаю, что

:set foldmethod=syntax 

собирается помочь с файлом синтаксиса в вашей ссылке, так как этот файл не определяет никаких fold аргументов.

Ваш LLVMFolds() Функция, кажется, делает почти то, что вы хотите, но (если я правильно понимаю) вы не хотите, чтобы фолд включал линию }. Может быть, что вы хотите, чтобы предыдущая строка заканчивается складка, как это:

function! Foo(lnum) 
    let thisline = getline(v:lnum) 
    let nextline = getline(v:lnum + 1) 
    if match(thisline, '^[-a-zA-Z$._][-a-zA-Z$._0-9]*:') >= 0 
     return ">2" 
    elseif match(nextline, '^\}$') >= 0 
     return "<1" 
    elseif match(thisline, '{$') >= 0 
     return ">1" 
    else 
     return "=" 
    endif 
endfunction 

Это может или не может делать то, что вы хотите, если нет границы между { и }. Для целей тестирования, попробуйте

:set fdm=expr foldexpr=LLVMFolds() fdc=5 

Ссылки:

:help fold-syntax 
:help :syn-fold 
:help fold-expr 
+0

Действительно ли это «RTFM»? – jerry

+0

Нет, но я хотел отделить три строки ': help' от предыдущей строки': set', и я не мог придумать ничего лучшего. – benjifisher

+0

Произошло бы что-то такое же простое, как «Руководства»: «Документация:» или «Вы можете узнать больше, читая страницы справки». Я знаю, что «RTFM» распространен в некоторых кругах, и некоторые люди не будут оскорблены им, но многие будут. – jerry

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

  • Нет связанных вопросов^_^