<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: woland</title>
    <description>The latest articles on Forem by woland (@woland).</description>
    <link>https://forem.com/woland</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1606296%2F2c4c49ec-70f3-4c84-83c6-f3e09ee568fa.jpg</url>
      <title>Forem: woland</title>
      <link>https://forem.com/woland</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/woland"/>
    <language>en</language>
    <item>
      <title>How to write vim9script or How to Compile and Run C code from Vim</title>
      <dc:creator>woland</dc:creator>
      <pubDate>Wed, 30 Oct 2024 02:48:41 +0000</pubDate>
      <link>https://forem.com/woland/how-to-write-vim9script-or-how-to-compile-and-run-c-code-from-vim-259a</link>
      <guid>https://forem.com/woland/how-to-write-vim9script-or-how-to-compile-and-run-c-code-from-vim-259a</guid>
      <description>&lt;p&gt;Using a simple vimscript, we can easily compile and run any C code without leaving Vim! We will use vim9script for this.&lt;/p&gt;

&lt;h2&gt;
  
  
  CompileAndRun Function
&lt;/h2&gt;

&lt;p&gt;Functions in vim9script are defined with the &lt;code&gt;def&lt;/code&gt; keyword. Since Vim uses an algol-like syntax, &lt;code&gt;enddef&lt;/code&gt; will denote the end of the functions.&lt;/p&gt;

&lt;p&gt;We will define several variables with the &lt;code&gt;var&lt;/code&gt; keyword since vim9script doesn't use the &lt;code&gt;let&lt;/code&gt; keyword.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;vim9script&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; CompileAndRun&lt;span class="p"&gt;()&lt;/span&gt;
    var current_file &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    var file_name &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fnamemodify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;current_file&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;':t:r'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As with every vim9script, we start by telling vim that this is in fact vim9script!&lt;/p&gt;

&lt;p&gt;Then we get the name of the current file using &lt;code&gt;expand()&lt;/code&gt;, then using the &lt;code&gt;fnamemodifty()&lt;/code&gt; and &lt;code&gt;:t:t&lt;/code&gt; we will strip away the path and the extension, keeping only the basename.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;:t: Takes only the "tail" (or basename) of the file path, removing the directories.&lt;/li&gt;
&lt;li&gt;:r: Removes the extension from the filename.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Typically &lt;code&gt;expand('%')&lt;/code&gt; returns &lt;em&gt;filename.extension&lt;/em&gt; if you directly open a file with &lt;code&gt;vim filename.extension&lt;/code&gt; but if the file was opened from a relative path, such as &lt;code&gt;vim ~/some/path/filename.extension&lt;/code&gt; it would also return the path, so we have to clean it up.&lt;/p&gt;

&lt;p&gt;We need another variable to store our compile command, for starters, a simple gcc compile command should do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;var compile_cmd &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'gcc '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; current_file &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="s1"&gt;' -o '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; file_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;..&lt;/code&gt; is how we concatenate strings, in vim9script (it used to be one dot in legacy vimscript similar to PHP). You may have also noticed that we are using the extracted file name for our output binary.&lt;/p&gt;

&lt;p&gt;After that we can simply compile and execute the output binary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;var compile_result &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;systemlist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;compile_cmd&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'terminal ./'&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; file_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; CompileAndRun&lt;span class="p"&gt;()&lt;/span&gt;
    var current_file &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    var file_name &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fnamemodify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;current_file&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;':t:r'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    var compile_cmd &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'gcc '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; current_file &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="s1"&gt;' -o '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; file_name 
    var compile_result &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;systemlist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;compile_cmd&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'terminal ./'&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; file_name
&lt;span class="k"&gt;enddef&lt;/span&gt;

defcompile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;defcompile&lt;/code&gt; command in the end does exactly what it says, which is compiling our functions into bytecode.&lt;/p&gt;

&lt;p&gt;Since vim9script functions are scoped differently than legacy vimscript, we need to define a command to access them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;command&lt;span class="p"&gt;!&lt;/span&gt; CompileAndRun &lt;span class="k"&gt;call&lt;/span&gt; CompileAndRun&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can run &lt;code&gt;:CompileAndRun&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkvqt2r6khzxc9msn8tz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkvqt2r6khzxc9msn8tz.gif" alt="demo_gif_1" width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok that's fine but what about errors? Warnings? WE NEED THOSE! So let's improve our script!&lt;/p&gt;

&lt;p&gt;Let us add a condition that checks for &lt;code&gt;v:shell_error&lt;/code&gt;, see &lt;code&gt;:h v:shell_error&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;shell_error &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;compile_result&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;botright&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="k"&gt;setlocal&lt;/span&gt;\ &lt;span class="nb"&gt;buftype&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;nofile\ &lt;span class="k"&gt;noswapfile&lt;/span&gt;\ &lt;span class="nb"&gt;bufhidden&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;wipe
        &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="nb"&gt;setline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; compile_result&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is a summary, &lt;code&gt;botright new&lt;/code&gt; creates a horizontal split, the &lt;code&gt;+setlocal&lt;/code&gt; options ensure that it's a scratch buffer, &lt;code&gt;systemlist()&lt;/code&gt; executes the binary while handling newlines properly, &lt;code&gt;setline()&lt;/code&gt; puts the results at the first line of the split buffer. &lt;/p&gt;

&lt;p&gt;Let's also add &lt;code&gt;-Wall&lt;/code&gt; to our compile command and create an unused variable in our simple test C code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;var compile_cmd &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'gcc -Wall '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; current_file &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="s1"&gt;' -o '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; file_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovnyrmpugl3frebsin5u.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovnyrmpugl3frebsin5u.gif" alt="demo_gif_2" width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not bad ey? We can still make it better!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Another perk of using &lt;code&gt;systemlist()&lt;/code&gt; is that it already captured 2&amp;gt;&amp;amp;1 aka stdout and stderr for us so we don't need to perform a redirection.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Can we add syntax highlighting to the warnings and errors? Yes! Just add &lt;code&gt;set filetype=c&lt;/code&gt; before &lt;code&gt;call setline()&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can we auto-close this split? Yes! But it needs a bit more code.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will give a name to our split buffer, then using an &lt;code&gt;augroup&lt;/code&gt; auto close it on leave.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;shell_error &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;compile_result&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;botright&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="k"&gt;setlocal&lt;/span&gt;\ &lt;span class="nb"&gt;buftype&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;nofile\ &lt;span class="k"&gt;noswapfile&lt;/span&gt;\ &lt;span class="nb"&gt;bufhidden&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;wipe
    &lt;span class="k"&gt;file&lt;/span&gt; CompileErrors
    &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;ft&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;
    &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="nb"&gt;setline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; compile_result&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;
&lt;span class="k"&gt;endif&lt;/span&gt;

augroup AutoCloseCompileErrors
    autocmd&lt;span class="p"&gt;!&lt;/span&gt;
    autocmd&lt;span class="p"&gt;!&lt;/span&gt; &lt;span class="nb"&gt;BufEnter&lt;/span&gt; * &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;bufexists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'CompileErrors'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class="nb"&gt;bufname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'CompileErrors'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'bdelete! CompileErrors'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt;
augroup END
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that when we change focus from a buffer with the name &lt;em&gt;CompileErrors&lt;/em&gt;, the buffer with be deleted and therefor the split will be closed.&lt;/p&gt;

&lt;p&gt;However, there may be times when we'd want to keep the split open as we work, so we can create a boolean to set it to 1 or 0 at runtime.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="nv"&gt;g:close_err_split&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And we'll modify the &lt;code&gt;augroup&lt;/code&gt; and format it nicely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;augroup AutoCloseCompileErrors
    autocmd&lt;span class="p"&gt;!&lt;/span&gt;
    autocmd &lt;span class="nb"&gt;BufEnter&lt;/span&gt; * &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;g:close_err_split&lt;/span&gt; &amp;amp;&amp;amp;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="nb"&gt;bufexists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'CompileErrors'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &amp;amp;&amp;amp;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="nb"&gt;bufname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'CompileErrors'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; &lt;span class="k"&gt;bdelete&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; CompileErrors
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt;
augroup END
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will be applying the same checks and niceties to the run command as well. So instead of simply running the binary, we can do the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="nv"&gt;g:close_run_split&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; true

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;shell_error &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 
    &lt;span class="k"&gt;botright&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="k"&gt;setlocal&lt;/span&gt;\ &lt;span class="nb"&gt;buftype&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;nofile\ &lt;span class="k"&gt;noswapfile&lt;/span&gt;\ &lt;span class="nb"&gt;bufhidden&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;wipe
    &lt;span class="k"&gt;resize&lt;/span&gt; &lt;span class="m"&gt;-10&lt;/span&gt;
    &lt;span class="k"&gt;file&lt;/span&gt; RunBin
    var results &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;systemlist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'./'&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; file_name&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="nb"&gt;setline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; results &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;endif&lt;/span&gt;

augroup AutoCloseRunBin
    autocmd&lt;span class="p"&gt;!&lt;/span&gt;
    autocmd &lt;span class="nb"&gt;BufEnter&lt;/span&gt; * &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;g:close_run_split&lt;/span&gt; &amp;amp;&amp;amp;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="nb"&gt;bufexists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RunBin'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &amp;amp;&amp;amp;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="nb"&gt;bufname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RunBin'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; &lt;span class="k"&gt;bdelete&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; RunBin
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt;
augroup END
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may have noticed that this time we are also determining the size of the split.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh6xp071fj69ccpyg6ggi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh6xp071fj69ccpyg6ggi.gif" alt="demo_gif_3" width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let us add the last touch, which is the ability to define the compile flags at runtime. For that we will have to add a condition to check for a &lt;code&gt;g:custom_compile_flag&lt;/code&gt; and initiate it to be empty at first since vim9script is picky with empty variables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'g:custom_compile_flag'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;g:custom_compile_flag&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;
&lt;span class="k"&gt;endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And of course, we have to also modify our &lt;code&gt;compile_cmd&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;var compile_cmd &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'gcc '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="nv"&gt;g:custom_compile_flag&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; current_file &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="s1"&gt;' -o '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; file_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can change our compile flags at run time, &lt;em&gt;just don't forget to add a space in the end!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let's test:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh5iqbt1q7x58u5jeyi49.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh5iqbt1q7x58u5jeyi49.gif" alt="demo_gif_4" width="865" height="654"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, we can change our compile flags at runtime without any issues!&lt;/p&gt;

&lt;p&gt;The whole script is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;vim9script&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; CompileAndRun&lt;span class="p"&gt;()&lt;/span&gt;
    var current_file &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    var file_name &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fnamemodify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;current_file&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;':t:r'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'g:custom_compile_flag'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;g:custom_compile_flag&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;
    &lt;span class="k"&gt;endif&lt;/span&gt;

    var compile_cmd &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'gcc '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="nv"&gt;g:custom_compile_flag&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; current_file &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="s1"&gt;' -o '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; file_name
    var compile_result &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;systemlist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;compile_cmd&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;shell_error &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;compile_result&lt;span class="p"&gt;)&lt;/span&gt;   
        &lt;span class="k"&gt;botright&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="k"&gt;setlocal&lt;/span&gt;\ &lt;span class="nb"&gt;buftype&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;nofile\ &lt;span class="k"&gt;noswapfile&lt;/span&gt;\ &lt;span class="nb"&gt;bufhidden&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;wipe
        &lt;span class="k"&gt;file&lt;/span&gt; CompileErrors
        &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;ft&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;
        &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="nb"&gt;setline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; compile_result&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="k"&gt;endif&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;shell_error &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 
        &lt;span class="k"&gt;botright&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="k"&gt;setlocal&lt;/span&gt;\ &lt;span class="nb"&gt;buftype&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;nofile\ &lt;span class="k"&gt;noswapfile&lt;/span&gt;\ &lt;span class="nb"&gt;bufhidden&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;wipe
        &lt;span class="k"&gt;resize&lt;/span&gt; &lt;span class="m"&gt;-10&lt;/span&gt;
        &lt;span class="k"&gt;file&lt;/span&gt; RunBin
        var results &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;systemlist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'./'&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; file_name&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="nb"&gt;setline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; results &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;enddef&lt;/span&gt;

&lt;span class="nv"&gt;g:close_err_split&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; true
&lt;span class="nv"&gt;g:close_run_split&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; true

augroup AutoCloseCompileErrors
    autocmd&lt;span class="p"&gt;!&lt;/span&gt;
    autocmd &lt;span class="nb"&gt;BufEnter&lt;/span&gt; * &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;g:close_err_split&lt;/span&gt; &amp;amp;&amp;amp;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="nb"&gt;bufexists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'CompileErrors'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &amp;amp;&amp;amp;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="nb"&gt;bufname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'CompileErrors'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; &lt;span class="k"&gt;bdelete&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; CompileErrors
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt;
augroup END

augroup AutoCloseRunBin
    autocmd&lt;span class="p"&gt;!&lt;/span&gt;
    autocmd &lt;span class="nb"&gt;BufEnter&lt;/span&gt; * &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;g:close_run_split&lt;/span&gt; &amp;amp;&amp;amp;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="nb"&gt;bufexists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RunBin'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &amp;amp;&amp;amp;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="nb"&gt;bufname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RunBin'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; &lt;span class="k"&gt;bdelete&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; RunBin
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt;
augroup END

command&lt;span class="p"&gt;!&lt;/span&gt; CompileAndRun &lt;span class="k"&gt;call&lt;/span&gt; CompileAndRun&lt;span class="p"&gt;()&lt;/span&gt;
nnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;F8&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;CompileAndRun&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

defcompile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We've also added the F8 keybinding to access our command more easily. &lt;/p&gt;

&lt;h2&gt;
  
  
  Note
&lt;/h2&gt;

&lt;p&gt;Vim already has the &lt;code&gt;compiler&lt;/code&gt; and &lt;code&gt;make&lt;/code&gt; commands that you should add to your arsenal. This article only tries to teach some vim9script and some of the things that you can very easily achieve with it.&lt;/p&gt;

&lt;p&gt;I hope that you enjoyed this article and if you did, leave a comment or a reaction.&lt;/p&gt;

</description>
      <category>vim</category>
      <category>vim9script</category>
      <category>vimscript</category>
      <category>c</category>
    </item>
    <item>
      <title>Setting up Vim for PHP and laravel in 2024</title>
      <dc:creator>woland</dc:creator>
      <pubDate>Mon, 17 Jun 2024 02:05:54 +0000</pubDate>
      <link>https://forem.com/woland/setting-up-vim-for-php-and-laravel-in-2024-1pl7</link>
      <guid>https://forem.com/woland/setting-up-vim-for-php-and-laravel-in-2024-1pl7</guid>
      <description>&lt;p&gt;I am going to mostly document my own journy of setting up Vim (Not Neovim!) for PHP and laravel. Feel free to follow along.&lt;/p&gt;

&lt;p&gt;We're going to use Vim+VimPlug+CoC.nvim, so we need to have nodejs and npm installed. It goes without saying that you should have Vim8+ as well. The current version of Vim as of this writing is Vim-9.1 &lt;br&gt; &lt;/p&gt;

&lt;p&gt;So let's start from a clean &lt;code&gt;~/.vimrc&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Lets place this block, that automatically installs VimPlug, on top of our &lt;code&gt;~/.vimrc&lt;/code&gt;.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; VimplugInstaller&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; data_dir &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'nvim'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; ? stdpath&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'data'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/site'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'~/.vim'&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;data_dir &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/autoload/plug.vim'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;silent&lt;/span&gt; &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'!curl -fLo '&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;data_dir&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;'/autoload/plug.vim --create-dirs  https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'&lt;/span&gt;
    autocmd &lt;span class="nb"&gt;VimEnter&lt;/span&gt; * PlugInstall &lt;span class="p"&gt;--&lt;/span&gt;&lt;span class="k"&gt;sync&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt; $MYVIMRC
  &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;endfunction&lt;/span&gt;

&lt;span class="k"&gt;call&lt;/span&gt; VimplugInstaller&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Followed by several essential plugins:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;call&lt;/span&gt; plug#begin&lt;span class="p"&gt;()&lt;/span&gt;

Plug &lt;span class="s1"&gt;'neoclide/coc.nvim'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'branch'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'release'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
Plug &lt;span class="s1"&gt;'https://github.com/preservim/tagbar.git'&lt;/span&gt;
Plug &lt;span class="s1"&gt;'vim-php/phpctags'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'for'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'php'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
Plug &lt;span class="s1"&gt;'honza/vim-snippets'&lt;/span&gt;
Plug &lt;span class="s1"&gt;'SirVer/ultisnips'&lt;/span&gt;
Plug &lt;span class="s1"&gt;'tpope/vim-commentary'&lt;/span&gt;
Plug &lt;span class="s1"&gt;'sheerun/vim-polyglot'&lt;/span&gt;
Plug &lt;span class="s1"&gt;'jwalton512/vim-blade'&lt;/span&gt;

&lt;span class="k"&gt;call&lt;/span&gt; plug#end&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most important one, is coc.nvim. The rest are for various enhancements, that we'll go over soon, but before we do, let's define some extensions for coc.nvim and configure the other plugins.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="c"&gt;"===[Coc.nvim]==="&lt;/span&gt;
inoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;expr&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; coc#pum#visible&lt;span class="p"&gt;()&lt;/span&gt; ? coc#_select_confirm&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"\&amp;lt;C-g&amp;gt;u\&amp;lt;CR&amp;gt;"&lt;/span&gt;
&lt;span class="c"&gt;" use &amp;lt;tab&amp;gt; to trigger completion and navigate to the next complete item&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; CheckBackspace&lt;span class="p"&gt;()&lt;/span&gt; abort
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;col&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="k"&gt;col&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;getline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="k"&gt;col&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="p"&gt;=~&lt;/span&gt;# &lt;span class="s1"&gt;'\s'&lt;/span&gt;
&lt;span class="k"&gt;endfunction&lt;/span&gt;

inoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;expr&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Tab&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; coc#pum#visible&lt;span class="p"&gt;()&lt;/span&gt; ? coc#pum#&lt;span class="k"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; CheckBackspace&lt;span class="p"&gt;()&lt;/span&gt; ? &lt;span class="s2"&gt;"\&amp;lt;Tab&amp;gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; coc#refresh&lt;span class="p"&gt;()&lt;/span&gt;
inoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;expr&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;s&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="k"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; coc#pum#visible&lt;span class="p"&gt;()&lt;/span&gt; ? coc#pum#&lt;span class="k"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"\&amp;lt;c-h&amp;gt;"&lt;/span&gt;

&lt;span class="c"&gt;" Enhanced &amp;lt;CR&amp;gt; for pairs&lt;/span&gt;
inoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;expr&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; coc#pum#visible&lt;span class="p"&gt;()&lt;/span&gt; ? coc#pum#&lt;span class="k"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="se"&gt;            \&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"\&amp;lt;C-g&amp;gt;u\&amp;lt;CR&amp;gt;\&amp;lt;c-r&amp;gt;=coc#on_enter()\&amp;lt;CR&amp;gt;"&lt;/span&gt;

&lt;span class="c"&gt;" Disable &amp;lt; expansion for pairs&lt;/span&gt;
autocmd &lt;span class="nb"&gt;FileType&lt;/span&gt; * &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;b:coc_pairs_disabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;"===[ Coc-Explorer ]==="&lt;/span&gt;
&lt;span class="c"&gt;" set up coc-explorer to open in the current directory&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:coc_explorer_global_mirror&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:coc_explorer_disable_default_keybindings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:coc_explorer_global_root&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'current'&lt;/span&gt;
nnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;space&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;e&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Cmd&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;CocCommand explorer&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;"===[ Coc Global Extensions ]==="&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:coc_global_extensions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="se"&gt;  \&lt;/span&gt; &lt;span class="s1"&gt;'coc-html'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;  \&lt;/span&gt; &lt;span class="s1"&gt;'coc-css'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;  \&lt;/span&gt; &lt;span class="s1"&gt;'coc-pairs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;  \&lt;/span&gt; &lt;span class="s1"&gt;'coc-emmet'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;  \&lt;/span&gt; &lt;span class="s1"&gt;'coc-explorer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;  \&lt;/span&gt; &lt;span class="s1"&gt;'coc-phpactor'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;  \&lt;/span&gt; &lt;span class="s1"&gt;'coc-blade'&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;" GoTo code navigation&lt;/span&gt;
nmap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;gd&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Plug&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;coc&lt;span class="p"&gt;-&lt;/span&gt;definition&lt;span class="p"&gt;)&lt;/span&gt;
nmap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; gy &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Plug&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;coc&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;definition&lt;span class="p"&gt;)&lt;/span&gt;
nmap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; gi &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Plug&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;coc&lt;span class="p"&gt;-&lt;/span&gt;implementation&lt;span class="p"&gt;)&lt;/span&gt;
nmap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;gr&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Plug&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;coc&lt;span class="p"&gt;-&lt;/span&gt;references&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;" Use `[g` and `]g` to navigate diagnostics&lt;/span&gt;
&lt;span class="c"&gt;" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list&lt;/span&gt;
nmap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;g&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Plug&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;coc&lt;span class="p"&gt;-&lt;/span&gt;diagnostic&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="k"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
nmap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;g&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Plug&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;coc&lt;span class="p"&gt;-&lt;/span&gt;diagnostic&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="k"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;"&lt;/span&gt;
&lt;span class="c"&gt;" List code actions available for the current buffer&lt;/span&gt;
nmap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;leader&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;ca&lt;/span&gt;  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Plug&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;coc&lt;span class="p"&gt;-&lt;/span&gt;codeaction&lt;span class="p"&gt;)&lt;/span&gt;

nnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; K &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;call&lt;/span&gt; ShowDocumentation&lt;span class="p"&gt;()&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; ShowDocumentation&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; CocAction&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'hasProvider'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'hover'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;call&lt;/span&gt; CocActionAsync&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'doHover'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="nb"&gt;feedkeys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'K'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'in'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;endfunction&lt;/span&gt;

&lt;span class="c"&gt;" Add `:Format` command to format current buffer&lt;/span&gt;
command&lt;span class="p"&gt;!&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;nargs&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; Format &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;call&lt;/span&gt; CocActionAsync&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'format'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;" Formatting selected code&lt;/span&gt;
vmap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;leader&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;f&lt;/span&gt;  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Plug&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;coc&lt;span class="p"&gt;-&lt;/span&gt;format&lt;span class="p"&gt;-&lt;/span&gt;selected&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;" coc-pairs&lt;/span&gt;
&lt;span class="c"&gt;" disable characters for a specified filetypes&lt;/span&gt;
autocmd &lt;span class="nb"&gt;FileType&lt;/span&gt; markdown &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;b:coc_pairs_disabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'txt'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code, configures tab completion, auto pairs, coc-explorer file explorer and other keybinding to get the most out of coc.nvim.&lt;br&gt;
In the coc global extension section, we define extensions to be installed automatically. I have decided to use phpactor, you may change it for &lt;code&gt;coc-intelephense&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  Lets also configure the snippets:
&lt;/h4&gt;

&lt;p&gt;We can manage our snippets with coc.nvim too, but I choose to use UltiSnips for that.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="c"&gt;"===[ SNIPPETS ]==="&lt;/span&gt;
&lt;span class="c"&gt;"Use Ctrl j key to trigger the snippets, default was TAB but that conflicts with&lt;/span&gt;
&lt;span class="c"&gt;"The Completion trigger see :h keycodes to change this to sth else &lt;/span&gt;
&lt;span class="c"&gt;"Use Ctrl j and k to move visually within the snippet that was just triggered&lt;/span&gt;
&lt;span class="c"&gt;"Ctrl l lists the available snippets&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:UltiSnipsExpandTrigger&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&amp;lt;C-j&amp;gt;'&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:UltiSnipsListSnippets&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&amp;lt;C-l&amp;gt;'&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:UltiSnipsJumpForwardTrigger&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&amp;lt;C-j&amp;gt;'&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:UltiSnipsJumpBackwardTrigger&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&amp;lt;C-k&amp;gt;'&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:copypath_copy_to_unnamed_register&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save and quit Vim and open it again and wait for the plugins and extensions to install. &lt;br&gt; &lt;br&gt;
If you get prompted by an error msg, just press enter and wait for the plugins and the extensions to install.&lt;/p&gt;
&lt;h5&gt;
  
  
  It's better to install the laravel extension manually:
&lt;/h5&gt;

&lt;p&gt;&lt;code&gt;:CocInstall @yaegassy/coc-laravel&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Now lets configure the coc extensions.
&lt;/h4&gt;

&lt;p&gt;Issue the &lt;code&gt;:CocConfig&lt;/code&gt; command from Vim's command mode and paste the following, inside the file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"suggest.noselect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"explorer.icon.enableNerdfont"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"explorer.file.reveal.auto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"languageserver"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"phpactor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"phpactor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"language-server"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"trace.server"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"verbose"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"filetypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"php"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you choose to use a local installation of phpactor, you can just remove &lt;code&gt;coc-phpactor&lt;/code&gt; with &lt;code&gt;:CocUninstall coc-phpactor&lt;/code&gt; and modify the &lt;code&gt;~/.vim/coc-settings.json&lt;/code&gt; to include a path to the phpactor executable and remove the languageserver block entirely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"phpactor.enable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"phpactor.path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/bin/phpactor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  The keybindings:
&lt;/h4&gt;

&lt;p&gt;The only keybindings that you should know, besides the usual Vim keybindings, are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tab&lt;/td&gt;
&lt;td&gt;completion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gd&lt;/td&gt;
&lt;td&gt;definition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gy&lt;/td&gt;
&lt;td&gt;type definition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gi&lt;/td&gt;
&lt;td&gt;implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gr&lt;/td&gt;
&lt;td&gt;references&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[g&lt;/td&gt;
&lt;td&gt;diagnostics prev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;]g&lt;/td&gt;
&lt;td&gt;diagnostics next&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ca&lt;/td&gt;
&lt;td&gt;code actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;K&lt;/td&gt;
&lt;td&gt;hover docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;f (in visual mode)&lt;/td&gt;
&lt;td&gt;format code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl-j&lt;/td&gt;
&lt;td&gt;Expand Snippet &amp;amp; Move to Next Placeholder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl+k&lt;/td&gt;
&lt;td&gt;Move to Prev Placeholder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl-l&lt;/td&gt;
&lt;td&gt;List Snippets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Space-e&lt;/td&gt;
&lt;td&gt;Open Explorer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now we should have an efficient and comfortable setup for working with PHP and laravel.&lt;/p&gt;

&lt;h4&gt;
  
  
  Lets setup several other things for convenience
&lt;/h4&gt;

&lt;h4&gt;
  
  
  Theme:
&lt;/h4&gt;

&lt;p&gt;Add these plugins to the plugins list and install them with &lt;code&gt;:PlugInstall&lt;/code&gt;  after sourcing the &lt;code&gt;~/.vimrc&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;Plug &lt;span class="s1"&gt;'ryanoasis/vim-devicons'&lt;/span&gt;
Plug &lt;span class="s1"&gt;'catppuccin/vim'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'as'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'catppuccin'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Setup Vim to use the popular catppuccin theme.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="c"&gt;"===[ Theme ]==="&lt;/span&gt;
&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;background&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dark&lt;/span&gt;
&lt;span class="c"&gt;" Inspect $TERM instead of t_Co&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;term&lt;/span&gt; &lt;span class="p"&gt;=~&lt;/span&gt; &lt;span class="s1"&gt;'256color'&lt;/span&gt;
    &lt;span class="c"&gt;" Enable true (24-bit) colors instead of (8-bit) 256 colors.&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'termguicolors'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;t_8f&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"\&amp;lt;Esc&amp;gt;[38;2;%lu;%lu;%lum"&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;t_8b&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"\&amp;lt;Esc&amp;gt;[48;2;%lu;%lu;%lum"&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;t_TI&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;t_TE&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
        &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;termguicolors&lt;/span&gt;
        &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;mouse&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="k"&gt;a&lt;/span&gt;
        &lt;span class="k"&gt;colorscheme&lt;/span&gt; catppuccin_mocha
    &lt;span class="k"&gt;endif&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="k"&gt;colorscheme&lt;/span&gt; catppuccin_mocha
        &lt;span class="k"&gt;let&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;t_TI&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;t_TE&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="k"&gt;endif&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gui_running'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;mouse&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="k"&gt;a&lt;/span&gt;
    &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;guicursor&lt;/span&gt;&lt;span class="p"&gt;+=&lt;/span&gt;&lt;span class="nv"&gt;a:blinkon0&lt;/span&gt;
    &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;guifont&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;FiraCodeNerdFont\ &lt;span class="m"&gt;12&lt;/span&gt;
    &lt;span class="k"&gt;colorscheme&lt;/span&gt; catppuccin_mocha
&lt;span class="k"&gt;endif&lt;/span&gt;

&lt;span class="c"&gt;"===[ Curosr Shape ]==="&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;t_SI&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"\&amp;lt;Esc&amp;gt;[6 q"&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;t_SR&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"\&amp;lt;Esc&amp;gt;[4 q"&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;t_EI&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"\&amp;lt;Esc&amp;gt;[2 q"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above block, will make vim use termgui colors (in a termgui capable terminal) and use different cursor shapes for different modes.&lt;br&gt; Make sure your &lt;code&gt;$TERM&lt;/code&gt; variable reports &lt;code&gt;xterm-256color&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the screenshot below, you can see phpactor, coc-explorer and tagbar at work. &lt;br&gt; I've left an error in the syntax to show you what the inline diagnostics look like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4utqvw2yzsuov37xbe3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4utqvw2yzsuov37xbe3.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It would do you well to familiarize yourself with the coc.nvim documentation and commands.&lt;br&gt;&lt;br&gt;
For example, running &lt;code&gt;:CocDiagnostics&lt;/code&gt; will open a drawer with all the errors found by coc.nvim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmpf6v3ehn7qfo75q9bc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmpf6v3ehn7qfo75q9bc.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pressing enter on each item will jump you to the line containing the error.&lt;/p&gt;

&lt;p&gt;I could not find a decent phpdoc plugin for Vim, but besides that, this setup is very effective.&lt;/p&gt;

&lt;p&gt;You can find my full config on github, &lt;a href="https://github.com/wolandark/wim/tree/Devel"&gt;Woland's Vim&lt;/a&gt; and my personal &lt;code&gt;~/.vim&lt;/code&gt; &lt;a href="https://github.com/wolandark/.vim"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you have any notes or questions, please leave a comment. &lt;/p&gt;

&lt;h1&gt;
  
  
  Where to go from here
&lt;/h1&gt;

&lt;p&gt;Start using the setup and tweak it to your needs, little by little. This is not a drop and go config, it's just a kickstarter to put it plainly.&lt;/p&gt;

&lt;h4&gt;
  
  
  Some general notes:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Familiarize yourself with Vim's buffers. &lt;/li&gt;
&lt;li&gt;NEVER &lt;code&gt;:q&lt;/code&gt; Vim, unless you're done for the day&lt;/li&gt;
&lt;li&gt;Learn about &lt;code&gt;:vimgrep&lt;/code&gt; and &lt;code&gt;:lvimgrep&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Integrate fzf, ack, ag, rg into your workflow, (you need to quickly search large projects)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Possible Q&amp;amp;A
&lt;/h1&gt;

&lt;p&gt;Can I use this with Nvim? &lt;br&gt;
Yes, you just have to paste all the code into &lt;code&gt;~/.config/nvim/init.vim&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Why not use Nvim with lspconfig and cmp etc ... ?&lt;br&gt;
Because it takes way longer to configure and the results aren't better than what coc provides with so much ease.&lt;/p&gt;

</description>
      <category>vim</category>
      <category>coc</category>
      <category>php</category>
      <category>laravel</category>
    </item>
    <item>
      <title>Run any code from Vim</title>
      <dc:creator>woland</dc:creator>
      <pubDate>Mon, 10 Jun 2024 22:13:08 +0000</pubDate>
      <link>https://forem.com/woland/run-any-code-from-vim-1i2o</link>
      <guid>https://forem.com/woland/run-any-code-from-vim-1i2o</guid>
      <description>&lt;p&gt;Do you want to quickly run and test any code without leaving Vim and without even opening a &lt;code&gt;:terminal&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;There is a very simple way of achieving this. All we need is a runner function, a run command and a mapping to call it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is an example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; CodeRunner&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;ft&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt;# &lt;span class="s1"&gt;'python'&lt;/span&gt;
        &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'RPy'&lt;/span&gt;
    &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;endfunction&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;and the run command:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;command&lt;span class="p"&gt;!&lt;/span&gt; RPy &lt;span class="p"&gt;:!&lt;/span&gt;&lt;span class="k"&gt;python3&lt;/span&gt; %
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;and the mapping:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;nnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;F12&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;call&lt;/span&gt; CodeRunner&lt;span class="p"&gt;()&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;I prefer to wrap the mapping and the run command inside an augroup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;augroup code_runner
    &lt;span class="k"&gt;au&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;
    &lt;span class="k"&gt;au&lt;/span&gt; &lt;span class="nb"&gt;FileType&lt;/span&gt; &lt;span class="k"&gt;python&lt;/span&gt; command&lt;span class="p"&gt;!&lt;/span&gt; RPy &lt;span class="p"&gt;:!&lt;/span&gt;&lt;span class="k"&gt;python3&lt;/span&gt; %
    nnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;F12&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;call&lt;/span&gt; CodeRunner&lt;span class="p"&gt;()&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
augroup end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Place the above snippets in your .vimrc and source it. Now, every time you’re inside a python file, you can just press F12 to run the code and see its output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can add other languages to the function and to the augroup too:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="c"&gt;"===[ Execute From Vim ]==="&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; CodeRunner&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;ft&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt;# &lt;span class="s1"&gt;'python'&lt;/span&gt;
     &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'RPy'&lt;/span&gt;
   &lt;span class="k"&gt;elseif&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;ft&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt;# &lt;span class="s1"&gt;'sh'&lt;/span&gt;
     &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'RB'&lt;/span&gt;
   &lt;span class="k"&gt;elseif&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;ft&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt;# &lt;span class="s1"&gt;'javascript'&lt;/span&gt;
     &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'RJs'&lt;/span&gt;
   &lt;span class="k"&gt;elseif&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;ft&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt;# &lt;span class="s1"&gt;'php'&lt;/span&gt;
     &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'RPHP'&lt;/span&gt;
   &lt;span class="k"&gt;elseif&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;ft&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt;# &lt;span class="s1"&gt;'go'&lt;/span&gt;
     &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'RGo'&lt;/span&gt;
   &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;endfunction&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;And the corresponding augroup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;augroup code_runner
    &lt;span class="k"&gt;au&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;
    &lt;span class="k"&gt;au&lt;/span&gt; &lt;span class="nb"&gt;FileType&lt;/span&gt; &lt;span class="k"&gt;python&lt;/span&gt; command&lt;span class="p"&gt;!&lt;/span&gt; RPy &lt;span class="p"&gt;:!&lt;/span&gt;&lt;span class="k"&gt;python3&lt;/span&gt; %
    &lt;span class="k"&gt;au&lt;/span&gt; &lt;span class="nb"&gt;FileType&lt;/span&gt; &lt;span class="k"&gt;sh&lt;/span&gt; command&lt;span class="p"&gt;!&lt;/span&gt; RB &lt;span class="p"&gt;:!&lt;/span&gt;bash %
    &lt;span class="k"&gt;au&lt;/span&gt; &lt;span class="nb"&gt;FileType&lt;/span&gt; javascript command&lt;span class="p"&gt;!&lt;/span&gt; RJs &lt;span class="p"&gt;:!&lt;/span&gt;node %
    &lt;span class="k"&gt;au&lt;/span&gt; &lt;span class="nb"&gt;FileType&lt;/span&gt; &lt;span class="k"&gt;go&lt;/span&gt; command&lt;span class="p"&gt;!&lt;/span&gt; RGo &lt;span class="p"&gt;:!&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt; run %
    &lt;span class="k"&gt;au&lt;/span&gt; &lt;span class="nb"&gt;FileType&lt;/span&gt; php command&lt;span class="p"&gt;!&lt;/span&gt; RPHP &lt;span class="p"&gt;:!&lt;/span&gt;php %
    nnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;F12&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;call&lt;/span&gt; CodeRunner&lt;span class="p"&gt;()&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
augroup end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this, you can run bash, python, javascript, golang and php with the F12 key.&lt;/p&gt;

&lt;h1&gt;
  
  
  A better idea
&lt;/h1&gt;

&lt;p&gt;While the above script works, it goes without saying that it's a mess, we can improve it by using a dictionary and checking the ft variable against it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; CodeRunner&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;silent&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;clear

    &lt;span class="k"&gt;let&lt;/span&gt; file_commands &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="s1"&gt;'python'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'python3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="s1"&gt;'sh'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'bash'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="s1"&gt;'javascript'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'node'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="s1"&gt;'go'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'go run'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="s1"&gt;'php'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'php'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="s1"&gt;'perl'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'perl'&lt;/span&gt;
&lt;span class="se"&gt;                \&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nb"&gt;ft&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &amp;amp;&lt;span class="k"&gt;filetype&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;has_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;file_commands&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;ft&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; cmd &lt;span class="p"&gt;=&lt;/span&gt; file_commands&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;ft&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'!'&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; cmd &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' %'&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
        echo &lt;span class="s2"&gt;"No run command defined for filetype: "&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;ft&lt;/span&gt;
    &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;endfunction&lt;/span&gt;

command&lt;span class="p"&gt;!&lt;/span&gt; CodeRunner &lt;span class="k"&gt;call&lt;/span&gt; CodeRunner&lt;span class="p"&gt;()&lt;/span&gt;
nnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;F12&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;CodeRunner&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A similar method can be used for compiled languages, such as C.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; CompileAndRun&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; current_file &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; file_name &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fnamemodify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;current_file&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;':t:r'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; compile_cmd &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'gcc '&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; current_file &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' -o '&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; file_name &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' &amp;amp;&amp;amp; ./'&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; file_name
  &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'!'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;compile_cmd
&lt;span class="k"&gt;endfunction&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function above, will compile the C code inside the current buffer using gcc, and then execute the binary output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Naturally, we need a corresponding mapping:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;nnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;F8&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;call&lt;/span&gt; CompileAndRun&lt;span class="p"&gt;()&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More arguments can be added to the compile _cmd to serve your needs.&lt;/p&gt;

&lt;h1&gt;
  
  
  Update
&lt;/h1&gt;

&lt;p&gt;You can improve the CodeRunner and CompileAndRun functions by converting them to vim9script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;vim9script&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; CodeRunner&lt;span class="p"&gt;()&lt;/span&gt;
    var file_commands &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'python'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'python3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'sh'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'bash'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'javascript'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'node'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'go'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'go run'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'php'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'php'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'perl'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'perl'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    # &lt;span class="k"&gt;filetype&lt;/span&gt; variable
    var &lt;span class="nb"&gt;ft&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &amp;amp;&lt;span class="k"&gt;filetype&lt;/span&gt;

    # check &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;ft&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; found &lt;span class="k"&gt;in&lt;/span&gt; the &lt;span class="nb"&gt;dict&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;has_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;file_commands&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;ft&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        var cmd &lt;span class="p"&gt;=&lt;/span&gt; file_commands&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;ft&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;silent&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;clear
        &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'!'&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; cmd &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="s1"&gt;' %'&lt;/span&gt; 
    &lt;span class="k"&gt;else&lt;/span&gt;
        echo &lt;span class="s2"&gt;"No run command defined for filetype: "&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="nb"&gt;ft&lt;/span&gt;
    &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;enddef&lt;/span&gt;

# compile the functions 
defcompile

command&lt;span class="p"&gt;!&lt;/span&gt; CodeRunner &lt;span class="k"&gt;call&lt;/span&gt; CodeRunner&lt;span class="p"&gt;()&lt;/span&gt;
nnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;F12&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;CodeRunner&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can also improve our CompileAndRun function to display the compiler errors, which is something that we could've done in legacy vim9script as well, but oh well ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;# Compile &lt;span class="nb"&gt;and&lt;/span&gt; Run with Error Split
&lt;span class="k"&gt;def&lt;/span&gt; CompileAndRun&lt;span class="p"&gt;()&lt;/span&gt;
    var current_file &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    var file_name &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fnamemodify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;current_file&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;':t:r'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    var compile_cmd &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'gcc '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; current_file &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="s1"&gt;' -o '&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; file_name

    # Compile
    var compile_result &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;systemlist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;compile_cmd&lt;span class="p"&gt;)&lt;/span&gt;

    # If there are errors
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;shell_error &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;botright&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="k"&gt;setlocal&lt;/span&gt;\ &lt;span class="nb"&gt;buftype&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;nofile\ &lt;span class="nb"&gt;bufhidden&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;wipe\ &lt;span class="k"&gt;noswapfile&lt;/span&gt;
        &lt;span class="k"&gt;file&lt;/span&gt; CompileErrors
        &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="nb"&gt;setline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; compile_result&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="k"&gt;endif&lt;/span&gt;

    # Run &lt;span class="nb"&gt;binary&lt;/span&gt;
    &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'terminal ./'&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; file_name
&lt;span class="k"&gt;enddef&lt;/span&gt;

defcompile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I think the comments are enough to let you know what is going on. It simply compiles and executes the binary while showing the results in a split, and if there are errors, it simply displays them in a split.&lt;/p&gt;

&lt;p&gt;You can also set this up to automatically close the error split when you switch back to your code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;# Global variable &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; error &lt;span class="k"&gt;split&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; closed automatically
&lt;span class="nv"&gt;g:compile_err_auto_close&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

# Augroup &lt;span class="k"&gt;to&lt;/span&gt; automatically &lt;span class="k"&gt;close&lt;/span&gt; the error &lt;span class="k"&gt;split&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;g:compile_err_auto_close&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    augroup AutoCloseCompileErrors
        autocmd&lt;span class="p"&gt;!&lt;/span&gt;
        autocmd&lt;span class="p"&gt;!&lt;/span&gt; &lt;span class="nb"&gt;BufEnter&lt;/span&gt; * &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;bufname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'CompileErrors'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'bdelete! CompileErrors'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt;
    augroup END
&lt;span class="k"&gt;endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Note
&lt;/h2&gt;

&lt;p&gt;You only need to write &lt;code&gt;defcompile&lt;/code&gt; once at the end of your script to compile all the functions in that file. So if you plan to put these functions in one vimscript file, you only need one &lt;code&gt;defcompile&lt;/code&gt; entry for both of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Note Two
&lt;/h2&gt;

&lt;p&gt;For a more complete and in depth script with an improved CompileAndRun function in Vim9Script, see my other article. &lt;a href="https://dev.to/woland/how-to-write-vim9script-or-how-to-compile-and-run-c-code-from-vim-259a"&gt; How to write vim9script or How to Compile and Run C code from Vim &lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
