<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Lex Technica (yasnippet)</title><link>http://code.lexarcana.com/</link><description></description><atom:link href="http://code.lexarcana.com/categories/yasnippet.xml" type="application/rss+xml" rel="self"></atom:link><language>en</language><lastBuildDate>Tue, 30 Jun 2015 15:33:18 GMT</lastBuildDate><generator>http://getnikola.com/</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Make company-yasnippet play nice</title><link>http://code.lexarcana.com/posts/make-company-yasnippet-play-nice.html</link><dc:creator>Ravi R Kiran</dc:creator><description>&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="http://company-mode.github.io/"&gt;Company mode&lt;/a&gt; is an excellent completion mechanism for emacs, much better than its documentation would lead one to believe. The best keybinding for company mode completion to common prefix is &lt;tt class="docutils literal"&gt;TAB&lt;/tt&gt;, which, however, is also the best keybinding for &lt;a class="reference external" href="https://github.com/capitaomorte/yasnippet"&gt;yasnippet&lt;/a&gt;. The simplest solution would seem to be to use company mode to drive yasnippet. Such a back end for company mode already exists: &lt;a class="reference external" href="https://github.com/company-mode/company-mode/blob/master/company-yasnippet.el"&gt;company-yasnippet&lt;/a&gt; bundled with company mode. By default, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;company-yasnippet&lt;/span&gt;&lt;/tt&gt; is not enabled since it is &lt;a class="reference external" href="https://github.com/company-mode/company-mode/blob/master/company-yasnippet.el#L63"&gt;painful to use with other back ends&lt;/a&gt;. My solution has been to bind &lt;tt class="docutils literal"&gt;shift+TAB&lt;/tt&gt; (called &lt;tt class="docutils literal"&gt;&amp;lt;backtab&amp;gt;&lt;/tt&gt; in emacs keymap lingo) to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;company-yasnippet&lt;/span&gt;&lt;/tt&gt; and not enable it by default, but the problem is that the default company mode completion is activated after typing in a snippet prefix, and sets up a transient keymap that simply ignores &lt;tt class="docutils literal"&gt;shift+TAB&lt;/tt&gt;. We can work around the problem with a little bit of elisp:&lt;/p&gt;
&lt;pre class="code elisp"&gt;&lt;a name="rest_code_43890675e1dd43df8407d28e76720802-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;ravi/company-to-yasnippet&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_43890675e1dd43df8407d28e76720802-2"&gt;&lt;/a&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_43890675e1dd43df8407d28e76720802-3"&gt;&lt;/a&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;company-abort&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_43890675e1dd43df8407d28e76720802-4"&gt;&lt;/a&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;call-interactively&lt;/span&gt; &lt;span class="ss"&gt;'company-yasnippet&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_43890675e1dd43df8407d28e76720802-5"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;bind-key&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;backtab&amp;gt;"&lt;/span&gt; &lt;span class="ss"&gt;'ravi/company-to-yasnippet&lt;/span&gt; &lt;span class="nv"&gt;company-active-map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_43890675e1dd43df8407d28e76720802-6"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;bind-key&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;backtab&amp;gt;"&lt;/span&gt; &lt;span class="ss"&gt;'company-yasnippet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;The trick is that we need to call &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;company-abort&lt;/span&gt;&lt;/tt&gt; before we call &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;company-yasnippet&lt;/span&gt;&lt;/tt&gt;, but only perform this extra step when company mode completion is active.&lt;/p&gt;&lt;/div&gt;</description><category>company-mode</category><category>emacs</category><category>yasnippet</category><guid>http://code.lexarcana.com/posts/make-company-yasnippet-play-nice.html</guid><pubDate>Sun, 21 Jun 2015 04:07:20 GMT</pubDate></item></channel></rss>