# My neovim workflow

![nvim-000](https://raw.githubusercontent.com/haunt98/posts-images/main/nvim-000.jxl)

All configs are in [my dotfiles](https://github.com/haunt98/dotfiles).

## Trick or treat

Search current word: `*`

Search multiple words:

```vim
:/\vword1|word2|word3
```

Replace word:

```vim
:%s/word1/word2/g
```

Delete all lines contain word:

```vim
:g/word/d
```

Delete all lines **not** contain word:

```vim
:g!/word/d

:v/word/d
```

Play macro (after selecting lines):

```vim
:norm! @a
```

Sort lines (after selecting lines):

```vim
:sort -u
```

Reverse lines (after selcting lines):

```vim
:!tail -r
```

Column-ize lines:

```vim
:!column -t
```

## Jumpo

Basic:

- `gg`: first line
- `G`: last line
- `0`: first character of line
- `$`: last character of line
- `w`, `b`: word forward/backward
- `e`, `ge`: end of word current/before
- `W`, `B`: WORD (word with special char) forward/backward
- `E`, `gE`: end of WORD current/before
- `f{char}`, `F{char}`: find forward/backward character

Advance:

- `CTRL-O`, `CTRL-I`: cursor position backward/forward
- `{`, `}`: paragraph backward/forward
- `H`: top of screen
- `M`: middle of screen
- `L`: bottom of screen
- `CTRL-]`, `CTRL-T`: jump to tag/jump back from tag
  - Support jump to Go definition with
    [fatih/vim-go](https://github.com/fatih/vim-go).

## Fold

- `zR`: open all folds.
- `za`, `zA`: toggle fold

## Keymap

Use both `\` and `;` as leader key:

```lua
vim.keymap.set("n", ";", "<Leader>", { remap = true })
vim.keymap.set("n", "'", "<Leader>", { remap = true })
```

Ground rules:

- `<Leader>` prefix: prefer global keymap
- `<Space>` prefix: prefer lsp keymap, for coding of course :D

- With [ibhagwan/fzf-lua](https://github.com/ibhagwan/fzf-lua):
  - `<Leader>f`: find files
  - `<Leader>l`: find lines
  - `<Leader>rg`: grep files
  - With [neovim/nvim-lspconfig](https://github.com/neovim/nvim-lspconfig)
    helps:
    - `<Space>s`: find lsp symbols
    - `<Space>d`: go to definition
    - `<Space>r`: go to references
    - `<Space>i`: go to implementation
- With [nvim-tree/nvim-tree.lua](https://github.com/nvim-tree/nvim-tree.lua),
  inside nvim-tree:
  - `<C-n>`: toggle
  - `<Leader>n`: locate file
  - `a`: create
  - `d`: delete
  - `r`: rename
  - `x`: cut
  - `c`: copy
  - `p`: paste
  - `U`: toggle hidden
- With [lewis6991/gitsigns.nvim](https://github.com/lewis6991/gitsigns.nvim):
  - `]c`, `[c`: next/previous git change
- With [tpope/vim-projectionist](https://github.com/tpope/vim-projectionist)
  - `:A`: open alternate file
- With [echasnovski/mini.nvim](https://github.com/echasnovski/mini.nvim)
  - With mini-bracketed
    - `[D`, `]D`, `[d`, `]d`: diagnostic backward/forward
    - `[Q`, `]Q`, `[q`, `]q`: quickfix backward/forward
    - `[T`, `]T`, `[t`, `]t`: tree-sitter backward/forward
      - Support more languages with
        [nvim-treesitter/nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter)
  - With mini-comment
    - `gcc`: comment/uncomment current line
    - `gc`: comment/uncomment selected lines
  - With mini-completion
    - `<C-Space>`: trigger completion
  - With mini-surround
    - `sa`: add surround
    - `sd`: delete surround
    - `sr`: replace surround
- With [neovim/nvim-lspconfig](https://github.com/neovim/nvim-lspconfig):
  - `<Space>e`: float diagnostic
  - `<Space>k`: hover
  - `<F2>`: rename
  - `<Space>f`: format code
  - `<Space>ca`: code action
  - `<Space>ci`: organize imports

## References / Thanks

- vim docs:
  - [Seven habits of effective text editing 2.0](https://moolenaar.net/habits_2007.pdf)
- neovim official docs:
  - [neovim Motion](https://neovim.io/doc/user/motion.html)
  - [neovim Tagsrch](http://neovim.io/doc/user/tagsrch.html)
  - [neovim Lua-guide](https://neovim.io/doc/user/lua-guide.html)
- Hidden gem:
  - [Vim Tips (Revisited)](https://bluz71.github.io/2021/09/10/vim-tips-revisited.html)
  - https://superuser.com/questions/189947/how-do-i-reverse-selected-lines-order-in-vim