пытаюсь написать файл синтаксиса

и другие vi-подобные редакторы

Модератор: /dev/random

Аватара пользователя
jojahti
Сообщения: 310

пытаюсь написать файл синтаксиса

Сообщение jojahti »

Помогите мне найти точку. :)

Код: Выделить всё

let Q ="qwerty\.vim"
echo match(Q, ".")


Она зараза не ищется, чего только не пробую. :wall:
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: пытаюсь написать файл синтаксиса

Сообщение deadhead »

"qwerty\.vim"
на escape последовательность смахивает...
[x] close
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

Можно обратнокосую палочку убрать. Один фиг - не ищет.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: пытаюсь написать файл синтаксиса

Сообщение /dev/random »

match() ищет не подстроку, а регулярное выражение. Точка в регулярном выражении означает "любой символ". Вот вы и находите первый (т.е. с номером 0). Чтобы найти точку, используйте match(Q, "[.]")
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

Аааааааа!! Ищет! Блин, спасибо. :D Целый пол дня парился ведь. ))
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

А почему не экранирует обратнокосая черта? - \.
Если верить учебнику, то она должна этим заниматься.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: пытаюсь написать файл синтаксиса

Сообщение /dev/random »

Потому, что подстановка здесь делается дважды. При задании "строки в кавычках" тоже происходит подстановка, и вместо "\." функция получает ".". Напишите слэш дважды ("\\.") и функция получит "\.", т.е. экранированную точку.

Вообще, эти многократные подстановки - жутко неудобная вещь. Количество слэшей может доходить до десятков, и если пропустить один - потом полгода можно искать ошибку. Поэтому в таких ситуациях лучше вообще избегать экранирования.
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

Аааа. Кажется понятно.

А можно обращаться к произвольным элементам строк, ну наподобие работы с массивом?
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

А если стоит задача вызывать свои скрипты просто по имени, без указания полного пути к ним. Я пробовал ложить в $VIM $HOME, и в поддиректории и прямо в папку - но оно почему-то так не фурычит.

Каким наиболее логичным образом это можно сотворить?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: пытаюсь написать файл синтаксиса

Сообщение /dev/random »

jojahti писал(а):
23.12.2009 13:44
А если стоит задача вызывать свои скрипты просто по имени, без указания полного пути к ним. Я пробовал ложить в $VIM $HOME, и в поддиректории и прямо в папку - но оно почему-то так не фурычит.

Каким наиболее логичным образом это можно сотворить?

Убедитесь, что требуемый каталог перечислен в переменной runtimepath (вызовите :set runtimepath для просмотра). Убедитесь, что для запуска вы используете команду :run, а не :so.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: пытаюсь написать файл синтаксиса

Сообщение /dev/random »

jojahti писал(а):
23.12.2009 11:36
А можно обращаться к произвольным элементам строк, ну наподобие работы с массивом?

:help expr-[]
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

Что означают выражения вида:
"L\='[^\\]'"
Не могу найти в хелпе просто "L".
Как его интерпретировать?

Как будет выглядеть шаблон "пробел ", "любая последовательность символов без пробелов", "(", "чего-то там", ")"?

Я хэлп читаю, но сложных примеров маловато. :rolleyes:

/dev/random
:help expr-[]

А как-то так оно должно работать? let a[2] = 's'
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: пытаюсь написать файл синтаксиса

Сообщение /dev/random »

jojahti писал(а):
27.12.2009 01:24
Что означают выражения вида:
"L\='[^\\]'"
Где?

jojahti писал(а):
27.12.2009 01:24
Не могу найти в хелпе просто "L".
Как его интерпретировать?
Не понял, что вы ищете? какой "L"?

jojahti писал(а):
27.12.2009 01:24
Как будет выглядеть шаблон "пробел ", "любая последовательность символов без пробелов", "(", "чего-то там", ")"?
Здесь под скобками вы имели в виду скобки как символы или выделение фрагмента регекспа?

jojahti писал(а):
27.12.2009 01:24
/dev/random
:help expr-[]

А как-то так оно должно работать? let a[2] = 's'
Нет, со строками []-синтаксис работает только на чтение. Так что надо так:
let a = a[:1] . 's' . a[3:]
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

/dev/random
Где?

Синтаксис си. с.vim

Исходная строка выглядит так:
syn match cCharacter "L\='[^\\]'"

А непонятно что значит в этом выражении L. Помоему это не простой символ. А в хэлпе управляющие начинаются с \. А просто L что значит - непонятно. Такое там часто встречается.

Здесь под скобками вы имели в виду скобки как символы или выделение фрагмента регекспа?

Скобки как символы.

Я себе хочу свою цветовую схему сделать. С самой схемой проблем не возникало. А вот в синтаксисе я хотел добавить подсветку фунций и скобок ограничивающих фрагменты кода. Ну тоесть логику выделить одним цветом. Но по умолчанию сами он ни к чему не относятся и сидят в группе Normal. Нужно добавить их в описании синтаксиса. Но там жуткоужасные шаблоны. 0_0
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: пытаюсь написать файл синтаксиса

Сообщение /dev/random »

jojahti писал(а):
27.12.2009 10:23
Синтаксис си. с.vim

Исходная строка выглядит так:
syn match cCharacter "L\='[^\\]'"

А непонятно что значит в этом выражении L. Помоему это не простой символ.

Простой символ. В C поддерживаются 2 символьных типа: char (однобайтовый) и wchar_t (многобайтовый, юникодовый). В константах это тоже различается: "qwerty" - это строка символов char, а L"qwerty" - строка символов wchar_t. Так что с точки зрения вима это просто символ.


jojahti писал(а):
27.12.2009 10:23
Скобки как символы.

Тогда так: /[[:space:]][^[:space:]]\+(.*)/
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

Ещё вопросик.
1)
Допустим я ищу в строке кавычки.
let str="qqqqqqq'J'wdeqwdq"
Так оно находит - echo match(str, "'[^q]'")
А так нет - echo match(str, "'[^\\]'")

Вопрос: Почему?


Гм. Но вот так вот фурычит echo match(str, "['][^\\][']")



P.S. Регулярные выражения это жесть.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: пытаюсь написать файл синтаксиса

Сообщение /dev/random »

jojahti писал(а):
27.12.2009 17:58
Допустим я ищу в строке кавычки.
let str="qqqqqqq'J'wdeqwdq"
Так оно находит - echo match(str, "'[^q]'")
Так оно находит по чистому совпадению - кавычки являются первым символом, не являющимся "q". В общем случае находить не будет.

jojahti писал(а):
27.12.2009 17:58
А так нет - echo match(str, "'[^\\]'")

Вопрос: Почему?
Опять проблема двойного экранирования. Апострофы здесь являются с точки зрения match ограничителями регекспа. Поэтому нужно делать так:
jojahti писал(а):
27.12.2009 17:58
Гм. Но вот так вот фурычит echo match(str, "['][^\\][']")




jojahti писал(а):
27.12.2009 17:58
Тоесть
"L\='[^\\]'" - ищет L в количестве от нуля до одного. А за ним кавычки без слэша внутри? Но это же бред? Какие здесь ещё L и нафига??
Я описал в предыдущем посте.
wchar_t *wstring = L"qwerty";
- это абсолютно нормальная конструкция в C.

jojahti писал(а):
27.12.2009 17:58
P.S. Регулярные выражения это жесть.
А _vim'овские_ регулярные выражения - жестяная консервная банка.
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

- это абсолютно нормальная конструкция в C.

Ну да - я почти сразу стёр, как въехал, но оказался недостаточно быстр. )))

/[[:space:]][^[:space:]]\+(.*)/

Вложенные первые квадратные скобки обязательны. Без них даёт только два предпоследних символа функции.
Только вот что они дают - я не понял?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: пытаюсь написать файл синтаксиса

Сообщение /dev/random »

jojahti писал(а):
27.12.2009 18:27
/[[:space:]][^[:space:]]\+(.*)/

Вложенные первые квадратные скобки обязательны. Без них даёт только два предпоследних символа функции.
Только вот что они дают - я не понял?

Почитайте что-нибудь про регекспы. Обычные, не вимовские. Хотя бы "man 7 regex".
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

Почитайте что-нибудь про регекспы. Обычные, не вимовские. Хотя бы "man 7 regex".

Спасибо. С этим [:space:] разобрался. )

А фиг ли оно в тексте корректно находит, а так не работает? :WALL:
syn match cRepeat "[[:space:]][^[:space:]]\\+(.*)"
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: пытаюсь написать файл синтаксиса

Сообщение /dev/random »

jojahti писал(а):
28.12.2009 12:10
А фиг ли оно в тексте корректно находит, а так не работает? :WALL:
syn match cRepeat "[[:space:]][^[:space:]]\\+(.*)"

А вот тут уже второй слэш не нужен )))
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

Аааааа!! ;%?*;% 0_0
Почему не нужен!? В echo match() нужен, а тут не нужен?

Шаблон это условие соответствующее строке. А есть ли возможность разделить условие и соответствующее ему выражение? Тоесть к примеру я ищу последовательность символов dd, окружённую o
ooddoo.

То есть я задаю шаблон "[o]dd[o]", но и соответствующая строка будет oddo.

Вопрос такой: Есть ли возможность включить в шаблон условие, но что бы соответствующая строка включала только выбранные элементы? Тоесть я ищу не последовательность oddo, а строку dd окружённую символами o. Это не слишком извращение? :rolleyes:
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: пытаюсь написать файл синтаксиса

Сообщение /dev/random »

jojahti писал(а):
28.12.2009 13:32
Аааааа!! ;%?*;% 0_0
Почему не нужен!? В echo match() нужен, а тут не нужен?
Потому, что это уже _не_ строковая константа. Там лишний слэш появлялся из-за того, что шаблон задавался через строковую константу. Здесь же шаблон задаётся так: любой (почти) символ, шаблон, тот же символ. И то, что в качестве этого символа в данном примере выбрали кавычку, не делает шаблон строковой константой.

jojahti писал(а):
28.12.2009 13:32
Шаблон это условие соответствующее строке. А есть ли возможность разделить условие и соответствующее ему выражение? Тоесть к примеру я ищу последовательность символов dd, окружённую o
ooddoo.

То есть я задаю шаблон "[o]dd[o]", но и соответствующая строка будет oddo.

Вопрос такой: Есть ли возможность включить в шаблон условие, но что бы соответствующая строка включала только выбранные элементы? Тоесть я ищу не последовательность oddo, а строку dd окружённую символами o. Это не слишком извращение? :rolleyes:

o\@<=ddo\@=

Подробности:
:help \@=
и дальше по тексту.
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

Ёлки иголки! Да вы просто кладезь знаний по вим. :thumbs:


Ыыыы. Тоесть наиболее логично сделать подсветку функций таким образом?
"[[:space:]][^[:space:]]\+(\(.*)\)\@="
"\([[:space:]][[:space:]]\+(.*\)\@<=)"
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: пытаюсь написать файл синтаксиса

Сообщение /dev/random »

jojahti писал(а):
28.12.2009 16:37
Ыыыы. Тоесть наиболее логично сделать подсветку функций таким образом?
"[[:space:]][^[:space:]]\+(\(.*)\)\@="
"\([[:space:]][[:space:]]\+(.*\)\@<=)"

В принципе логично, если не считать того, что вы пропустили '^'. Но логичнее было бы подправить файл синтаксиса c.vim, добавив в него сразу после строк вида
syn region cParen transparent start='(' end=')' contains= [...]
(где [...] - продолжение строки)
строки вида
syn region cCall transparent matchgroup=cRepeat start='[[:alnum:]_]\+[[:space:]]*(' end=')' contains= [...]
(где [...] - то же самое продолжение, что и в предыдущей строке)
Всего придётся добавить 3 строки (в моей версии вима они будут идти после строк 80, 86, 92).
Ваш же вариант будет неправильно обрабатывать такие строки:
qwerty(foo(q), bar(w));

PS: цветовыделение здесь регулируется именем, идущим после matchgroup=

PPS: И я бы посоветовал использовать не cRepeat (его я взял из ваших предыдущих примеров), а Function. ИМХО больше подходит по цвету и не создаёт путаницы.
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

Вроде всё содержимое c.vim ясно.
Но чего-то не допру, что делает параметр display.
В таких вот например выражениях:
syn match cFormat display "%%" contained
Не могу интерпретировать справку.

И я бы посоветовал использовать не cRepeat (его я взял из ваших предыдущих примеров), а Function. ИМХО больше подходит по цвету и не создаёт путаницы.

Ну цвет не проблема самому переопределить. Собственно я всего-то первоначально хотел подсветку поменять. )))

У меня появилась идея, не знаю пока насколько удачная, - выделить всю организующую логику(циклы, скобки, выделяющие блоки кода, функции) - одним цветом.

Да и c.vim уже давно и безнадёжно сломался. :oops: Он теперь чего-то странное подсвечивает.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: пытаюсь написать файл синтаксиса

Сообщение /dev/random »

jojahti писал(а):
29.12.2009 15:21
Вроде всё содержимое c.vim ясно.
Но чего-то не допру, что делает параметр display.
В таких вот например выражениях:
syn match cFormat display "%%" contained
Не могу интерпретировать справку.

Строки, которые предназначены только напрямую для подсветки и не используются в других строках, можно пометить как display. Это ускорит обработку файла синтаксиса вимом. Если же этот параметр вписать в строку, которая используется в других строках, это может нарушить обработку синтаксиса.
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

А как привязать файл синтаксиса к расширению файла?
У меня есть файл rzsyn.vim

Нашёл такой способ. В .vimrc добавил эти строки.
syntax enable
autocmd BufRead, BufNewFile *.cpp set filetype=rzsyn


Но чего-то эта команда не работает с любыми типами файлов. Даже уже не определёнными.

rzsyn.vim точно нормальный ) и вручную корректно подхватывается.
-----------------------------------------

P.S. А, усё, разобрался.
Я поместил эту команду в $VIMRUNTIME/ftdetec/rz.vim

Вопрос - почему не пашет в .vimrc?
Спасибо сказали:
Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: пытаюсь написать файл синтаксиса

Сообщение Luinnar »

jojahti писал(а):
30.12.2009 10:58
autocmd BufRead, BufNewFile *.cpp set filetype=rzsyn[b]
Но чего-то эта команда не работает с любыми типами файлов. Даже уже не определёнными.

Команда эта не работает, так как пробел между BufRead, и BufNewFile лишний, нужно так:
autocmd BufRead,BufNewFile *.cpp set filetype=rzsyn
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: пытаюсь написать файл синтаксиса

Сообщение jojahti »

Ааааа ясно. А, ну правильно. Я же, полез потом в хелп и скопировал оттуда пример без ошибок. :sleep:

ААААААА!!! 0_0

line 1:
E185: Cannot find color scheme rztem^M
line 3:
E492: Not an editor command: ^M
line 4:
E492: Not an editor command: ^M
line 8:
E492: Not an editor command: ^M
line 9:
E488: Trailing characters: incsearch^M
line 10:
E488: Trailing characters: number^M
line 12:
E492: Not an editor command: ^M
line 14:
E492: Not an editor command: ^M
line 17:
E492: Not an editor command: ^M


Я щас кого-нибудь покусаю ?*%:*?:.

У меня запилены цветовая схема и подсветка синтаксиса. До этого всё пахало на виндовском гвиме.
И вот я взял свои файлики и хотел продолжить знакомство с редактором в убунте и он даёт этот бред. Какие ещё ^M!?
Почему background=dark^M - ошибка!? hi clear - ошибка?? :wacko:
Спасибо сказали:
Ответить