「How to Do 90% of What Plugins Do (With Just Vim)」

# きっかけ
Vim Advent Calendarを見ていたら、ryicohさんのhttps://zenn.dev/vim_jp/articles/vim_noplugin の記事をお見かけして、私もhttps://www.youtube.com/watch?v=XA2WjJbmmoM 見てみたくなった。
(vimができることはvimにやらせたいと前から思っていた)

# 概要
上記動画を見ながら、個人的に重要だったことをメモする。

# 内容
## BASIC SETUP
vimrcを書くときにいつも言われてはいたが、今になって動画で見るとそういうことかと気づく。
```vimscript
" BASIC SETUP:

" enter the current millenium
set nocompatible

" enable syntax and plugins (for netrw)
syntax enable
filetype plugin on
```

## FINDING FILES
pathオプションとか使ったことなかった。
```vimscript
" FINDING FILES:

" Search down into subfolders
" Provides tab-completion for all file-related tasks
set path+=**
```
`wildmenu`は知っている。

`:find ファイル名` で探し出してきてくれる。
`:b foo`でfooが部分的にでもマッチするファイル名のバッファーを開いてくれる（！）。もし唯一にならなければTab補完可能。

(`:find`はpathの中を探してくれて、`:b`はバッファー内を探してくれるイメージか)

## `:echo expand("%")`
ここではしゃぐ。
expand面白いですよね、同意します。

## TAG JUMPING
毎回、一度外に出てctagsしていたけれど、確かにこれで良いか。
```vimscript
" TAG JUMPING:

" Create the `tags` file (may need to install ctags first)
command! MakeTags !ctags -R .

" NOW WE CAN:
" - Use ^] to jump to tag under the cursor
" - Use g^] for ambiguous tags
' - Use ^t to jump back up the tag stack
```

(ちなみに、ctagsは`--languages=python`とすればPythonも使えるが、もしかしてデフォルトでやってくれる？)
(デフォルトでやってくれるんだ！！)

# AUTOCOMPLETE
`^x^f`, `^n`, `^p`は使ったことはあったけれど、なるほど、`^x^n`を使えば現在のファイルのみに限定することができるのか。。
```vimscript
" AUTOCOMPLETE:

" HIGHLIGHTS:
" - ^x^n for JUST this file
" - ^x^f for filenames (works with our path trick!)
" - ^x^] for tags only
" - ^n for anything specified by the 'complete' option
```
https://vimhelp.org/insert.txt.html#ins-completion あ、なるほど
```:insert.txt
1. Whole lines                                          i_CTRL-X_CTRL-L
2. keywords in the current file                         i_CTRL-X_CTRL-N
3. keywords in 'dictionary'                             i_CTRL-X_CTRL-K
4. keywords in 'thesaurus', thesaurus-style             i_CTRL-X_CTRL-T
5. keywords in the current and included files           i_CTRL-X_CTRL-I
6. tags                                                 i_CTRL-X_CTRL-]
7. file names                                           i_CTRL-X_CTRL-F
8. definitions or macros                                i_CTRL-X_CTRL-D
9. Vim command-line                                     i_CTRL-X_CTRL-V
10. User defined completion                             i_CTRL-X_CTRL-U
11. omni completion                                     i_CTRL-X_CTRL-O
12. Spelling suggestions                                i_CTRL-X_s
13. keywords in 'complete'                              i_CTRL-N i_CTRL-P
```

## FILE BROWSING
こうすればよかったのか。。すごい。
```vimscript
" FILE BROWSING:

" Tweaks for browsing
let g:netrw_banner=0           " disable annoying banner
let g:netrw_browse_split=4     " open in prior window
let g:netrw_altv=1             " open splits to the right
let g:netrw_liststyle=3        " tree view
let g:netrw_list_hide=netrw_gitignore#Hide()
let g:netrw_list_hide.=',\(^\|\s\s\)\zs\.\S\+'
```
ここに使えるマップ書いてあったのか。
https://vimhelp.org/pi_netrw.txt.html#netrw-browse-maps

## only
`:only`現在のwindowだけにする
`:tabonly`現在のタブだけにする

そういえば使ってなかったな。（そもそもTabはなんとなく使っていなかったけれど）

## template
`:0r ファイル名`とかはよくやっていたけれど、こういうやり方もあるか。入力するだけでなくそのまま行きたい場所まで行けるのは確かにすごいメリットか。
`,`自体が消えるのは少しやりにくいけれど(`;`の逆)、バランスの問題か。
```vimscript
" Read an empty HTML template and move cursor to title
nnoremap ,html :-1read $HOME/.vim/.skeleton.html<CR>3jwf>a
```

## BUILD INTEGRATION
私はrubyは滅多に使わないので、ニュアンスだけ。
`set makeprg=`で`:make`で走るプログラムを指定できる。
`:cl` to list errors
`:cc#` to jump to error by number
`:cn` and `:cp` to navigate forward and backward

いまだにPythonでmakeとquickfixを使う方法を知らないのはよくないよなあ。。
pluginなしでできないかなあ。

## helpgrep
`:helpgrep` して、`:cn`, `:cp`はすごい便利！！
人生変わった。

# 感想
netrwとquickfix使いこなしたいなあ