<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title> - nvim</title>
    <link rel="self" type="application/atom+xml" href="https://schilk.co/blog/tags/nvim/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://schilk.co"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-03-12T00:00:00+00:00</updated>
    <id>https://schilk.co/blog/tags/nvim/atom.xml</id>
    <entry xml:lang="en">
        <title>Working with external warnings and diagnostics in NVIM</title>
        <published>2026-01-20T00:00:00+00:00</published>
        <updated>2026-01-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Philipp Schilk
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://schilk.co/blog/nvim-external-diagnostics/"/>
        <id>https://schilk.co/blog/nvim-external-diagnostics/</id>
        
        <content type="html" xml:base="https://schilk.co/blog/nvim-external-diagnostics/">&lt;p&gt;While most modern programming languages feature very advanced editor
integrations especially through LSP server implementations, VLSI, RTL, and
(System)Verilog tooling is always a bit ... &lt;em&gt;different&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Fortunately, these tools are not inherently bad, but rather a little more
old-fashioned. This means that while they might not be as straightforward
to use, the tools and techniques for an efficient workflow are already
out there.&lt;&#x2F;p&gt;
&lt;p&gt;In particular, I was interested in being able to quickly see and navigate to
all the numerous warnings and errors they produce directly in neovim.&lt;&#x2F;p&gt;
&lt;p&gt;I will use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.veripool.org&#x2F;verilator&#x2F;&quot;&gt;verilator&lt;&#x2F;a&gt; - an open-source
SystemVerilog simulator that works by transpiling RTL models to C++ code - as
an example for this post, but these same tools and techniques apply to everything
from commercial simulators and backend tools to any tool that generates errors
and warnings that are attached to a file location.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-quickfix-list&quot;&gt;The Quickfix List&lt;&#x2F;h2&gt;
&lt;p&gt;As is so often the case, this exact feature is already supported in (neo)vim
without any external plugins.&lt;&#x2F;p&gt;
&lt;p&gt;In fact, for a simple C project using a &lt;code&gt;Makefile&lt;&#x2F;code&gt;, you don&#x27;t even have to
configure anything!
The command &lt;code&gt;:make&lt;&#x2F;code&gt; will cause vim to call &lt;code&gt;make&lt;&#x2F;code&gt; with no arguments, capture
its output and parse it into the so-called quickfix list, which you can open
with &lt;code&gt;:cwindow&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
 &lt;br&gt;  
&lt;center&gt;
    
      
      
    
    &lt;a href=&quot;make_qf.png&quot;&gt;
        &lt;img src=&quot;make_qf.png&quot;  width=&quot;70%&quot; &gt;
    &lt;&#x2F;a&gt;
     
    &lt;br&gt;
    &lt;p&gt;Errors produced by &lt;code&gt;:make&lt;&#x2F;code&gt; in the quick-fix list.&lt;&#x2F;p&gt;

    
&lt;&#x2F;center&gt;
 &lt;br&gt;  
&lt;p&gt;As you scroll through the quickfix list, vim will automatically jump to the location of
the errors and warnings.
Even without opening the quickfix list, you can jump between entries using &lt;code&gt;:cn&lt;&#x2F;code&gt; and &lt;code&gt;:cp&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;For more information about the quickfix list, see
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;neovim.io&#x2F;doc&#x2F;user&#x2F;quickfix.html&quot;&gt;&lt;code&gt;:h quickfix&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-makeprg-option-and-cfile&quot;&gt;The &lt;code&gt;makeprg&lt;&#x2F;code&gt; option and &lt;code&gt;cfile&lt;&#x2F;code&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The &lt;code&gt;:make&lt;&#x2F;code&gt; command and quickfix list, despite its name, is not limited to
Makefiles and their output.
The &lt;code&gt;makeprg&lt;&#x2F;code&gt; option controls which command is invoked when &lt;code&gt;:make&lt;&#x2F;code&gt; is called.
For example, the following will cause it to run &lt;code&gt;cargo build&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;viml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; makeprg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;cargo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Any arguments you provide to the &lt;code&gt;:make&lt;&#x2F;code&gt; command will be appended to the end of
&lt;code&gt;makeprg&lt;&#x2F;code&gt;, unless the &lt;code&gt;$*&lt;&#x2F;code&gt; placeholder is used to specify where exactly the
arguments should be inserted:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;viml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; makeprg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;make&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; $*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; verilate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:make MYDEFINE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;make MYDEFINE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt; verilate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;%&lt;&#x2F;code&gt; placeholder will be replaced with the path of the current file,
which is particularly useful for single-file linters or scripts:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;viml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; makeprg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;shellcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; makeprg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;python&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For long-running compilations and programs, running them directly in
vim can be a bit cumbersome.
In such cases, the &lt;code&gt;:cfile&lt;&#x2F;code&gt; command can be used to read program output that has
been written to a file:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;viml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:cfile program_output.log&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The content will be used to populate the quickfix list just like the output
of the &lt;code&gt;:make&lt;&#x2F;code&gt; command.&lt;&#x2F;p&gt;
&lt;p&gt;For more information see
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;neovim.io&#x2F;doc&#x2F;user&#x2F;options.html#&amp;#x27;makeprg&amp;#x27;&quot;&gt;&lt;code&gt;:h makeprg&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;neovim.io&#x2F;doc&#x2F;user&#x2F;quickfix.html#%3Acfile&quot;&gt;&lt;code&gt;:h cfile&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-errorformat-option&quot;&gt;The &lt;code&gt;errorformat&lt;&#x2F;code&gt; option&lt;&#x2F;h3&gt;
&lt;p&gt;The &lt;code&gt;errorformat&lt;&#x2F;code&gt; option, in turn, contains one or more regex-like parsing
rules used to extract the source code location and other metadata from
the &lt;code&gt;:make&lt;&#x2F;code&gt; output or &lt;code&gt;:cfile&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;For example, consider the output of the aforementioned &lt;code&gt;verilator&lt;&#x2F;code&gt; tool:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;%Warning-DECLFILENAME: looong_path&#x2F;tc_clk.sv:11:8: Filename &amp;#39;tc_clk&amp;#39; does not match MODULE name: &amp;#39;tc_clk_and2&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;%Error-PINCONNECTEMPTY: other_path&#x2F;trip_counter.sv:43:10: Instance pin connected by name with empty reference: &amp;#39;overflow_o&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A parsing rule consists of literal text and &lt;code&gt;%&lt;&#x2F;code&gt;-prefixed placeholders.
For the above, a basic rule might look something like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;viml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; errorformat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;%%%t%*[a-zA-Z]-%*[^:]:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %f:%l:%c:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %m&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It consists of the following components:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Component&lt;&#x2F;th&gt;&lt;th&gt;Function&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;%%&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Matches a single &lt;code&gt;%&lt;&#x2F;code&gt; character.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;%t&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Matches a single character which determines the error type. (&lt;strong&gt;E&lt;&#x2F;strong&gt;rror, &lt;strong&gt;W&lt;&#x2F;strong&gt;arning, &lt;strong&gt;I&lt;&#x2F;strong&gt;nfo, &lt;strong&gt;N&lt;&#x2F;strong&gt;ote)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;%*[a-zA-Z]&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Matches one or more lower or uppercase letters. This &quot;consumes&quot; the rest of E&lt;strong&gt;rror&lt;&#x2F;strong&gt;, W&lt;strong&gt;arning&lt;&#x2F;strong&gt;, I&lt;strong&gt;nfo&lt;&#x2F;strong&gt;, or N&lt;strong&gt;ote&lt;&#x2F;strong&gt;.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Matches a single &lt;code&gt;-&lt;&#x2F;code&gt; character.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;%*[^:]&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Matches one or more characters that are not a &lt;code&gt;:&lt;&#x2F;code&gt;.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;:&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Matches a single &lt;code&gt;:&lt;&#x2F;code&gt; character.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;\ &lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Matches a single space (&lt;code&gt; &lt;&#x2F;code&gt;).&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;%f&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Matches a file path.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;%l&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Matches a line number.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;%c&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Matches a column number.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;%m&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Matches an error message (a string).&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;neovim.io&#x2F;doc&#x2F;user&#x2F;quickfix.html#error-file-format&quot;&gt;&lt;code&gt;:h error-file-format&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
contains documentation about how &lt;code&gt;errorformat&lt;&#x2F;code&gt; strings are interpreted, including
many more placeholders and tools.
Consider also having a look at existing compiler plugins as a reference (see below).&lt;&#x2F;p&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
&lt;p&gt;The above &lt;code&gt;errorformat&lt;&#x2F;code&gt; does not cover all possible verilator warnings and
errors. See below for a more complete implementation that handles warnings
without error code and without column.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h3 id=&quot;compiler-plugins&quot;&gt;Compiler Plugins&lt;&#x2F;h3&gt;
&lt;p&gt;(Neo)vim ships a set of pre-configured &lt;code&gt;makeprg&lt;&#x2F;code&gt; and &lt;code&gt;errorformat&lt;&#x2F;code&gt; values
for a number of common compilers and tools.
These take the form of so-called compiler plugins.&lt;&#x2F;p&gt;
&lt;p&gt;For a list of built-in compiler plugins, have a look at the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;neovim&#x2F;neovim&#x2F;tree&#x2F;master&#x2F;runtime&#x2F;compiler&quot;&gt;&lt;code&gt;runtime&#x2F;compiler&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
folder of the (neo)vim source tree.
For a list of compiler plugins available in your current (neo)vim instance you can run:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;viml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; f &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; globpath&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;&amp;amp;rtp&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;#39;compiler&#x2F;*.vim&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;) | &lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; fnamemodify&lt;&#x2F;span&gt;&lt;span&gt;(f,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;#39;:t:r&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;) | &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;endfor&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In typical vim fashion, the set of compiler plugins spans from slightly older tools,
such as different &lt;code&gt;fortran&lt;&#x2F;code&gt; flavours, to slightly more modern tools such as &lt;code&gt;gleam-build&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;A few that might be of interest:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cargo&lt;&#x2F;code&gt; and &lt;code&gt;rustc&lt;&#x2F;code&gt; for rust development.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;eslint&lt;&#x2F;code&gt; and &lt;code&gt;tsc&lt;&#x2F;code&gt; for webdev.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;tex&lt;&#x2F;code&gt; and &lt;code&gt;typst&lt;&#x2F;code&gt; for typesetting.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;And even &lt;code&gt;modelsim_vcom&lt;&#x2F;code&gt;, which is the VHDL compiler in modelsim!&lt;&#x2F;p&gt;
&lt;p&gt;It is worth having a look at the content of the compiler plugin file for a tool
you are intending to use.
Many of them feature extra options and settings you can control via global
variables.
For example, to determine the exact flags with which &lt;code&gt;cargo&lt;&#x2F;code&gt; is called,
the &lt;code&gt;cargo&lt;&#x2F;code&gt; compiler plugin considers the &lt;code&gt;g:cargo_makeprg_params&lt;&#x2F;code&gt; global:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;viml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; runtime&#x2F;compiler&#x2F;cargo.vim:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; exists&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;#39;g:cargo_makeprg_params&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;    execute&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;#39;CompilerSet makeprg=cargo\ &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;.escape&lt;&#x2F;span&gt;&lt;span&gt;(g:cargo_makeprg_params,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;#39; \|&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;#39;\ $*&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    CompilerSet &lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;makeprg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;cargo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; $*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;endif&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;custom-compiler-plugins-verilator&quot;&gt;Custom Compiler Plugins: Verilator&lt;&#x2F;h3&gt;
&lt;p&gt;If you find yourself often parsing the output of a tool that is not
yet included in (neo)vim&#x27;s list of built-in compiler plugins, consider
adding a custom compiler plugin in your configuration.&lt;&#x2F;p&gt;
&lt;p&gt;On linux, new compiler plugins should be placed in &lt;code&gt;$XDG_CONFIG_HOME&#x2F;nvim&#x2F;compiler&#x2F;&lt;&#x2F;code&gt;,
while overrides to existing compiler plugins go in &lt;code&gt;$XDG_CONFIG_HOME&#x2F;nvim&#x2F;after&#x2F;compiler&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;For example, on my machine, to create a new &lt;code&gt;verilator&lt;&#x2F;code&gt; compiler plugin, I create
&lt;code&gt;~&#x2F;.config&#x2F;nvim&#x2F;compiler&#x2F;verilator.vim&lt;&#x2F;code&gt; with the following content:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;viml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; ~&#x2F;.config&#x2F;nvim&#x2F;compiler&#x2F;verilator.vim:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; Verilator warnings always start with &amp;quot;%Error&amp;quot; or &amp;quot;%Warning&amp;quot;, optionally directly&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; followed by an error code. If a location is known, it may be given with or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; without column number. Examples of errors:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; &amp;quot;%Warning: ..msg..&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; &amp;quot;%Error-DECLFORMAT: myfile:1: ..msg..&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; &amp;quot;%Error-PINCONNECT: myfile:1:2: ..msg..&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CompilerSet &lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;errorformat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;%%%t%*[a-zA-Z]-%*[^:]:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %f:%l:%c:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %m,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;			\&lt;&#x2F;span&gt;&lt;span&gt;%%%t%*[a-zA-Z]-%*[^:]:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %f:%l:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %m,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;			\&lt;&#x2F;span&gt;&lt;span&gt;%%%t%*[a-zA-Z]:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %f:%l:%c:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %m,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;			\&lt;&#x2F;span&gt;&lt;span&gt;%%%t%*[a-zA-Z]:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %f:%l:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %m,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;See
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;neovim.io&#x2F;doc&#x2F;user&#x2F;usr_41.html#write-compiler-plugin&quot;&gt;&lt;code&gt;:h write-compiler-plugin&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; for
more info.&lt;&#x2F;p&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
&lt;p&gt;Unfortunately, the &lt;code&gt;%*[^:]&lt;&#x2F;code&gt; pattern used to match the error code causes it to not be
shown in the quickfix list.
Parsing it as a module (&lt;code&gt;%o&lt;&#x2F;code&gt;) will make it visible in the quickfix list, but hide the
file name:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;viml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CompilerSet &lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;errorformat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;%%%t%*[a-zA-Z]-%o:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %f:%l:%c:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %m,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;			\&lt;&#x2F;span&gt;&lt;span&gt;%%%t%*[a-zA-Z]-%o:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %f:%l:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %m,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;			\&lt;&#x2F;span&gt;&lt;span&gt;%%%t%*[a-zA-Z]:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %f:%l:%c:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %m,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;			\&lt;&#x2F;span&gt;&lt;span&gt;%%%t%*[a-zA-Z]:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %f:%l:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;\&lt;&#x2F;span&gt;&lt;span&gt; %m,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;diagnostics&quot;&gt;Diagnostics&lt;&#x2F;h2&gt;
&lt;p&gt;If you instead prefer to display external warnings and errors as
in-line diagnostics in the same style as LSP servers, that is also an option,
but requires a bit of lua scripting.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-vim-diagnostic-api&quot;&gt;The &lt;code&gt;vim.diagnostic&lt;&#x2F;code&gt; API&lt;&#x2F;h3&gt;
&lt;p&gt;To display a set of diagnostics, first create a namespace to contain them:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span&gt; my_namespace&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;api&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;nvim_create_namespace&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;my_namespace&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next, configure how the diagnostics in this namespace should be displayed:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;diagnostic&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;config&lt;&#x2F;span&gt;&lt;span&gt;({&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    virtual_text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    signs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    underline&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    update_in_insert&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}, my_namespace)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Collect all your diagnostics for a given buffer into a table, and use
&lt;code&gt;vim.diagnostic.set()&lt;&#x2F;code&gt; to display them:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span&gt; bufnr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span&gt; diagnostics&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    bufnr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; bufnr, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;-- buffer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    lnum&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;-- line number&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    col&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;-- column&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    severity&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;diagnostic&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;severity&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;WARN&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;-- severity&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    message&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;Something went wrong!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;-- message&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;diagnostic&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt;(my_namespace, bufnr, diagnostics, {})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To remove all diagnostics, including before you re-apply a new set,
use &lt;code&gt;vim.diagnostic.reset()&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;diagnostic&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;reset&lt;&#x2F;span&gt;&lt;span&gt;(my_namespace)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;implementation&quot;&gt;Implementation&lt;&#x2F;h3&gt;
&lt;p&gt;With this, you can write a lua function that parses any external source and
displays them as nvim diagnostics.&lt;&#x2F;p&gt;
&lt;p&gt;Have a look at the documentation of the tool you are using - many feature an
option for generating the diagnostics information in a machine readable format.
Verilator, for instance, can be instructed to write all errors and warnings
to a JSON file with standard SARIF formatting:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; --diagnostics-sarif --diagnostics-sarif-output&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; log.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In addition to seeing the errors inline, I like to use the excellent
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;folke&#x2F;trouble.nvim&quot;&gt;trouble.nvim&lt;&#x2F;a&gt; to also show a quickfix-like
pane with all diagnostics.
If you prefer to use the quickfix list, you can also programatically insert
the diagnostics there.&lt;&#x2F;p&gt;
&lt;p&gt;This approach, while a little bit more work, has the advantage of being
extremely flexible. For example, for my verilator output parsing, I added
simple reload and filtering capabilities:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;viml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; Parse + display verilator diagnostics file:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:VerilatorDiag log.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; Reload diagnostics file:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:VerilatorDiag&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; Only display diagnostics that contain the string &amp;quot;frontend&amp;quot;, and remove any&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; &amp;quot;UNOPTFLAT&amp;quot; and &amp;quot;UNUSEDSIGNAL&amp;quot; diagnostics:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:VerilatorDiagFilter frontend -UNOPTFLAT -UNUSEDSIGNAL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;&amp;quot; Reset&#x2F;clear the diagnostics:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:VerilatorDiagReset&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;notes-resources&quot;&gt;Notes &amp;amp; Resources&lt;&#x2F;h2&gt;
&lt;p&gt;You can find my complete setup in my neovim configuration
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;schilkp&#x2F;dot&#x2F;tree&#x2F;main&#x2F;neovim&#x2F;.config&#x2F;nvim&#x2F;lua&#x2F;schilk&#x2F;utils&#x2F;file_diagnostics&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;A self-contained verilator sarif output parser and diagnostic generator with filtering
as described above follows below:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span&gt; M&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_namespace&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;api&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;nvim_create_namespace&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;diag_verilator&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; nil&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_exclude_filters&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_include_filters&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; M&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;filter_check&lt;&#x2F;span&gt;&lt;span&gt;(file, msg, severity)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span&gt; severity_lower&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; string.lower&lt;&#x2F;span&gt;&lt;span&gt;(severity)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span&gt; diag&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; ..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot; &amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt; msg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;  -- Reject based on exclude filters:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span&gt; _, filter&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; ipairs&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_exclude_filters&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span&gt; filter_lower&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; string.lower&lt;&#x2F;span&gt;&lt;span&gt;(filter)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; string.find&lt;&#x2F;span&gt;&lt;span&gt;(diag, filter) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;or&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; string.find&lt;&#x2F;span&gt;&lt;span&gt;(severity_lower, filter_lower) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;      return&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;  -- If any include filters are defined, check if we match one:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  if #&lt;&#x2F;span&gt;&lt;span&gt;M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_include_filters&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span&gt; any_filter_matches&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; _, filter&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; ipairs&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_include_filters&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;      local&lt;&#x2F;span&gt;&lt;span&gt; filter_lower&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; string.lower&lt;&#x2F;span&gt;&lt;span&gt;(filter)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;      if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; string.find&lt;&#x2F;span&gt;&lt;span&gt;(diag, filter) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;or&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; string.find&lt;&#x2F;span&gt;&lt;span&gt;(severity_lower, filter_lower) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        any_filter_matches&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;      end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    if not&lt;&#x2F;span&gt;&lt;span&gt; any_filter_matches&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;      return&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; M&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;generate_diags&lt;&#x2F;span&gt;&lt;span&gt;(log_file)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; io.open&lt;&#x2F;span&gt;&lt;span&gt;(log_file, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;r&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  if not&lt;&#x2F;span&gt;&lt;span&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;    error&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;Could not open verilator sarif file: &amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt; log_file)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span&gt; content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; file&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;*all&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;  file&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;close&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span&gt; success, data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; pcall&lt;&#x2F;span&gt;&lt;span&gt;(vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;json&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;decode&lt;&#x2F;span&gt;&lt;span&gt;, content)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  if not&lt;&#x2F;span&gt;&lt;span&gt; success&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;    error&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;Invalid JSON&#x2F;SARIF in file: &amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt; log_file)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  if not&lt;&#x2F;span&gt;&lt;span&gt; data[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;runs&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;or #&lt;&#x2F;span&gt;&lt;span&gt;data[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;runs&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;~=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;    error&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;Invalid JSON&#x2F;SARIF in file - not exactly one run: &amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt; log_file)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; data[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;runs&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  if not&lt;&#x2F;span&gt;&lt;span&gt; data[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;results&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;    error&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;Invalid JSON&#x2F;SARIF in file - no results: &amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt; log_file)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; data[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;results&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;  -- per-bufnr diagnostics:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span&gt; diagnostics&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;  -- Iterate through data:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span&gt; _, result&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; ipairs&lt;&#x2F;span&gt;&lt;span&gt;(data) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span&gt; rule_id&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; result[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;ruleId&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      rule_id&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; result[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;ruleId&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span&gt; message&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; rule_id&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; ..&lt;&#x2F;span&gt;&lt;span&gt; (result[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;message&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;text&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;or&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;No message&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span&gt; level&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;diagnostic&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;severity&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;INFO&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; result[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;level&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;error&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      level&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;diagnostic&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;severity&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;ERROR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    elseif&lt;&#x2F;span&gt;&lt;span&gt; result[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;level&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;warning&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      level&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;diagnostic&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;severity&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;WARN&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    if not&lt;&#x2F;span&gt;&lt;span&gt; result[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;locations&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;or #&lt;&#x2F;span&gt;&lt;span&gt;result[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;locations&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;      goto&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; continue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span&gt; loc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; result[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;locations&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;physicalLocation&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    if not&lt;&#x2F;span&gt;&lt;span&gt; loc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; or not&lt;&#x2F;span&gt;&lt;span&gt; loc[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;artifactLocation&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;or not&lt;&#x2F;span&gt;&lt;span&gt; loc[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;region&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;      goto&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; continue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span&gt; file_path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; loc[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;artifactLocation&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;uri&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;gsub&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;^file:&#x2F;&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span&gt; start_line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; loc[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;region&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;startLine&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;or&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span&gt; start_column&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (loc[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;region&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;startColumn&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;or&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    if not&lt;&#x2F;span&gt;&lt;span&gt; M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;filter_check&lt;&#x2F;span&gt;&lt;span&gt;(file_path, message, result[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;level&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;      goto&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; continue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span&gt; bufnr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;bufadd&lt;&#x2F;span&gt;&lt;span&gt;(file_path)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    if not&lt;&#x2F;span&gt;&lt;span&gt; bufnr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;      error&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;Error&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;      return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    if not&lt;&#x2F;span&gt;&lt;span&gt; diagnostics[bufnr] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      diagnostics[bufnr] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;    table.insert&lt;&#x2F;span&gt;&lt;span&gt;(diagnostics[bufnr], {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      bufnr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; bufnr,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      lnum&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; start_line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      col&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; start_column,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      message&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; message,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      severity&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; level,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      source&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;verilator&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;    ::continue::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;  -- Set Diagnostics, per-buffer:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span&gt; cnt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;diagnostic&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;reset&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_namespace&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span&gt; bufnr, diags&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; pairs&lt;&#x2F;span&gt;&lt;span&gt;(diagnostics) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;diagnostic&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_namespace&lt;&#x2F;span&gt;&lt;span&gt;, bufnr, diags, {})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cnt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; cnt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; + #&lt;&#x2F;span&gt;&lt;span&gt;diags&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;  -- Notification:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span&gt; filters&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span&gt; _, f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; ipairs&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_include_filters&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;    table.insert&lt;&#x2F;span&gt;&lt;span&gt;(filters, f)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span&gt; _, f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; ipairs&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_exclude_filters&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;    table.insert&lt;&#x2F;span&gt;&lt;span&gt;(filters, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;-&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt; f)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span&gt; filters_str&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  if #&lt;&#x2F;span&gt;&lt;span&gt;filters&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; ~=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;    -- all filters joined by spaces:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    filters_str&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;Filters: &amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; table.concat&lt;&#x2F;span&gt;&lt;span&gt;(filters, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;notify&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;Found &amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt; cnt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; ..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot; verilator diagnostics.&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt; filters_str)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; M&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;reload&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;generate_diags&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_file&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; M&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;cmd_diags&lt;&#x2F;span&gt;&lt;span&gt;(args)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  if #&lt;&#x2F;span&gt;&lt;span&gt;args.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;fargs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    if not&lt;&#x2F;span&gt;&lt;span&gt; M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;      error&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;No verilator log file set.&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;      return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;generate_diags&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_file&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    local&lt;&#x2F;span&gt;&lt;span&gt; abs_path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;fnamemodify&lt;&#x2F;span&gt;&lt;span&gt;(args.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;args&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;:p&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; abs_path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;generate_diags&lt;&#x2F;span&gt;&lt;span&gt;(abs_path)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; M&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;cmd_reset&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; nil&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_exclude_filters&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_include_filters&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;diagnostic&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;reset&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_namespace&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; M&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;cmd_clear&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;diagnostic&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;reset&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_namespace&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; M&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;cmd_filter&lt;&#x2F;span&gt;&lt;span&gt;(args)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_exclude_filters&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_include_filters&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span&gt; _, arg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; ipairs&lt;&#x2F;span&gt;&lt;span&gt;(args.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;fargs&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;startswith&lt;&#x2F;span&gt;&lt;span&gt;(arg, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;-&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;      table.insert&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_exclude_filters&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;arg&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;sub&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;      table.insert&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_include_filters&lt;&#x2F;span&gt;&lt;span&gt;, arg)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;generate_diags&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_file&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; M&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;setup&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;diagnostic&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;config&lt;&#x2F;span&gt;&lt;span&gt;({&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    virtual_text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    signs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    underline&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    update_in_insert&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }, M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;verilator_namespace&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;api&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;nvim_create_user_command&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;VerilatorDiagReset&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;cmd_reset&lt;&#x2F;span&gt;&lt;span&gt;, { nargs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt; })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;api&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;nvim_create_user_command&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;VerilatorDiagClear&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;cmd_clear&lt;&#x2F;span&gt;&lt;span&gt;, { nargs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt; })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;api&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;nvim_create_user_command&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;VerilatorDiag&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;cmd_diags&lt;&#x2F;span&gt;&lt;span&gt;, { nargs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;?&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, complete&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;file&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;api&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;nvim_create_user_command&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;VerilatorDiagFilter&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;cmd_filter&lt;&#x2F;span&gt;&lt;span&gt;, { nargs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;*&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span&gt; M&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Managing project-specific NVIM configuration</title>
        <published>2026-01-19T00:00:00+00:00</published>
        <updated>2026-03-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Philipp Schilk
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://schilk.co/blog/nvim-local-conf/"/>
        <id>https://schilk.co/blog/nvim-local-conf/</id>
        
        <content type="html" xml:base="https://schilk.co/blog/nvim-local-conf/">&lt;h2 id=&quot;one-size-fits-not-quite-all&quot;&gt;One size fits not quite all&lt;&#x2F;h2&gt;
&lt;p&gt;While my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;schilkp&#x2F;dot&#x2F;tree&#x2F;main&#x2F;neovim&#x2F;.config&#x2F;nvim&quot;&gt;neovim configuration&lt;&#x2F;a&gt;
works out of the box for most of the projects I work on, I have increasingly encountered
situations where I need to adjust certain aspects on a per-project basis.&lt;&#x2F;p&gt;
&lt;p&gt;For example, while doing some work with LLVM, I wanted to make use of the
MLIR and TableGen LSP servers.
While I could install these on my machine and add them to my main neovim configuration,
it is in many ways much better to use the specific binaries built from the LLVM tree I am
currently editing - that way any changes I make to, for example, an MLIR dialect,
are immediately available in the MLIR LSP after a quick re-compile.&lt;&#x2F;p&gt;
&lt;p&gt;There is nothing stopping me from adding such edge-case checks to my
main configuration - but that does not scale nicely and inevitably leaves
behind a whole bunch of configuration snippets I don&#x27;t actively use, but don&#x27;t
want to delete in case I go back to a project in the future.
I would much prefer a strategy that allows me to keep such per-project
configuration with the actual project.&lt;&#x2F;p&gt;
&lt;p&gt;As with anything related to neovim configuration there are about 50 different
ways this can be achieved, and because neovim is usually configured
with executable code instead of declarative config files, there are a few gotchas that
might not be immediately obvious.
Therefore I thought it might be useful to quickly write up how the setup I
landed on works, and my thoughts behind why I built it in this way.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;notable-built-in-features-plugins&quot;&gt;Notable built-in features &amp;amp; plugins&lt;&#x2F;h2&gt;
&lt;p&gt;First, a quick overview of some built-in features and plugins that
are related to this subject:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;neo-vim-s-exrc-option&quot;&gt;(Neo)Vim&#x27;s &lt;code&gt;exrc&lt;&#x2F;code&gt; option&lt;&#x2F;h3&gt;
&lt;p&gt;The &lt;code&gt;exrc&lt;&#x2F;code&gt; option is the historical solution to this problem, dating all
the way back to &lt;code&gt;vi&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;viml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; exrc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;On startup, when this option is set, vim will look for a &lt;code&gt;.vimrc&lt;&#x2F;code&gt; or &lt;code&gt;.exrc&lt;&#x2F;code&gt;
vimscript file in the current directory, while neovim will look for a &lt;code&gt;.nvimrc&lt;&#x2F;code&gt;
or &lt;code&gt;.exrc&lt;&#x2F;code&gt; vimscript file, or a &lt;code&gt;.nvim.lua&lt;&#x2F;code&gt; lua script file.
If one such file is found, after the system and main user configuration is
loaded, (neo)vim will &lt;code&gt;:source&lt;&#x2F;code&gt; this file, executing whatever code it contains.&lt;&#x2F;p&gt;
&lt;blockquote class=&quot;markdown-alert-caution&quot;&gt;
&lt;p&gt;Without any additional security mechanism, this option will execute arbitrary
code when opening your editor without any prompt or confirmation.
NeoVim features some mitigation to make this less risky - see below.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Have a look at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;neovim.io&#x2F;doc&#x2F;user&#x2F;options.html#&amp;#x27;exrc&amp;#x27;&quot;&gt;&lt;code&gt;:h exrc&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; for more information.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;neovim-s-trust-list&quot;&gt;NeoVim&#x27;s &lt;code&gt;:trust&lt;&#x2F;code&gt; list&lt;&#x2F;h3&gt;
&lt;p&gt;As executing arbitrary code when opening your editor in some repository you
just cloned from the internet is not an amazing idea, neovim introduced
&lt;code&gt;vim.secure.read()&lt;&#x2F;code&gt; and the associated &lt;code&gt;trust&lt;&#x2F;code&gt; list in &lt;code&gt;v0.9.0&lt;&#x2F;code&gt;
(released in 2022 - &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;neovim&#x2F;neovim&#x2F;commit&#x2F;f1922e78a1df1b1d32779769432fb5586edf5fbb&quot;&gt;&lt;code&gt;f1922e7&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;When attempting to read a file for the first time using &lt;code&gt;vim.secure.read()&lt;&#x2F;code&gt;, neovim will
prompt the user to view the file and explicitly trust it:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:lua vim.secure.read(&amp;quot;README.md&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;exrc: Found untrusted code. To enable it, choose (v)iew then run `:trust`:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;home&#x2F;schilkp&#x2F;repos&#x2F;schilkp.github.io&#x2F;README.md&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[i]gnore, (v)iew, (d)eny:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Only if the user actually marks the file as trusted, will the content be read.&lt;&#x2F;p&gt;
&lt;p&gt;The location and name of the file, a sha256 hash of its content, and the user
decision will be stored in the &lt;code&gt;trust&lt;&#x2F;code&gt; list, located at &lt;code&gt;$XDG_STATE_HOME&#x2F;nvim&#x2F;trust&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;d84ce812f0b22bf6fd2502d9deadbeef2229931192efef1abc0002091b40 &#x2F;home&#x2F;schilkp&#x2F;repos&#x2F;schilkp.github.io&#x2F;README.md&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;! &#x2F;home&#x2F;schilkp&#x2F;Downloads&#x2F;random_project&#x2F;sketchy_file_i_dont_trust.lua&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After it has been trusted, successive secure reads of this file will complete
without a user prompt, unless the file content or location has changed.
In neovim, &lt;code&gt;vim.secure.read()&lt;&#x2F;code&gt; is used for reading the content of any file
discovered and sourced through the &lt;code&gt;exrc&lt;&#x2F;code&gt; option mechanism, making it significantly
less reckless
(&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;neovim&#x2F;neovim&#x2F;commit&#x2F;294910a1ffd11bea0081c2b92632628ef0462eb1&quot;&gt;&lt;code&gt;294910a&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;See &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;neovim.io&#x2F;doc&#x2F;user&#x2F;lua.html#vim.secure&quot;&gt;&lt;code&gt;:h vim.secure&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; for more information.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;a-long-list-of-plugins&quot;&gt;A long list of plugins&lt;&#x2F;h3&gt;
&lt;p&gt;Per-project configuration is a common need, and there are also quite a few
plugins available to help you manage it, including
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tpope&#x2F;vim-projectionist&quot;&gt;&lt;code&gt;tpope&#x2F;vim-projectionist&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;klen&#x2F;nvim-config-local&quot;&gt;&lt;code&gt;klen&#x2F;nvim-config-local&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, and
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;direnv&#x2F;direnv.vim&quot;&gt;&lt;code&gt;direnv&#x2F;direnv&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;my-setup&quot;&gt;My setup&lt;&#x2F;h2&gt;
&lt;p&gt;With the &lt;code&gt;vim.secure.read()&lt;&#x2F;code&gt; mechanism, the &lt;code&gt;exrc&lt;&#x2F;code&gt; option in neovim is already
fairly close to what I want.
Its one major limitation for my use is that it is sourced &lt;em&gt;after&lt;&#x2F;em&gt; my main
configuration and therefore after all plugins are configured and loaded.
This makes it tricky to do things like adding new plugins, or disabling LSP
servers and features that my main configuration enables - by the time a &lt;code&gt;.nvim.lua&lt;&#x2F;code&gt;
file is sourced, all this is already done.&lt;&#x2F;p&gt;
&lt;p&gt;For a similar reason, using one of the many plugins is also not so attractive,
as I ideally want my local configuration to be available before my plugin
manager sources all plugins.&lt;&#x2F;p&gt;
&lt;p&gt;Instead, I opted to implement a simple version of the &lt;code&gt;exrc&lt;&#x2F;code&gt; option directly
in my configuration:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;--- local_config.lua&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span&gt; M&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;CONFIG_FILE_NAMES&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; { &lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;.schilk.nvim.lua&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;--- Look for local config file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; M&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;lookup&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span&gt; _, filename&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; ipairs&lt;&#x2F;span&gt;&lt;span&gt;(M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;CONFIG_FILE_NAMES&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    filename&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;findfile&lt;&#x2F;span&gt;&lt;span&gt;(filename, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;.;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; filename&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; ~=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;      return&lt;&#x2F;span&gt;&lt;span&gt; vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;fnamemodify&lt;&#x2F;span&gt;&lt;span&gt;(filename, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;:p&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;--- Find &amp;amp; load local config file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; M&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; M.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;lookup&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  if not&lt;&#x2F;span&gt;&lt;span&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; or&lt;&#x2F;span&gt;&lt;span&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt; &amp;quot;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span&gt; content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;secure&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;(file) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;--[[@as string|nil]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  if not&lt;&#x2F;span&gt;&lt;span&gt; content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;notify&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;[local_config]: local config file found but not trusted!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;levels&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;WARN&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span&gt; config_fn, err_load&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; loadstring&lt;&#x2F;span&gt;&lt;span&gt;(content, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;@&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt; file)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  if not&lt;&#x2F;span&gt;&lt;span&gt; config_fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;notify&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;[local_config]: failed to load local config file: &amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt; err_load, vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;levels&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;ERROR&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span&gt; success, err_call&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; pcall&lt;&#x2F;span&gt;&lt;span&gt;(config_fn)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  if not&lt;&#x2F;span&gt;&lt;span&gt; success&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;notify&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;[local_config]: failed to load local config file: &amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt; err_call, vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;levels&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;ERROR&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;notify&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;[local_config]: loaded local config file&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;levels&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;INFO&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span&gt; M&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This module looks for a file called &lt;code&gt;.schilk.nvim.lua&lt;&#x2F;code&gt; in the current or
any parent directories.
If one is found the &lt;code&gt;vim.secure.read()&lt;&#x2F;code&gt; function is used to load it, allowing me to
manually review and approve the content before it is actually sourced.&lt;&#x2F;p&gt;
&lt;p&gt;In my main &lt;code&gt;init.lua&lt;&#x2F;code&gt;, I can then use this module even before my plugin manager &lt;code&gt;lazy&lt;&#x2F;code&gt;
is initialized:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;-- init.lua&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;local_config&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Because I want the &lt;code&gt;vim.notify&lt;&#x2F;code&gt; status messages to show up in the notification feed of the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;j-hui&#x2F;fidget.nvim&quot;&gt;&lt;code&gt;fidget&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; plugin instead of the default
nvim message list, I tend to wrap the calls to &lt;code&gt;vim.notify&lt;&#x2F;code&gt; above in a &lt;code&gt;vim.defer_fn&lt;&#x2F;code&gt; with
a short timeout, to make them appear after the &lt;code&gt;fidget&lt;&#x2F;code&gt; has been loaded:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;local function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt; defer_notif&lt;&#x2F;span&gt;&lt;span&gt;(msg, level)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;defer_fn&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    vim.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;notify&lt;&#x2F;span&gt;&lt;span&gt;(msg, level)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;250&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That workaround is very hacky - I know.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;local-config-files&quot;&gt;Local Config Files&lt;&#x2F;h3&gt;
&lt;p&gt;While the config file can contain arbitrary code, most of the time I want to change
some setting or behaviour of my main configuration.
I do this by storing information in the global &lt;code&gt;_G&lt;&#x2F;code&gt; table, which my main configuration
then checks for and applies if it exists.
For example, to install an additional plugin, I place one or more &lt;code&gt;lazy&lt;&#x2F;code&gt; plugin
specs in &lt;code&gt;_G.SCHILK_LOCAL_PLUGINS&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;-- Extra plugins to be inserted into the lazy spec&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;_G&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;SCHILK_LOCAL_PLUGINS&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;    &amp;#39;schilkp&#x2F;my_cool_plugin&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In my main configuration, I then inject any plugins into the default list of
plugin specs before starting the plugin manager.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;lua&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span&gt; plugins&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;    -- ... list of plugins ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;-- Inject local plugins:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;_G&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;SCHILK_LOCAL_PLUGINS&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; _G&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;SCHILK_LOCAL_PLUGINS&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; or&lt;&#x2F;span&gt;&lt;span&gt; {}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; _G&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;SCHILK_LOCAL_PLUGINS&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span&gt; _, plugin&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt; ipairs&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;_G&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6F42C1;&quot;&gt;SCHILK_LOCAL_PLUGINS&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;    table.insert&lt;&#x2F;span&gt;&lt;span&gt;(plugins, plugin)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D73A49;&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #032F62;&quot;&gt;&amp;quot;lazy&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color: #005CC5;&quot;&gt;setup&lt;&#x2F;span&gt;&lt;span&gt;(plugins)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For reference, here are some of the things which I often do in my local config files:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Install and enable additional plugins, as shown above.&lt;&#x2F;li&gt;
&lt;li&gt;Enable additional LSP servers from &lt;code&gt;nvim-lspconfig&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Disable LSP servers that I have usually enabled.&lt;&#x2F;li&gt;
&lt;li&gt;Configure local, project-specific LSP servers, such as the aforementioned MLIR and TableGen LSPs.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;shareability&quot;&gt;Shareability&lt;&#x2F;h3&gt;
&lt;p&gt;The one big downside of this approach is that it is very tightly coupled to my neovim configuration,
and therefore these config files are not very useful to anyone else.
Unfortunately, because neovim configurations are all so incredibly different, I don&#x27;t see a
great way of changing that.&lt;&#x2F;p&gt;
&lt;p&gt;This is reflected in my choice to name the files &lt;code&gt;.schilk.nvim.lua&lt;&#x2F;code&gt;: I doubt anyone else
will directly use them.&lt;&#x2F;p&gt;
&lt;p&gt;For this reason, I also typically don&#x27;t check them into project git
repositories.
As I doubt that the LLVM project will be interested in a patch
that adds &lt;code&gt;.schilk.nvim.lua&lt;&#x2F;code&gt; to their &lt;code&gt;.gitignore&lt;&#x2F;code&gt;, to avoid having to keep
juggling that change around locally, I just ignore these files in all git repos
using a global &lt;code&gt;.gitignore&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #24292E; background-color: #FFFFFF;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# ~&#x2F;.gitconfig:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[core]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    excludesfile = &#x2F;home&#x2F;schilkp&#x2F;.gitignore_global&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# ~&#x2F;.gitignore_global:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.schilk.nvim.lua&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;notes&quot;&gt;Notes&lt;&#x2F;h2&gt;
&lt;p&gt;You can find my complete setup directly in my neovim configuration
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;schilkp&#x2F;dot&#x2F;blob&#x2F;main&#x2F;neovim&#x2F;.config&#x2F;nvim&#x2F;lua&#x2F;schilk&#x2F;local_config&#x2F;init.lua&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;changes&quot;&gt;Changes&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;13-03-2026&lt;&#x2F;code&gt;:
&lt;ul&gt;
&lt;li&gt;Fixed the version of &lt;code&gt;nvim&lt;&#x2F;code&gt; in which &lt;code&gt;vim.secure.read()&lt;&#x2F;code&gt; was introduced - thanks, justinmk!&lt;&#x2F;li&gt;
&lt;li&gt;Updated the example snippet to use the actual content read by &lt;code&gt;vim.secure.read()&lt;&#x2F;code&gt; instead of just using said function to check if the file is trusted before sourcing from the file.&lt;&#x2F;li&gt;
&lt;li&gt;Add explanation about deferred &lt;code&gt;notify&lt;&#x2F;code&gt; calls.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
</feed>
