Проблема с написанием фрагмента, содержащего код Emacs Lisp

Я пытался использовать классную возможность YASnippet: писать сниппеты, содержащие встроенный код Emacs Lisp. Существует фрагмент для rst-mode, который окружает введенный текст знаком "=", длина которого равна длине текста, например, в

====

Text

====

Основываясь на этом фрагменте, я решил немного изменить его (с помощью Elisp), чтобы он закомментировал эти три строки в зависимости от основного режима, в котором вы находитесь (я подумал, что такой фрагмент будет полезен для организации исходного кода). Итак, я написал это:

${1:`(insert comment-start)`} ${2:$(make-string (string-width text) ?\-)}
$1 ${2:Text}
$1 ${2:$(make-string (string-width text) ?\-)}

$0

Этот код работает относительно хорошо, за исключением одной проблемы: отступы этих трех строк смешиваются в зависимости от основного режима, в котором я нахожусь (например, в emacs-lisp-mode вторая и третья строки сдвигаются вправо. чем первая строка).

Я думаю, что источник проблемы может иметь какое-то отношение к тому, что идет после строки ${1: в первой строке. Если я добавлю символ, у меня не будет проблем (т.е. все три строки правильно выровнены в конце раскрытия фрагмента). Если я добавлю один пробел после этой строки, проблема смещения все равно не исчезнет.

Итак, мой вопрос: знаете ли вы какой-либо способ переписать этот фрагмент, чтобы не возникало этого несоответствия? Вы знаете, в чем причина такого поведения?

Ваше здоровье,


person falsum    schedule 26.12.2010    source источник


Ответы (1)


Из Написание фрагментов:

yas / indent-line

Переменная yas / indent-line управляет отступом. По умолчанию он привязан к 'auto, что приводит к тому, что ваш фрагмент имеет отступ в соответствии с режимом буфера, в который он был вставлен.

Другая переменная yas / also-auto-indent-first-line, когда не-nil делает именно это :-).

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

Чтобы управлять отступом для каждого фрагмента, см. Также директиву # expand-env: в Написании фрагментов.

Для обратной совместимости с более ранними версиями YASnippet вы также можете поместить $> в свой сниппет, там будет выполняться (indent-согласно-режиму) для отступа строки. Это вступает в силу только в том случае, если yas / indent-line имеет значение, отличное от auto.

for (${int i = 0}; ${i < 10}; ${++i})
{$>
$0$>
}$>
person Chen Levy    schedule 28.12.2010
comment
Позор мне, что я это пропустил! Установка переменной yas / indent-line на fixed полностью решила мою проблему. Большое спасибо Чен Леви за указание на это. - person falsum; 29.12.2010