Поставил перед собой такую задачу: написать простой сниппет для if для лиспов.
Я хочу добиться поведения в котором в случае короткой записи if укладывался бы в одну строку, а в случае длинной использовался перенос строки. Что то вроде:
(if (> a b) a b)
(if (long-condition)
(long-then-section)
(long-else-section))
А еще в if может отсутствовать else-часть и в этом случае не должно быть одиночной скобки на строке.
Я столкнулся с двумя проблемами, разрешить которые не смог.
Первая проблема - мне нужно узнать длинну всей конструкции. Написать что то вроде
(if ${1:$$(код парсинга выражения))
Написать
(if ${4:$1 $2 $3})
Вторая проблема в выравнивании. Для примера(только для примера!) я пишу такой сниппет:
(if $1${1:$(if (> (length yas/text) 10) «\n\t» "")} $2${2:$(if (> (length yas/text) 10) «\n\t» "")} $3) $0
С короткой записью он работает, с длинной выходит вот так:
(if (long-condition)
(then-section)
(else-section))
(if (long-condition)
(then-section)
(else-section))
Сразу замечу, я срашиваю не только для if'а, просто на его примере...