1

I'm having an issue where I would like to be able to create a template which will conditionally insert a string into the template based on the value of one of the fields.

This means I want some sort of embedded elisp (or elisp function call) to evaluate if one of my fields has the value 0. If it does not then I want to include a function definition in the snippet. If the field is 0 then there is no reason to include this function definition.

This is what I have so far but it seems to matter what the string is included and the concatenation fails.

$>registerFn(id, &$1FieldEnd, $1FieldOtherEnd,
$>                ${5:$1Handler}, 0);
`(if (string= (yas-field-value 5) "0")
        (
        " ")
        (
concat (concat "\nstatic void " (concat (yas-field-value 5) "(void *argPtr)"))
"\n
{
/* handlerImplementation */
}
")
)`

Drew
  • 75,699
  • 9
  • 109
  • 225
  • https://emacs.stackexchange.com/tags/elisp/info – Drew Aug 08 '20 at 16:22
  • You use backquote syntax, but you have no comma in the backquoted sexp. In that case, the backquote just acts like quote. Did you forget a comma, perhaps? – Drew Aug 08 '20 at 16:24
  • I'm sorry but I'm not familiar with that syntax are you suggesting that the syntax should be as follows ? ``` `'concat (concat "\nstatic void " (concat (yas-field-value 5) "(void *argPtr)"))` ``` – Reginald Marr Aug 08 '20 at 18:05

2 Answers2

2

On a more general note, here's an example that sets b to the value of a if a is not 0.

# -*- mode: snippet -*-
# name: test
# key: test
# --

a = ${1:0}
b = ${1:$(unless (equal yas-text "0") yas-text)}
$0
jagrg
  • 3,824
  • 4
  • 19
  • This doesn't really address what I'm after. What I was trying to do was include an entire section in the template conditionally. – Reginald Marr Aug 11 '20 at 19:31
  • Not specifically. You'd have to wrap the last yas-text with the code you want to use. – jagrg Aug 12 '20 at 01:34
1

I managed to solve this by simply putting the following in my doom.d/config.el

(with-eval-after-load 'yasnippet
        (defun maybe_notify_snip (snip_str)
            (if (string= snip_str "0")
                " "
                (concat (concat "\nstatic void " (concat snip_str "(void *argPtr)"))
                 "\n
                 {
                 /* handler implementation */
                 }
                 "))))

and then using it inside the template as such:

${5:$(maybe_notify_snip yas-text)}

This seems to ensure that the snippet is updated such that if I enter 0 for field 5 then we don't include a function implementation snippet but as soon as I enter something in filed 5 the implementation appears