Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problem writing a snippet containing Emacs Lisp code

I've been trying to make use of a cool feature of YASnippet: write snippets containing embedded Emacs Lisp code. There is a snippet for rst-mode that surrounds the entered text with "=" that is as long as the text such as in

====

Text

====

Based on this snippet, I decided to slightly modify it (with Elisp) so that it comments out these three lines depending on the major mode you are in (I thought that such a snippet would be useful to organize the source code). So I wrote this:

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

$0

This code works relatively well except for one problem: the indentation of these three lines gets mixed up, depending on the major mode I'm in (e.g., in emacs-lisp-mode, the second and the third lines move more to the right than the first line).

I think the source of the problem might have something to do with what comes after the string ${1: on the first line. If I add a character, I have no problem (i.e., all three lines are correctly aligned at the end of the snippet expansion). If I add a single space after this string, the misalignment problem still continues though.

So my question is: do you know of any way of rewriting this snippet so that this misalignment does not arise? Do you know what's the source of this behaviour?

Cheers,

like image 733
falsum Avatar asked Nov 06 '22 05:11

falsum


1 Answers

From Writing snippets:

yas/indent-line

The variable yas/indent-line controls the indenting. It is bound to 'auto by default, which causes your snippet to be indented according to the mode of the buffer it was inserted in.

Another variable yas/also-auto-indent-first-line, when non-nil does exactly that :-).

To use the hard-coded indentation in your snippet template, set this variable to fixed.

To control indentation on a per-snippet basis, see also the directive # expand-env: in Writing Snippets.

For backward compatibility with earlier versions of YASnippet, you can also place a $> in your snippet, an (indent-according-to-mode) will be executed there to indent the line. This only takes effect when yas/indent-line is set to something other than 'auto.

for (${int i = 0}; ${i < 10}; ${++i})
{$>
$0$>
}$>
like image 183
Chen Levy Avatar answered Nov 09 '22 15:11

Chen Levy