- PVSM.RU - https://www.pvsm.ru -
Многие наверняка знают, что для HTML & CSS существует великолепный инструмент ZenCoding(emmet), который позволяет очень сильно упростить ввод рутинных конструкций языка, определяя специальный язык мнемоник. C# менее многословный язык, чем Html, но тем не менее, ввод его конструкций можно здорово оптимизировать.
Я предлагаю динамическое расширение идеи мнемоник, впервые услышанное мною от Дмитрия Нестерука [1 [1]].
Получился небольшой плагин для ReSharper, мнемоники для которого можно настраивать через специальный язык, похожий на формальную грамматику.
Плагин для ReSharper доступен в галерее расширениий. Исходный код на GitHub [2]
Основная идея, которая заложена в ZenSharp — создать такой язык, в котором сразу можно определить два языка — язык сокращений и соответсвующее ему полное написание.
Весь файл определений сокращений (*.ltg) состоит из двух частей:
Простой пример определения правила: если хотим, чтобы по набору ex текст раскрывался в expand text, то стартовое правило необходимо определить так:
start ::= "expand text"="ex"
Такие правила я называю «определяющими сокращение».
Всего существует три типа правил:
В языке описания шаблонов есть немного сахара:
start ::=
| rulea
| ruleb
Проще объяснить зачем все это нужно на реальном примере. Возьмем небольшую
часть стандартных правил:
interface ::= access "interface"=i space classBody
class ::= access ("sealed "=s)? ("class"=c | "static class"=C) space classBody
access ::= (internal=i | public=p | private=_ | protected=P) space
classBody ::= identifier "{" cursor "}"
scope "InCSharpTypeAndNamespace" {
start ::= class | interface
}
Предположим, что мы ввели в студии какую-нибудь абракадабру вида pсSome. Понимать как будет происходить раскрытие этого правила необходимо, отталкиваясь от стартового правила start. Это правило определяет две альтернативы — class или interface. Грамматика работает по принципу PEG (parsing expression grammar), т.е. оператор | является оператором упорядоченного выбора.
Проверяется альтернатива class. Внутри class успешно раскрывается access и забирает первую букву p, раскрывая в ее расширенное написание «public ». Далее идет ленивая часть "sealed"=s. У нашей абракадабры осталась часть cSome, и она не подходит под эту часть, поэтому пропускаем ее, ничего не убираем из
сокращения и ничего не добавляем в раскрытие. Далее идет альтернатива из class или static class. Нам подходит class, поэтому имеем раскрытие «public class» и короткую строку Some.
Специальное правило identifier забирает все буквенные символы из сокращения и без изменений передает их в длинное написание (это сделано для удобства).
В итоге, наша абракадабра pcSome превратилась в public class Some { $END$ }.
Автор: aulitin
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/visual-studio/74353
Ссылки в тексте:
[1] 1: https://github.com/JetBrains/mnemonics
[2] GitHub: https://github.com/ulex/ZenSharp
[3] Источник: http://habrahabr.ru/post/243085/
Нажмите здесь для печати.