<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Neovim on Cesar Gimenes</title><link>https://crg.eti.br/en/tags/neovim/</link><description>Recent content in Neovim on Cesar Gimenes</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>crg@crg.eti.br (Cesar Gimenes)</managingEditor><webMaster>crg@crg.eti.br (Cesar Gimenes)</webMaster><lastBuildDate>Fri, 29 Nov 2024 00:31:30 -0300</lastBuildDate><atom:link href="https://crg.eti.br/en/tags/neovim/index.xml" rel="self" type="application/rss+xml"/><item><title>Customizing Neovim: Sorting and Removing Duplicate Lines with Lua</title><link>https://crg.eti.br/en/post/personalizando_neovim_ordenacao_e_remocao_de_linhas_duplicadas_com_lua/</link><pubDate>Fri, 29 Nov 2024 00:31:30 -0300</pubDate><author>crg@crg.eti.br (Cesar Gimenes)</author><guid>https://crg.eti.br/en/post/personalizando_neovim_ordenacao_e_remocao_de_linhas_duplicadas_com_lua/</guid><description>&lt;p>Continuing my Neovim customizations, here are two functions I use frequently: &lt;code>sort_lines&lt;/code> and &lt;code>sort_and_uniq_lines&lt;/code>. As the names suggest, they sort the content of the selected lines and, in the case of &lt;code>sort_and_uniq_lines&lt;/code>, also remove duplicates.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-lua" data-lang="lua">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff7b72">function&lt;/span> &lt;span style="color:#d2a8ff;font-weight:bold">sort_lines&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8b949e;font-style:italic">-- Get the start and end position of the selection&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">local&lt;/span> start_pos &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> vim.fn.getpos(&lt;span style="color:#a5d6ff">&amp;#34;&amp;#39;&amp;lt;&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">local&lt;/span> end_pos &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> vim.fn.getpos(&lt;span style="color:#a5d6ff">&amp;#34;&amp;#39;&amp;gt;&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8b949e;font-style:italic">-- Convert the position to the line index&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8b949e;font-style:italic">-- Adjust start_pos because lines in Lua start at 0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">local&lt;/span> start_line &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> start_pos[&lt;span style="color:#a5d6ff">2&lt;/span>] &lt;span style="color:#ff7b72;font-weight:bold">-&lt;/span> &lt;span style="color:#a5d6ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8b949e;font-style:italic">-- No need to adjust end_line&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">local&lt;/span> end_line &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> end_pos[&lt;span style="color:#a5d6ff">2&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8b949e;font-style:italic">-- Get the selected lines&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">local&lt;/span> lines &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> vim.api.nvim_buf_get_lines(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a5d6ff">0&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start_line,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> end_line,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#79c0ff">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8b949e;font-style:italic">-- Sort the lines&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> table.sort(lines)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8b949e;font-style:italic">-- Replace the original lines&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vim.api.nvim_buf_set_lines(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a5d6ff">0&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start_line,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> end_line,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#79c0ff">false&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> lines
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff7b72">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff7b72">function&lt;/span> &lt;span style="color:#d2a8ff;font-weight:bold">sort_and_uniq_lines&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">local&lt;/span> start_pos &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> vim.fn.getpos(&lt;span style="color:#a5d6ff">&amp;#34;&amp;#39;&amp;lt;&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">local&lt;/span> end_pos &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> vim.fn.getpos(&lt;span style="color:#a5d6ff">&amp;#34;&amp;#39;&amp;gt;&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">local&lt;/span> start_line &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> start_pos[&lt;span style="color:#a5d6ff">2&lt;/span>] &lt;span style="color:#ff7b72;font-weight:bold">-&lt;/span> &lt;span style="color:#a5d6ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">local&lt;/span> end_line &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> end_pos[&lt;span style="color:#a5d6ff">2&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">local&lt;/span> lines &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> vim.api.nvim_buf_get_lines(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a5d6ff">0&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start_line,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> end_line,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#79c0ff">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> table.sort(lines)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8b949e;font-style:italic">-- Remove duplicate lines&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">local&lt;/span> uniq_lines &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> {}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">local&lt;/span> last_line &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> &lt;span style="color:#79c0ff">nil&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">for&lt;/span> _, line &lt;span style="color:#ff7b72">in&lt;/span> ipairs(lines) &lt;span style="color:#ff7b72">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">if&lt;/span> line &lt;span style="color:#ff7b72;font-weight:bold">~=&lt;/span> last_line &lt;span style="color:#ff7b72">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> table.insert(uniq_lines, line)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> last_line &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> line
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vim.api.nvim_buf_set_lines(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a5d6ff">0&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start_line,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> end_line,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#79c0ff">false&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> uniq_lines
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff7b72">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>vim.api.nvim_set_keymap(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a5d6ff">&amp;#39;v&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a5d6ff">&amp;#39;&amp;lt;Leader&amp;gt;s&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a5d6ff">&amp;#39;:lua sort_lines()&amp;lt;CR&amp;gt;&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> { noremap &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> &lt;span style="color:#79c0ff">true&lt;/span>, silent &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> &lt;span style="color:#79c0ff">true&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>vim.api.nvim_set_keymap(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a5d6ff">&amp;#39;v&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a5d6ff">&amp;#39;&amp;lt;Leader&amp;gt;u&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a5d6ff">&amp;#39;:lua sort_and_uniq_lines()&amp;lt;CR&amp;gt;&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> { noremap &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> &lt;span style="color:#79c0ff">true&lt;/span>, silent &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> &lt;span style="color:#79c0ff">true&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;a href="https://crg.eti.br/pt-br/post/personalizando_neovim_ordenacao_e_remocao_de_linhas_duplicadas_com_lua/sort_lines.lua">sort_lines.lua&lt;/a>&lt;/p></description></item><item><title>Building a Bookmark System in Neovim with Lua</title><link>https://crg.eti.br/en/post/criando-sistema-de-bookmarks-no-neovim-com-lua/</link><pubDate>Mon, 25 Nov 2024 00:25:27 -0300</pubDate><author>crg@crg.eti.br (Cesar Gimenes)</author><guid>https://crg.eti.br/en/post/criando-sistema-de-bookmarks-no-neovim-com-lua/</guid><description>&lt;p>Continuing our series of articles aimed at reducing the cognitive effort involved in programming tasks, here is my small bookmark script for Neovim.&lt;/p>
&lt;p>Neovim is incredibly customizable. Without having to build full plugins, you can add a lot of functionality with just a few Lua functions.&lt;/p>
&lt;p>In my day-to-day work, I often need to return to the same files to fix and test problems. Opening those files directly at the right line, without wasting time navigating, is essential.&lt;/p></description></item><item><title>Reducing Cognitive Complexity in Programming</title><link>https://crg.eti.br/en/post/diminuindo-a-complexidade-cognitiva-na-programacao/</link><pubDate>Sat, 23 Nov 2024 21:28:27 -0300</pubDate><author>crg@crg.eti.br (Cesar Gimenes)</author><guid>https://crg.eti.br/en/post/diminuindo-a-complexidade-cognitiva-na-programacao/</guid><description>&lt;p>I spend a lot of time and effort reducing cognitive complexity when I program.&lt;/p>
&lt;p>Cognitive complexity is how much you have to think to get a task done. Small details can make a task unnecessarily complex.&lt;/p>
&lt;p>For example, finding a snippet of code hidden among many files inside a large directory structure takes effort. Even if the structure is familiar and well designed, the goal is not to navigate through it opening files until you find the code to edit; the goal is simply to edit the code. Anything beyond that is wasted cognitive effort.&lt;/p></description></item></channel></rss>