найти правильную конечную последовательность для выделения области синтаксиса vim - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть файл синтаксиса с:

syn region matlabLoop
            \ matchgroup=matlabRepeat
            \ start="\<for\>"
            \ end="\<end\>"
            \ transparent
            \ fold
hi def link matlabRepeat        Repeat

Когда я использую это в файле, я получаю следующее (в matlab end используется несколько раз. Он может завершить оператор цикла / if / switch или использоваться как «последняя запись в массиве» (-1 в некоторых других языках), поэтому здесь *end* будет использоваться для маркировки выделенного слова, обратите внимание, что символы * отсутствуют в программе вокруг end)

a =  rand(1,3); % something like [0.0123145 1 0.545341]
for i = 1:numel(a)
    if numel(a(i:*end*)) ==numel(a)
        fprintf('i is probably 1')
    *end*
end

1 Ответ

0 голосов
/ 02 ноября 2018

Это не может работать только с этим единственным matlabLoop регионом. Вам также необходим полный анализ структуры if...end; то есть другое определение синтаксиса для всего блока условий. Или вы расширяете существующий синтаксический скрипт $VIMRUNTIME/syntax/matlab.vim (со свертыванием)? В следующем предполагается, что (но решение также применимо к автономному определению синтаксиса).

Этот синтаксический сценарий определяет простое ключевое слово для end, поэтому оно будет соответствовать где угодно. Если вы хотите исключить i:end из соответствия, вам нужно сделать это соответствие более точным, например, с отрицательным взглядом за утверждением («не должно предшествовать двоеточие» - я не знаю синтаксис Matlab, так что это всего лишь предложение по технике, а не полностью правильное решение).

Это оригинальное определение из синтаксического скрипта:

syn keyword matlabConditional       else elseif end if otherwise

Чтобы удалить end, мы должны очистить его и переопределить:

syntax clear matlabConditional
syntax keyword matlabConditional else elseif if otherwise

Теперь мы можем указать более точную спецификацию, используя :help /\@<! для подтверждения отсутствия двоеточия впереди и \<...\> для сохранения границ ключевых слов исходного определения:

syntax match matlabConditional ":\@<!\<end\>"

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

...