Nicholas,

Eliding the parts I agree with...

Nicholas D Steeves wrote:
> I suspect that the conversion to a derived major mode should be done
> before this software is suitable for a Debian stable release.

I agree making it a local minor mode, instead of a derived major mode
(derived from yaml-mode) is a weird decision.

I *guess* this is because (AIUI) ansible has three file formats:

  1. yaml + jinja2
     (used for playbook.yaml and inventory.yaml)

  2. ini + weird magic
     (used for inventory.ini, instead of newer inventory.yaml)

  3. plain jinja2 templates
     (e.g. httpd.conf.j2, which becomes /etc/httpd.conf)

...and the ansible-mode author wanted to add the ansible
domain-specific magic to all three.

Personally I only really care about #1, so define-derived-mode from
yaml-mode makes sense to me.

> Were you able to tell if the autocompletion and yasnippets are so
> limited as to be not useful to people who use this functionality?  The
> snippets appear to be surprisingly comprehensive to me.

Sorry, I did not investigate this closely.

If you install ansible on any old system, you can run

    ansible-doc --list   # pick one, e.g. "copy"
    ansible-doc copy

and scroll down to look at the examples.
You can see the same information here (slightly different version):

    https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module

The snippets look to me as if they are derived from these examples.

For me, alarm bells immediately went off because the emacs-ansible
snippets can get out of sync with what the actual ansible codebase
expects.

Most of the snippets seemed to only be 1 or 2 attributes anyway, something like

    - name: $1
      copy: dest=$2 $*

I wouldn't want to be in charge of constantly keeping those in sync with 
ansible.

...having just written that, I recall that some ansible modules are
flagged with "Red Hat promises not to break backwards compatibility",
so I guess those would be OK to have snippets for.

> > It depends on packages named simply "s" and "f" (oy!), but
> > those appear to be in Debian already (elpa-s and elpa-f).
> > I installed those then did
> >
> >     emacs -nw -q \
> >         -l emacs-ansible/ansible.el \
> >         -eval "(require 'yaml-mode)" \
> >         cyber-ansible/Cyber-BCP.yaml \
> >         -eval '(ansible +1)'
> 
> Excellent work, are you interested in joining the Debian Emacsen team?
> It's clear you have the skills. :-)  I'd be happy to answer questions
> and provide guidance if necessary.

Ehhhh, maybe.  :-)
You can find me (as "twb") on #emacs on irc.freenode.net every day.
We can chat about it there.

> > ...and yeah OK, there's more color.  It treats "name: xxxx" specially,
> > and it tries to recognize the embedded jinja2 {{}} {%%} crap without
> > actually resorting to using an actual jinja major mode (via mumamo or
> > mmm).
> 
> This is the most interesting feature imho, eg: a lightweight jinja2
> parser, and should go in the long description.  Whoever fulfills this
> RFP should verify that this functionality can catch jinja2 syntax errors.

I think I oversold that.
It looks to me like it's just a single font lock for {{}}:

    (defvar ansible-playbook-font-lock
      `(("\\({{\\)\\([^}]+\\)\\(}}\\)"
      . #)

I would much rather have a "real" jinja2-mode be mixed into yaml-mode,
similar to how mhtml-mode handles CSS-in-HTML today.
(I realize this is a hard and unfun problem in Emacs.)

Once major gotcha: in ansible files,
the "when" clause has an implicit {{}}, where other clauses don't.
That's definitely domain-specific (i.e. ansible-only) behaviour.

So e.g.

    name: eat {{animal}} for food
    eat: food={{animal}}
    when: animal
    vars:
    - animal: trout

    name: >
      check if {{animal}} is neither a dog not a cat
      (answer is {{'dog' != animal and 'cat' != animal}}')
    eat: food={{animal}}
    vars: animal=trout
    when:
     - animal
     - "'dog' != animal"       # double-quotes are a workaround to avoid
     - "'cat' != animal"       # confusing the yaml parser - the jinja2 parser
                               # never sees them.

Reply via email to