Tom van Dijk's blog
https://dtomvan.prose.sh
2022-07-18T11:20:48Z
Here I'll post some of the projects I've made, how to use them, and maybe some update notes.
dtomvan
Vim learning resources
2022-11-08T19:26:49Z
https://dtomvan.prose.sh/vim-learning-resources
<h2 id="downloading-vim"><a class="anchor" href="#downloading-vim" rel="nofollow">#</a> Downloading Vim</h2>
<ul>
<li>Windows: <a href="https://github.com/vim/vim-win32-installer/releases" rel="nofollow">From GitHub</a></li>
<li>Mac: <a href="https://formulae.brew.sh/formula/vim" rel="nofollow">From Homebrew</a></li>
<li>Linux (Debian or Debian-based): <code>sudo apt update && sudo apt install vim</code></li>
<li>Linux (Arch): <code>sudo pacman -Syu vim</code></li>
<li>Linux (from source): <a href="https://www.vim.org/git.php" rel="nofollow">From Github, instructions</a></li>
</ul>
<h1 id="downloading-neovim"><a class="anchor" href="#downloading-neovim" rel="nofollow">#</a> Downloading Neovim</h1>
<ul>
<li>Windows (winget): <code>winget install Neovim.Neovim</code></li>
<li>Windows (installer): <a href="https://github.com/neovim/neovim/releases/latest/download/nvim-win64.msi" rel="nofollow">Latest from Github</a>, <a href="https://github.com/neovim/neovim/releases/download/nightly/nvim-win64.msi" rel="nofollow">Nightly from Github</a></li>
<li>Mac: <a href="https://formulae.brew.sh/formula/neovim-qt" rel="nofollow">From Homebrew</a></li>
<li>Linux (Debian or Debian-based): <code>sudo apt update && sudo apt install neovim</code></li>
<li>Linux (Arch): <code>sudo pacman -Syu neovim</code></li>
<li>Linux (from source): <a href="https://github.com/neovim/neovim/wiki/Installing-Neovim#install-from-source" rel="nofollow">From Github, instructions</a></li>
</ul>
<h2 id="getting-started"><a class="anchor" href="#getting-started" rel="nofollow">#</a> Getting started</h2>
<ul>
<li><a href="https://www.youtube.com/playlist?list=PLm323Lc7iSW_wuxqmKx_xxNtJC_hJbQ7R" rel="nofollow">Vim as your editor - ThePrimeagen</a></li>
<li><a href="https://frontendmasters.com/courses/vim-fundamentals/" rel="nofollow">Primeagen's FrontEndMasters course on Vim</a></li>
<li><a href="https://github.com/wincent/vim-university" rel="nofollow">Vim university - Wincent</a></li>
<li><a href="https://vimcasts.org/publications/" rel="nofollow">Vimcasts</a></li>
<li><a href="https://neovim.io/doc/user/" rel="nofollow">The help pages</a></li>
</ul>
<h2 id="useful-help-pages"><a class="anchor" href="#useful-help-pages" rel="nofollow">#</a> Useful help pages</h2>
<pre class="chroma"><code><span class="line"><span class="ln">1</span><span class="cl"><span class="p">:</span><span class="nx">h</span> <span class="nx">tutor</span> <span class="c">" First use hands-on experience</span><span class="err">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="err"></span><span class="p">:</span><span class="nx">h</span> <span class="nx">doc</span><span class="p">-</span><span class="nx">file</span><span class="p">-</span><span class="nx">list</span> <span class="c">" Table of contents</span><span class="err">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="err"></span><span class="p">:</span><span class="nx">h</span> <span class="nx">user</span><span class="p">-</span><span class="nx">manual</span> <span class="c">" Vim's user manual (after tutor)</span><span class="err">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="err"></span><span class="p">:</span><span class="nx">h</span> <span class="nx">quickref</span> <span class="c">" Quick reference (if your already comfortable in vim)</span><span class="err">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="err"></span><span class="p">:</span><span class="nx">h</span> <span class="nx">nvim</span> <span class="c">" Neovim-specific documentation entry point</span><span class="err">
</span></span></span></code></pre>
Yes, you can
2022-08-14T11:26:20Z
https://dtomvan.prose.sh/you-can
<p>This article is meant to prove something to my friends about the borrow checker.</p>
<p>The problem: is it believed the borrow checker is unnessecary and is constantly
being fought against.</p>
<p>Today, I will use the rust crate <code>you_can</code> to demonstrate why this is not true.</p>
<p>An example of why the borrow checker is fought against:</p>
<pre class="chroma"><code><span class="line"><span class="ln">1</span><span class="cl"><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="fm">vec!</span><span class="p">[</span><span class="s">"hello,"</span><span class="p">,</span><span class="w"> </span><span class="s">"world!"</span><span class="p">];</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="w"> </span><span class="fm">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre><p>This will cause a compiler error:
<img src="https://i.imgur.com/ukVa7NM.png"></p>
<p>This is for a good number of reasons:</p>
<ol>
<li>What happens to <code>a</code> if we made <code>b</code> mutable and mutated it?</li>
<li>Should <code>a</code> be passed into <code>b</code> by value or by reference?</li>
<li>Should <code>a</code> be cloned into <code>b</code>, in order to have 2 instances instead?</li>
</ol>
<p>Rust solves this by making everything explicit. If we did <code>let b = &a;</code> we
<em>explicitly</em> told the compiler to keep a reference of <code>a</code>. By the way, if <code>T</code> is
printable, then <code>&T</code> is, too. If we wanted to have the data in 2 places, without
any connection between them, we could clone it:</p>
<pre class="chroma"><code><span class="line"><span class="ln">1</span><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">clone</span><span class="p">();</span><span class="w">
</span></span></span></code></pre><p>In the first case though, rust passes the <em>ownership</em> of <code>a</code> into <code>b</code>. This
makes <code>a</code> invalid until redefined. This is the heart of the rust borrow checker.</p>
<p>The rust borrow checker defines simple <em>ownership rules</em> to decide how memory
should be managed, without a garbage collector.</p>
<blockquote>
<ol>
<li>Each value in Rust has an owner.</li>
<li>There can only be one owner at a time.</li>
<li>When the owner goes out of scope, the value will be dropped.</li>
</ol>
<p><cite>From the rust book, chapter 4.1</cite></p>
</blockquote>
<p>Some other rule is the <em>borrowing rule</em>: You can have either multiple immutable
references, or a singular mutable reference at a time.</p>
<p>Thus, the following is not possible:</p>
<pre class="chroma"><code><span class="line"><span class="ln">1</span><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"some string"</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="w"></span><span class="kd">let</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&</span><span class="k">mut</span><span class="w"> </span><span class="n">a</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="w"></span><span class="kd">let</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&</span><span class="k">mut</span><span class="w"> </span><span class="n">a</span><span class="p">;</span><span class="w">
</span></span></span></code></pre><p>This is for a good reason: when doing this concurrently, you will end up with
data races (also known as Undefined Behaviour or UB). For this reason <code>Mutex</code>es
exist.</p>
<p>If you struggle with the ownership problem in rust, I highly recommend you
thoroughly (re)reading <a href="https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html" rel="nofollow">the chapter</a>.</p>
<p>What I wanted to show you today is, you don't <em>have</em> to fight against the borrow checker.
Just add to your <code>Cargo.toml</code>:</p>
<pre class="chroma"><code><span class="line"><span class="ln">1</span><span class="cl"><span class="p">[</span><span class="nx">dependencies</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nx">you-can</span> <span class="p">=</span> <span class="s2">"0.0.14"</span>
</span></span></code></pre><p>Next, change your code. This time, we produce 2 mutable references to 1 value,
then use them after free to demonstrate the consequences.</p>
<pre class="chroma"><code><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">// main.rs
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1"></span><span class="cp">#[you_can::turn_off_the_borrow_checker]</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="w"></span><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="fm">vec!</span><span class="p">[</span><span class="s">"hello,"</span><span class="p">,</span><span class="w"> </span><span class="s">"world!"</span><span class="p">];</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&</span><span class="k">mut</span><span class="w"> </span><span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&</span><span class="k">mut</span><span class="w"> </span><span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w"> </span><span class="nb">drop</span><span class="p">(</span><span class="n">a</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w"> </span><span class="c1">// UB
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="c1"></span><span class="w"> </span><span class="fm">println!</span><span class="p">(</span><span class="s">"{}{}"</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre><p>This will not produce any compiler errors, but the <code>you_can</code> crate <em>does</em> warn
us (on nightly):</p>
<p><img src="https://i.imgur.com/TCabJIY.png" alt="you_can warning us about unsafe behavior and the code segfaulting"></p>
<p>And yes, this produces UB. In this case, it just segfaults. But there's no
<code>unsafe</code> or raw pointers, right? Well, this is why
<code>#[you_should::leave_the_borrow_checker_on]</code>. Memory safety is lost when
suppressing the borrow checker. And no, in the end, when you have learned Rust's
memory model, you are not "fighting" the borrow checker. It's a helping hand,
telling you everything that is wrong with your code regarding memory safety.</p>
<p>This will enable the programmer to write fast, safe, reliable code without a
garbage collector or manual allocations.</p>
<h4 id="further-readingwatching-in-no-particular-order"><a class="anchor" href="#further-readingwatching-in-no-particular-order" rel="nofollow">#</a> Further reading/watching (in no particular order)</h4>
<ul>
<li><a href="https://fasterthanli.me/articles/a-half-hour-to-learn-rust" rel="nofollow">Amos Wenger - A half hour to learn rust</a></li>
<li><a href="https://www.youtube.com/watch?v=4YU_r70yGjQ" rel="nofollow">Tristram Oaten - Rust is not a faster horse</a></li>
<li><a href="https://www.youtube.com/watch?v=ifaLk5v3W90" rel="nofollow">Tristram Oaten - Build your Rust lightsaber</a></li>
<li><a href="https://docs.rs/you-can/0.0.14/you_can/attr.turn_off_the_borrow_checker.html#discussions" rel="nofollow">Explanation by the you_can's author</a></li>
<li><a href="https://doc.rust-lang.org/stable/book/" rel="nofollow">Rust Book</a></li>
<li><a href="https://www.rust-lang.org/learn" rel="nofollow">Rust Learning Resources</a></li>
</ul>
turn off the borrow checker.
XPM.xplr
2022-07-20T11:09:11Z
https://dtomvan.prose.sh/xpm
<h1 id="xplr-plugin-manager"><a class="anchor" href="#xplr-plugin-manager" rel="nofollow">#</a> xplr plugin manager</h1>
<h2 id="requirements"><a class="anchor" href="#requirements" rel="nofollow">#</a> Requirements</h2>
<ul>
<li>Bash</li>
<li>Git</li>
</ul>
<h2 id="installation"><a class="anchor" href="#installation" rel="nofollow">#</a> Installation</h2>
<ul>
<li>Add the following line in <code>~/.config/xplr/init.lua</code></li>
</ul>
<pre class="chroma"><code><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kd">local</span> <span class="n">home</span> <span class="o">=</span> <span class="n">os.getenv</span><span class="p">(</span><span class="s2">"HOME"</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kd">local</span> <span class="n">xpm_path</span> <span class="o">=</span> <span class="n">home</span> <span class="o">..</span> <span class="s2">"/.local/share/xplr/dtomvan/xpm.xplr"</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kd">local</span> <span class="n">xpm_url</span> <span class="o">=</span> <span class="s2">"https://github.com/dtomvan/xpm.xplr"</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">package.path</span> <span class="o">=</span> <span class="n">package.path</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"> <span class="o">..</span> <span class="s2">";"</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"> <span class="o">..</span> <span class="n">xpm_path</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"> <span class="o">..</span> <span class="s2">"/?.lua;"</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"> <span class="o">..</span> <span class="n">xpm_path</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"> <span class="o">..</span> <span class="s2">"/?/init.lua"</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="n">os.execute</span><span class="p">(</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"> <span class="n">string.format</span><span class="p">(</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"> <span class="s2">"[ -e '%s' ] || git clone '%s' '%s'"</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"> <span class="n">xpm_path</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"> <span class="n">xpm_url</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"> <span class="n">xpm_path</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="p">)</span>
</span></span></code></pre><ul>
<li>Require the module in <code>~/.config/xplr/init.lua</code></li>
</ul>
<pre class="chroma"><code><span class="line"><span class="ln"> 1</span><span class="cl">
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="n">require</span><span class="p">(</span><span class="s2">"xpm"</span><span class="p">).</span><span class="n">setup</span><span class="p">({</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"> <span class="c1">-- This works</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"> <span class="s1">'dtomvan/xpm.xplr'</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"> <span class="c1">-- Or this</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"> <span class="s1">'github:dtomvan/xpm.xplr'</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl"> <span class="c1">-- Or this</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"> <span class="s1">'https://github.com/dtomvan/xpm.xplr'</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl"> <span class="c1">-- You can also use a field</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"> <span class="p">{</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">"dtomvan/xpm.xplr"</span> <span class="p">},</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="p">})</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="c1">-- Or</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="n">require</span><span class="p">(</span><span class="s2">"xpm"</span><span class="p">).</span><span class="n">setup</span><span class="p">({</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl"> <span class="n">plugins</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"> <span class="c1">-- Let xpm manage itself</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"> <span class="s1">'dtomvan/xpm.xplr'</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl"> <span class="p">{</span> <span class="n">name</span> <span class="o">=</span> <span class="s1">'sayanarijit/fzf.xplr'</span> <span class="p">},</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl"> <span class="n">auto_install</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl"> <span class="n">auto_cleanup</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="p">})</span>
</span></span></code></pre><ul>
<li>(optional) Setup key binding for manually managing plugins</li>
</ul>
<pre class="chroma"><code><span class="line"><span class="ln">1</span><span class="cl"><span class="n">xplr.config</span><span class="p">.</span><span class="n">modes.builtin</span><span class="p">.</span><span class="n">default.key_bindings</span><span class="p">.</span><span class="n">on_key.x</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"> <span class="n">help</span> <span class="o">=</span> <span class="s2">"xpm"</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"> <span class="n">messages</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"> <span class="s2">"PopMode"</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"> <span class="p">{</span> <span class="n">SwitchModeCustom</span> <span class="o">=</span> <span class="s2">"xpm"</span> <span class="p">},</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="p">}</span>
</span></span></code></pre><p>WARNING: a current limitation is that any repo not ending in .xplr isn't picked
up correctly, but by convention the repo's name should end in .xplr</p>
<h2 id="features"><a class="anchor" href="#features" rel="nofollow">#</a> Features</h2>
<ul>
<li>Automatically downloads and installs plugins</li>
<li>Pre/post load hooks</li>
<li>Automatically calls <code>setup()</code> if possible</li>
<li>Grabs from any git repository</li>
</ul>
<h2 id="setup-arguments"><a class="anchor" href="#setup-arguments" rel="nofollow">#</a> Setup arguments</h2>
<pre class="chroma"><code><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"> <span class="c1">-- Default: {}</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"> <span class="n">plugins</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"dtomvan/xpm.xplr"</span> <span class="p">},</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"> <span class="c1">-- Default: true</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"> <span class="n">auto_install</span> <span class="o">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"> <span class="c1">-- Default: false</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"> <span class="n">auto_cleanup</span> <span class="o">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="p">}</span>
</span></span></code></pre><h2 id="plugin-arguments"><a class="anchor" href="#plugin-arguments" rel="nofollow">#</a> Plugin arguments</h2>
<p>All available arguments for a plugin are:</p>
<pre class="chroma"><code><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">-- <in xpm.setup></span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"> <span class="c1">-- Default: Skip if empty</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"> <span class="s2">"<name>"</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"> <span class="c1">-- Default: Skip if empty</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"> <span class="n">name</span> <span class="o">=</span> <span class="s2">"<name>"</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"> <span class="c1">-- Branch, commit or tag to pin</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"> <span class="c1">-- Default: "origin"</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"> <span class="n">rev</span> <span class="o">=</span> <span class="s2">"<revision>"</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl"> <span class="c1">-- Default: empty</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"> <span class="n">after</span> <span class="o">=</span> <span class="kr">function</span><span class="p">()</span> <span class="kr">end</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">
</span></span><span class="line"><span class="ln">16</span><span class="cl"> <span class="c1">-- Default: empty</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"> <span class="n">before</span> <span class="o">=</span> <span class="kr">function</span><span class="p">()</span> <span class="kr">end</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">
</span></span><span class="line"><span class="ln">19</span><span class="cl"> <span class="c1">-- Default: require("<name>").setup()</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl"> <span class="n">setup</span> <span class="o">=</span> <span class="kr">function</span><span class="p">()</span> <span class="kr">end</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">
</span></span><span class="line"><span class="ln">22</span><span class="cl"> <span class="c1">-- Default: empty</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl"> <span class="c1">-- WARNING: if any of the dependencies fail to download, the plugin won't</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl"> <span class="c1">-- load to prevent from any damage being done</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl"> <span class="n">deps</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"dtomvan/xpm.xplr"</span> <span class="p">}</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="p">}</span>
</span></span></code></pre>
Plugin manager for the XPLR file manager