<!doctype html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.5.0/github-markdown.min.css" /> <title>haunt98 posts</title> </head> <style> .markdown-body { box-sizing: border-box; min-width: 200px; max-width: 980px; margin: 0 auto; padding: 45px; } @media (max-width: 767px) { .markdown-body { padding: 15px; } } </style> <body class="markdown-body"> <h2> <a href="index.html"><code>~</code></a> </h2> <h1> <a id="user-content-my-neovim-workflow" class="anchor" aria-hidden="true" tabindex="-1" href="#my-neovim-workflow" ><span aria-hidden="true" class="octicon octicon-link"></span></a >My neovim workflow </h1> <p> <a target="_blank" rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/haunt98/posts-images/main/nvim-000.jxl" ><img src="https://raw.githubusercontent.com/haunt98/posts-images/main/nvim-000.jxl" alt="nvim-000" style="max-width: 100%" /></a> </p> <p> All configs are in <a href="https://github.com/haunt98/dotfiles">my dotfiles</a>. </p> <h2> <a id="user-content-trick-or-treat" class="anchor" aria-hidden="true" tabindex="-1" href="#trick-or-treat" ><span aria-hidden="true" class="octicon octicon-link"></span></a >Trick or treat </h2> <p>Search current word: <code>*</code></p> <p>Search multiple words:</p> <div class="highlight highlight-source-viml"> <pre>:/<span class="pl-cce">\v</span>word1|word2|word3</pre> </div> <p>Replace word:</p> <div class="highlight highlight-source-viml"> <pre>:<span class="pl-k">%</span><span class="pl-c1">s</span><span class="pl-sr">/word1/</span>word2/<span class="pl-c1">g</span></pre> </div> <p>Delete all lines contain word:</p> <div class="highlight highlight-source-viml"> <pre>:<span class="pl-c1">g</span><span class="pl-sr">/word/</span><span class="pl-c1">d</span></pre> </div> <p>Delete all lines <strong>not</strong> contain word:</p> <div class="highlight highlight-source-viml"> <pre>:<span class="pl-c1">g</span><span class="pl-k">!</span><span class="pl-sr">/word/</span><span class="pl-c1">d</span> :<span class="pl-c1">v</span><span class="pl-sr">/word/</span><span class="pl-c1">d</span></pre> </div> <p>Play macro (after selecting lines):</p> <div class="highlight highlight-source-viml"> <pre>:norm<span class="pl-k">!</span> <span class="pl-smi">@a</span></pre> </div> <p>Sort lines (after selecting lines):</p> <div class="highlight highlight-source-viml"> <pre>:<span class="pl-c1">sort</span> <span class="pl-k">-</span><span class="pl-c1">u</span></pre> </div> <p>Reverse lines (after selcting lines):</p> <div class="highlight highlight-source-viml"> <pre>:<span class="pl-k">!</span>tail <span class="pl-k">-</span><span class="pl-c1">r</span></pre> </div> <p>Column-ize lines:</p> <div class="highlight highlight-source-viml"> <pre>:<span class="pl-k">!</span>column <span class="pl-k">-</span><span class="pl-c1">t</span></pre> </div> <h2> <a id="user-content-jumpo" class="anchor" aria-hidden="true" tabindex="-1" href="#jumpo" ><span aria-hidden="true" class="octicon octicon-link"></span></a >Jumpo </h2> <p>Basic:</p> <ul> <li><code>gg</code>: first line</li> <li><code>G</code>: last line</li> <li><code>0</code>: first character of line</li> <li><code>$</code>: last character of line</li> <li><code>w</code>, <code>b</code>: word forward/backward</li> <li><code>e</code>, <code>ge</code>: end of word current/before</li> <li> <code>W</code>, <code>B</code>: WORD (word with special char) forward/backward </li> <li><code>E</code>, <code>gE</code>: end of WORD current/before</li> <li> <code>f{char}</code>, <code>F{char}</code>: find forward/backward character </li> </ul> <p>Advance:</p> <ul> <li> <code>CTRL-O</code>, <code>CTRL-I</code>: cursor position backward/forward </li> <li><code>{</code>, <code>}</code>: paragraph backward/forward</li> <li><code>H</code>: top of screen</li> <li><code>M</code>: middle of screen</li> <li><code>L</code>: bottom of screen</li> <li> <code>CTRL-]</code>, <code>CTRL-T</code>: jump to tag/jump back from tag <ul> <li> Support jump to Go definition with <a href="https://github.com/fatih/vim-go">fatih/vim-go</a>. </li> </ul> </li> </ul> <h2> <a id="user-content-fold" class="anchor" aria-hidden="true" tabindex="-1" href="#fold" ><span aria-hidden="true" class="octicon octicon-link"></span></a >Fold </h2> <ul> <li><code>zR</code>: open all folds.</li> <li><code>za</code>, <code>zA</code>: toggle fold</li> </ul> <h2> <a id="user-content-keymap" class="anchor" aria-hidden="true" tabindex="-1" href="#keymap" ><span aria-hidden="true" class="octicon octicon-link"></span></a >Keymap </h2> <p>Use both <code>\</code> and <code>;</code> as leader key:</p> <div class="highlight highlight-source-lua"> <pre>vim.<span class="pl-smi">keymap</span>.<span class="pl-c1">set</span>(<span class="pl-s"><span class="pl-pds">"</span>n<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>;<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span><Leader><span class="pl-pds">"</span></span>, { remap <span class="pl-k">=</span> <span class="pl-c1">true</span> }) vim.<span class="pl-smi">keymap</span>.<span class="pl-c1">set</span>(<span class="pl-s"><span class="pl-pds">"</span>n<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>'<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span><Leader><span class="pl-pds">"</span></span>, { remap <span class="pl-k">=</span> <span class="pl-c1">true</span> })</pre> </div> <p>Ground rules:</p> <ul> <li> <p><code><Leader></code> prefix: prefer global keymap</p> </li> <li> <p> <code><Space></code> prefix: prefer lsp keymap, for coding of course :D </p> </li> <li> <p> With <a href="https://github.com/ibhagwan/fzf-lua">ibhagwan/fzf-lua</a>: </p> <ul> <li><code><Leader>f</code>: find files</li> <li><code><Leader>l</code>: find lines</li> <li><code><Leader>rg</code>: grep files</li> <li> With <a href="https://github.com/neovim/nvim-lspconfig" >neovim/nvim-lspconfig</a > helps: <ul> <li><code><Space>s</code>: find lsp symbols</li> <li><code><Space>d</code>: go to definition</li> <li><code><Space>r</code>: go to references</li> <li><code><Space>i</code>: go to implementation</li> </ul> </li> </ul> </li> <li> <p> With <a href="https://github.com/nvim-tree/nvim-tree.lua" >nvim-tree/nvim-tree.lua</a >, inside nvim-tree: </p> <ul> <li><code><C-n></code>: toggle</li> <li><code><Leader>n</code>: locate file</li> <li><code>a</code>: create</li> <li><code>d</code>: delete</li> <li><code>r</code>: rename</li> <li><code>x</code>: cut</li> <li><code>c</code>: copy</li> <li><code>p</code>: paste</li> <li><code>U</code>: toggle hidden</li> </ul> </li> <li> <p> With <a href="https://github.com/lewis6991/gitsigns.nvim" >lewis6991/gitsigns.nvim</a >: </p> <ul> <li><code>]c</code>, <code>[c</code>: next/previous git change</li> </ul> </li> <li> <p> With <a href="https://github.com/tpope/vim-projectionist" >tpope/vim-projectionist</a > </p> <ul> <li><code>:A</code>: open alternate file</li> </ul> </li> <li> <p> With <a href="https://github.com/echasnovski/mini.nvim" >echasnovski/mini.nvim</a > </p> <ul> <li> With mini-bracketed <ul> <li> <code>[D</code>, <code>]D</code>, <code>[d</code>, <code>]d</code>: diagnostic backward/forward </li> <li> <code>[Q</code>, <code>]Q</code>, <code>[q</code>, <code>]q</code>: quickfix backward/forward </li> <li> <code>[T</code>, <code>]T</code>, <code>[t</code>, <code>]t</code>: tree-sitter backward/forward <ul> <li> Support more languages with <a href="https://github.com/nvim-treesitter/nvim-treesitter" >nvim-treesitter/nvim-treesitter</a > </li> </ul> </li> </ul> </li> <li> With mini-comment <ul> <li><code>gcc</code>: comment/uncomment current line</li> <li><code>gc</code>: comment/uncomment selected lines</li> </ul> </li> <li> With mini-completion <ul> <li><code><C-Space></code>: trigger completion</li> </ul> </li> <li> With mini-surround <ul> <li><code>sa</code>: add surround</li> <li><code>sd</code>: delete surround</li> <li><code>sr</code>: replace surround</li> </ul> </li> </ul> </li> <li> <p> With <a href="https://github.com/neovim/nvim-lspconfig" >neovim/nvim-lspconfig</a >: </p> <ul> <li><code><Space>e</code>: float diagnostic</li> <li><code><Space>k</code>: hover</li> <li><code><F2></code>: rename</li> <li><code><Space>f</code>: format code</li> <li><code><Space>ca</code>: code action</li> <li><code><Space>ci</code>: organize imports</li> </ul> </li> </ul> <h2> <a id="user-content-references--thanks" class="anchor" aria-hidden="true" tabindex="-1" href="#references--thanks" ><span aria-hidden="true" class="octicon octicon-link"></span></a >References / Thanks </h2> <ul> <li> vim docs: <ul> <li> <a href="https://moolenaar.net/habits_2007.pdf" rel="nofollow" >Seven habits of effective text editing 2.0</a > </li> </ul> </li> <li> neovim official docs: <ul> <li> <a href="https://neovim.io/doc/user/motion.html" rel="nofollow" >neovim Motion</a > </li> <li> <a href="http://neovim.io/doc/user/tagsrch.html" rel="nofollow" >neovim Tagsrch</a > </li> <li> <a href="https://neovim.io/doc/user/lua-guide.html" rel="nofollow" >neovim Lua-guide</a > </li> </ul> </li> <li> Hidden gem: <ul> <li> <a href="https://bluz71.github.io/2021/09/10/vim-tips-revisited.html" rel="nofollow" >Vim Tips (Revisited)</a > </li> <li> <a href="https://superuser.com/questions/189947/how-do-i-reverse-selected-lines-order-in-vim" rel="nofollow" >https://superuser.com/questions/189947/how-do-i-reverse-selected-lines-order-in-vim</a > </li> </ul> </li> </ul> <div> Feel free to ask me via <a href="mailto:hauvipapro+posts@gmail.com">email</a> or <a rel="me" href="https://hachyderm.io/@haunguyen">Mastodon</a>. <br />Source code is available on <a href="https://github.com/haunt98/posts-go">GitHub</a> <a href="https://codeberg.org/yoshie/posts-go">Codeberg</a> <a href="https://git.sr.ht/~youngyoshie/posts-go">sourcehut</a> <a href="https://gitea.treehouse.systems/yoshie/posts-go">Treehouse</a> <a href="https://gitlab.com/youngyoshie/posts-go">GitLab</a> </div> </body> </html>