藻ログ

都会でOLをしています

Vimをはじめるときのポインタ

Vim2 Advent Calendar 2017 15日目の記事です.

TL;DR

  • Vimをはじめたいと相談された時,挫折させてしまうことが多い
  • 一体何がいけないのか()*1
  • いきなり色々説明するからや!段階的に情報が集まったポインタが欲しい!
  • ということで,Vimの設定について聞かれたときに紹介しているものをまとめてみました.
基本的な使い方(1) vimtutor, vimdoc
基本的な使い方(2) Vim Mnemonic | Vim のコマンドの覚え方大全 - haya14busa
基本的な使い方(3) 『実践Vim』を読んで学んだ、おすすめVimデフォルト機能35個 - MyEnigma
vimrcの書き方 vimrc基礎文法最速マスター - 永遠に未完成
vimscriptの書き方 Vimスクリプト基礎文法最速マスター - 永遠に未完成
キーマップについて vimでキーマッピングする際に考えたほうがいいこと - derisの日記
正規表現 Vimでパターン検索するなら知っておいたほうがいいこと - derisの日記
プラグインマネージャ dein.vim
プラグイン(検索) Vim Awesome
プラグイン(例) Vim After 15 Years | Ian Langworth’s Things of Variable Interest
プラグイン(文法) Vimスクリプト基礎文法最速マスター - 永遠に未完成
vimrc分割 vimrc分割した - 藻ログ
設定がしんどい人 spacevim,他のエディタ,IDE
寄付 Vim起動時に出てくるウガンダへの寄付を行う手順 - 今日学んだこと

それでもVimがいい

わかる

Vimの基本的な使い方

vimtutor

vimtutor をやれば,基本的な使い方が一通りマスターできるはずです *3

$ vimtutor

コマンドの覚え方

Vimはコマンドが直感的にも覚えやすいと感じています.
haya14busa.com

お本

実践Vimプラグインでなく,Vimデフォルト機能の解説が中心なのでこれから始める人には良いと思います.

myenigma.hatenablog.com

Vimいいですね!

その調子だ

タブ開いたりウィンドウ分割したりしたい

:tabe(dit) ${file} 新しいタブで開く
:vs(plit) ${file} 縦分割で開く
:sp(lit) ${file} 横分割で開く
  • タブ間は (Tab)(left,right) で移動する*4
  • ウィンドウ間は C-w C-w で移動する*5

mickey24.hatenablog.com

プラグインなしの最小vimrcが欲しい

最低限ですが,こういうのはどうでしょうか.

" :h ${option} to read the vimdoc.

" syntax
syntax on

" line number
set number
set cursorline

" backup
set nobackup
set noswapfile

" buffer
set hidden
set confirm

" tab complete
set wildmenu

" search
set hlsearch
set ignorecase
set smartcase
set wrapscan
set incsearch

" {}
set showmatch
inoremap { {}<left>
inoremap ( ()<left>
inoremap [ []<left>
inoremap " ""<left>
inoremap ' ''<left>

mapping 等も含めて,公開してくださっているものもあります ↓
deris.hatenablog.jp

↑ vimrc の読み方がわからん

:h wildmenu などとすると,vimdoc でヘルプが閲覧できます.
vimrc 基本文法を最速でマスターできる記事があるので,まずこちらに一通り目を通すのがいいかもしれないです.
thinca.hatenablog.com

Escとかデフォルトのキーマップがつらい

Esc キーの割り当てやtab, 分割ウィンドウの操作あたりからmapするのはどうでしょう.
:map すると今当たってるマッピングが確認できます.

"<esc> -> jj
inoremap jj <esc>

" tab
nnoremap <Tab><right> gt
nnoremap <Tab><left> gT

" window-tab-mappings
nnoremap ss <C-w>w
nnoremap sj <C-w>j
nnoremap sk <C-w>k
nnoremap sl <C-w>l
nnoremap sh <C-w>h

" move Ctrl-h,j,k,l, in insert mode
inoremap <C-h> <Left>
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-l> <Right>

deris.hatenablog.jp

特定のファイルを開いた時の挙動を設定したい

au(tocmd) を使うと良い.ファイルだけでなく,バッファなどに対しても設定できるのでとても便利です.
詳しい使い方は :h auすると大体わかります.
vimrc基礎文法最速マスター - 永遠に未完成
でも解説されています.

augroup MyAugroup
  au!
  au FileType vim setlocal keywordprg=:help
  au FileType help,quickfix,quickrun,gf nnoremap <buffer> q <C-w>c

  au BufRead,BufNewFile *.cu,*.cuh setlocal filetype=cpp
  au BufRead,BufNewFile *.log filetype=messages

  au FileType tex setlocal spelllang+=cjk
  au FileType tex setlocal spell
augroup END

Kコマンド

vimからヘルプドキュメントを呼び出すにはKコマンドが便利です.
例えば

aug MyAugroup
  au!
  au FileType vim setlocal keywordprg=:help
  au FileType sh setlocal keywordprg=:Man
aug END

とすれば,

  • vimrc, vimscriptでK をタイプするとカーソル以下の単語に対して:help ${word} する
  • shell script でK をタイプするとカーソル以下の単語に対してman を呼び出す

ようにできます.他の言語でも同様に,Kを押したときにinvokeするコマンドを設定することができます.詳しくは:h Kを見て下さい

							*K*
[count]K       		Run a program to lookup the keyword under the
			cursor.  The name of the program is given with the
			'keywordprg' (kp) option (default is "man").  

'keywordprg' 'kp'	string	(default ":Man", Windows: ":help")
			global or local to buffer |global-local|
	Program to use for the |K| command.  Environment variables are
	expanded |:set_env|.  ":help" may be used to access the Vim internal
	help.  (Note that previously setting the global option to the empty
	value did this, which is now deprecated.)
	When the first character is ":", the command is invoked as a Vim
	command prefixed with [count]. {Nvim}
	When "man" or "man -s" is used, Vim will automatically translate
	a [count] for the "K" command to a section number.
	See |option-backslash| about including spaces and backslashes.
	Example: >
		:set keywordprg=man\ -s
		:set keywordprg=:Man

:help 便利

:h さえ覚えればVimの使い方がわかる!! すごい!!!*6

正規表現

最初うまくエスケープできなくて難しいので,以下を参考にすると良いです
deris.hatenablog.jp

プラグインを使いたい

Vimには 沢山のプラグインマネージャ があります.

dein.vim

  • toml 形式でプラグインが記述できる
  • ロードが高速
  • 条件に応じてプラグインをロードする,しないが簡単に設定できる(filetype=Xの時だけロードする,など)
  • Vimの動作を高速に保てる!
  • プラグインごとに,設定ファイルがhookできる

という理由で, 今だとdein.vim を使うのが良いのではないかと思います.
wakame.hatenablog.jp

プラグインを探したい

vim公式もいいのですが,VimAwesome の方が数が多い(GitHubにあがっている分が網羅されている)です.
vimawesome.com
また,以下サイトでは最近のおすすめプラグインがまとめられています*7
statico.github.io

プラグイン,最初の一個

... には何を勧めるべきなのだろうか..
自分は powerline を勧められて,おおっインサートモードが青く光ってかっこいい... となった記憶がある()
今は lightline を使っています.
github.com

Git連携

fugitive.vim を使っています.
wakame.hatenablog.jp
vim-gitgutter も便利そう
github.com

コードリーディング

incsearch, gtags(or ctags), grep 系を設定すると良いと思います.
wakame.hatenablog.jp
wakame.hatenablog.jp

unite/denite を使わないパターンとして,Vim After 15 Years | Ian Langworth’s Things of Variable Interest も参考になると思います.

Lint

同期式だとコード書いてる途中にブロックしてしまいますが,今は非同期で動作する ale.vim があります.
wonderwall.hatenablog.com

コード中を高速に移動したい

easymotion を使っている人をよく見かけます.
haya14busa.com

vimrcが肥大化してきた

その調子だ

vimrc分割したい

デフォルトの機能を使って簡単に分割できます.
wakame.hatenablog.jp

neovim ってどうなのか

github.com
neovim 良いです.自分はnvim をメインに使っています.ただサーバーで作業するときに入ってないのでそこは... *8
vimとの設定ファイルは has('nvim') フラグを用いてVimと共通化できますが,自分は完全に分離してしまっています.
wakame.hatenablog.jp

そして...

今回紹介しきれなかった,たくさんの基本機能,tips,プラグインがあります.

Vim Advent Calendar

色んな方がtipsを書かれていてとても参考になります.特に2012年は365日やっているのでとても読み応えがあります.
d.hatena.ne.jp

vimrc読書会

vimrcは読み物だった(!)
vim-jp.org
アンチパターンが以下にまとめられていて,とても参考になります
rbtnn.hateblo.jp

Vimがとても好きになった

寄付をすると良いと聞きました.
nakazye.hatenablog.com

*1::h 読んだらわかる,で丸投げするのが原因な気がしてきた

*2:他人の設定をコピペして動かすぐらいであれば,初めからある程度設定されたエディタ/IDEを使うのが良いと思うからです.

*3:大体ここで挫折する人が多い

*4:しんどいので後でキーマップを当てる

*5:しんどいので後でキーマップを当てる

*6:しかし慣れるまで膨大な時間がかかる

*7:日本のコミュニティとは使ってるものが違って面白い

*8:python3に依存するプラグインが多いので,python3, python3-pipも入れる必要がある