<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cognitive Complexity on Cesar Gimenes</title><link>https://crg.eti.br/en/tags/cognitive-complexity/</link><description>Recent content in Cognitive Complexity 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/cognitive-complexity/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></channel></rss>