<!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>&lt;Leader&gt;<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>&lt;Leader&gt;<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>&lt;Leader&gt;</code> prefix: prefer global keymap</p>
      </li>
      <li>
        <p>
          <code>&lt;Space&gt;</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>&lt;Leader&gt;f</code>: find files</li>
          <li><code>&lt;Leader&gt;l</code>: find lines</li>
          <li><code>&lt;Leader&gt;rg</code>: grep files</li>
          <li>
            With
            <a href="https://github.com/neovim/nvim-lspconfig"
              >neovim/nvim-lspconfig</a
            >
            helps:
            <ul>
              <li><code>&lt;Space&gt;s</code>: find lsp symbols</li>
              <li><code>&lt;Space&gt;d</code>: go to definition</li>
              <li><code>&lt;Space&gt;r</code>: go to references</li>
              <li><code>&lt;Space&gt;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>&lt;C-n&gt;</code>: toggle</li>
          <li><code>&lt;Leader&gt;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>&lt;C-Space&gt;</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>&lt;Space&gt;e</code>: float diagnostic</li>
          <li><code>&lt;Space&gt;k</code>: hover</li>
          <li><code>&lt;F2&gt;</code>: rename</li>
          <li><code>&lt;Space&gt;f</code>: format code</li>
          <li><code>&lt;Space&gt;ca</code>: code action</li>
          <li><code>&lt;Space&gt;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>