主に4種類あって、
- GUIのVim
- CLIのVim
- NeoVim
- IDEのプラグインとしてのVim
GUIはGVim、MacVimという名前です。Vim本体とは別に開発されています。日本語環境も揃うKaoriya版を入れるのが安定。
- Windows: Vim — KaoriYa
- Mac: splhack/macvim-kaoriya: MacVim-KaoriYa
- →リリースページからダウンロード
Macには最初からCLIのVimが入っています。WindowsにはないがWSLやGit Bash等には最初から入ってる感じがします。
NeoVimはVimを現代風に書き直そうみたいな運動から出てきたもの(要出展)です。割と最近良い感じのようなので、そちらでも構いません。GUIはまた別途ある。今回は話しません。
例えばJetBrain系のIDE(Android Studioとか)にはIdeaVimというのがあります。MSVSにも何かあったな、何だっけ。
GUIは、Windowsなら gvim.exe
、Macなら MacVim.app
を起動します。
CLIで試す場合は gvim
ではなく vim
で起動します。(パスはうまいこと設定しておいてください。)
$ vim
起動後、 :q
と入力すると終了します。何か文句言われたら Esc
連打の後に :qa!
してください。
以下のファイルが最初に読み込まれます。ここにいろいろ設定を書き込みます。
- Windows:
%HOME%/_vimrc
,%HOME%/_gvimrc
- Mac:
~/.vimrc
,~/.gvimrc
それぞれ "vimrc" は最初に、 "gvimrc" はGUI(アプリ単独)で起動した場合その次に読み込まれます。
コマンドモードでできることを、 :
を飛ばして書けば動きます。
例えば起動後に :set number
する代わりに以下を書けます。
set number
Gitでバージョン管理したいとかDropboxで複数環境から共有したいとか、そういう場合はそっちに本体を置いて、上記のファイルからは source
で外部ファイル読み込むと良いかと。
source ~/dotfiles/.vimrc
今後拡張していくことになると思いますが、まずは管理ツールを入れるとこの先がスムーズでしょう。
dein.vim を使うのがおすすめです。というかもうその前提で行きます。
インストールはREADMEに書かれている通り。注意点二つ。
- "{specify the installation directory}" の部分を何か(例えば
~/.vim/bundles
)に置き換えるのを忘れない - インストールスクリプト実行後、
.vimrc
記載コードが出力されるので、コピーしておく
例示される設定では、三つのプラグインが読み込まれるようになっています。不要なら削除してしまっても構いません。
簡単にインストールは済ませたいので、末尾の方にある "If you want to install" あたりをコメント解除してください。行頭の二重引用符 "
を削除します。また削除も自動でやってもらうよう一行追加します。
"If you want to install" のあたり、以下のようになるはずです。
" If you want to install not installed plugins on startup.
if dein#check_install()
call dein#install()
endif
call map(dein#check_clean(), "delete(v:val, 'rf')")
これで dein#add()
を書いたり消したりするだけでよくなりました。(次項参照。) これらを設定しない場合は、変更時に自分でインストール、削除を行う処理を呼ぶ必要があります。
前項の自動化を前提とします。
- プラグインのGitHubリポジトリを見つける
dein#add('xxx/xxx')
を追加- Vimを再起動
次項で紹介するNERDTreeを例に。
まず、GitHubのリポジトリは以下にあります。
なので、ユーザー名とリポジトリ名を取って scrooloose/nerdtree
が識別子になります。
これを関数で呼び出すので、以下を .vimrc
に追加することになります。
call dein#add('scrooloose/nerdtree')
追加する場所は空気読んでください。 "Add or remove your plugins here" のコメントがあるはずなので、その下に並べてください。
たぶんこんなん。
" Add or remove your plugins here:
call dein#add('Shougo/neosnippet.vim')
call dein#add('Shougo/neosnippet-snippets')
call dein#add('scrooloose/nerdtree')
記述後にはVimを再起動します。すると自動的にインストールが終わり、新しいプラグインが追加されているはずです。
(他に source
するという手もあります。今回は説明しません。)
前項の例でインストールしたNERDTreeの使い方を紹介します。ファイル操作までできるようになればだいぶ自由度高まると思うので。
ExplorerやFinderのように、ディレクトリをたどりながら視覚的にファイルを探せます。
call dein#add('scrooloose/nerdtree')
nnoremap <C-t> :NERDTreeToggle<CR>
これで <C-t>
でファイルがツリー表示されるペインを開閉できるようになりました。
そのペインではノーマルモードの操作に加え、以下を利用できます。
Return
... 該当ファイルを開く。該当ディレクトリを開閉t
... 該当ファイルを別タブで開くi
... 該当ファイルを別ウィンドウ(同タブ内)で開くm
... メニューを表示(ファイルコピー等)p
... 親ディレクトリへu
... ルートディレクトリの親をルートディレクトリにI
... 隠しファイルを表示、非表示B
... ブックマーク一覧を表示、非表示:Bookmark
... ブックマークへ追加D
... ブックマークから削除
他にもたくさんあるのでヘルプを参照。ヘルプの参照の仕方は別稿。
複数のファイルを編集する場合は(Vim内部の)ウィンドウやタブを使うと便利です。
説明は別稿に分けますのでお楽しみに。
> vim
'vim' is not recognized as an internal or external command,
operable program or batch file.
パスが通っていません。
Vimはいくつかの「モード」を切り替えて使用します。
- ノーマルモード ... 移動
- 挿入モード ... 編集
- ビジュアルモード ... 選択
- コマンドモード ... 操作
(他にもあります。)
諸々見ていく前に、見方を示します。
x
... XキーのみX
... Shift + X<C-x>
... Ctrl + X<C-S-x>
... Ctrl + Shift + Xabc
... Aキーの後にBキー、続いてCキー:echo Hello
...:
キーでコマンドモード以降の後にecho Hello
を入力:echo Hello<CR>
...:
キーでコマンドモード以降の後にecho Hello
を入力、続けてReturnキーを押す
CtrlキーとShiftキーを使います。Macのcommandキーは使いません。(でもMacVimなら ⌘+V
とかで文字列のコピペができます。)
Alt/optionキーも使えるようですが、あんまり使わない気がします。環境依存だから? (未調査)
<CR>
... Return (Carriage Return)<Tab>
... Tab<Esc>
... Esc<Space>
... スペース<Left>
... 左矢印キー(←)/
... スラッシュ!
... ! (Shift + 1)
:help keycodes
にもっとたくさん載ってます。
\
でエスケープします。
\\
... バックスラッシュ一文字\<Home>
... "<Home>" という文字列(Homeキーではない)
inoremap <C-h> <Home> " Ctrl + HでHomeキーの代わり
inoremap <C-h> \<Home> " Ctrl + Hで "<Home>" と入力
inoremap
については後述。
二重引用符 "
がコメントになります。
" 基本設定
set number
set autoindent
基本となる、移動するモードです。一部編集作業もできます。
Esc
を連打するとだいたいノーマルモードに戻ります。
- 一文字移動
h
,j
,k
,l
- 単語移動
w
,W
,b
,B
,e
,E
(Word, word Backward, the End of word) - 行内移動
^
,0
,$
- スクロール
<C-u>
,<C-d>
,<C-f>
,<C-b>
(Up, Down, Forward, Backward) - 現在位置を基準にスクロール
z<CR>
,zz
,z-
- ファイル先頭、末尾へ移動
gg
,G
- ヤンク(コピー)と貼り付け
yy
,p
,P
(Yank, Paste) - 検索
*
,n
,N
,/
(Next) - 検索履歴
q/
- 元に戻す、やり直し
u
,<C-r>
- 直後の操作を32回繰り返す
32a-<Esc>
- 直前の編集をもう一度繰り返す
.
u
と <C-r>
で行ったり来たりします。
Vimの環境によっては履歴がひとつしか残っていないタイプ( u
連打で行ったり来たりになるやつ)もあります。
例えば yy
の後に p
で行を複製することができますが、これを 3p
とすると、三回貼り付けることができます。
また「 o
で改行して挿入モードへ入り、入力後に <Esc>
でノーマルモードに戻ってくる」という動作を考えます。Vim的に表現すると、 ohello<Esc>
です。
hello
ここで 3ohello<Esc>
とすると、それを三度繰り返したことになり、以下が入力されます。
hello
hello
hello
.
最強です。まじつよい。まじつよ。さいつよ。
例えば yy
の後に p
で行を複製することができますが、その直後に .
とすると、もう一度 p
を押したかのようにもう一行貼り付けることができます。
数字と組み合わせて 3.
のように使うこともできます。
また「 o
で改行して挿入モードへ入り、入力後に <Esc>
でノーマルモードに戻ってくる」という動作を考えます。Vim的に表現すると、 ohello<Esc>
です。
その直後に .
とすると、再び ohello<Esc>
を入力したことになります。
普通の文字入力をするモードです。
- ノーマルモードから挿入モードへ
i
,I
,a
,A
(Insert, Append) - ノーマルモードへ戻る
Esc
,<C-[>
,<C-c>
- ノーマルモードから改行して挿入モードへ
o
,O
- ノーマルモードから削除して挿入モードへ
s
,S
,cc
(Substitute, ?) - 補完
<C-n>
,<C-p>
補完はプラグインなしでも、どこかで使われている単語であれば補完できます。
c
の次に移動の操作ひとつを組み合わせて、その範囲を削除しつつ挿入モードへ入ることができます。
c$
... 行末まで削除して挿入モードへce
... 単語末尾まで削除して挿入モードへc^
... 行の先頭まで削除して挿入モードへc3l
... 三文字右まで削除して挿入モードへ
- ノーマルモードからビジュアルモードへ
v
,V
,<C-v>
- ノーマルモードへ戻る
Esc
,<C-[>
,<C-c>
- 選択しているものを削除して挿入モードへ
s
(Substitute) - 選択しているものをコピー
y
(Yank) - 選択範囲の逆側へカーソルを移動
o
- 矩形選択で、前後へ挿入
I
,A
(Insert, Append)
ファイル全体やVim自体に対する操作をします。画面下の一行か二行の欄です。(慣例的に ":" も含めています。)
- ノーマルモードからコマンドモードへ
:
- ノーマルモードへ戻る
Esc
,<C-[>
,<C-c>
- コマンドモードで入力したコマンドを実行
<CR>
- コマンドモードで左右移動
<Left>
,<Right>
- 過去に呼び出した入力を呼び出す
<C-p>
,<C-n>
(uP, dowN) - 上書き保存
:w<CR>
- 名前xxxを付けて保存
:w xxx<CR>
- 読み込み
:e<CR>
- 強制再読み込み
:e!<CR>
- 123行目へ移動
:123<CR>
- 閉じる
:q<CR>
- 全て閉じる
:qa<CR>
- 上書き保存して終了
:wq<CR>
- 行番号を表示
:set number
- 行番号を非表示
:set nonumber
- ノーマルモードで、履歴を見る
q:
- ノーマルモードで、直前のコマンド実行を繰り返す
@:
ファイル読み書きはNERDTreeでやった方が良いんじゃないかなー。
Vimを一度起動すれば、そのなかで複数のファイルを編集したり、あるいは同じファイルの複数個所を並べて眺めたりすることができます。
Vimでは画面を分割して複数の作業を並行して行うことができます。この分割した画面のことを「ウィンドウ」と呼びます。これはGUIのウィンドウとは別の用語です。
- 画面を縦に分割
<C-w>s
(Split) - 画面を横に分割
<C-w>v
(Vertical split) - ウィンドウを閉じる
<C-w>c
,<C-w>o
(Close, close Other windows) - 次のウィンドウへ移動
<C-w>w
- 隣接するウィンドウへ移動
<C-w>h
,<C-w>j
,<C-w>k
,<C-w>l
ウィンドウはタブ(次項)の内側に存在する的な感じです。
タブはコマンドモードから増やします。
:tabnew
... 新しいタブを開く:tabnext
... 次のタブへ移動:tabprev
... 前のタブへ移動
うひゃあ面倒ですね。キーに割り当てると良いかもしれません。
nnoremap <C-W>t :tabnew<CR>
nnoremap <C-Tab> :tabnext<CR>
nnoremap <C-S-Tab> :tabprevious<CR>
さてさて、Vimの非常に強力な機能のひとつです。キー入力をカスタマイズして、任意の機能へ割り当てることができます。
基本的に以下の文法で .vimrc
へ記述します。書き換えたら再起動(あるいは source
)をお忘れなく。
{x}noremap {command} {operation}
- {x} ... 対象モード。
n
= ノーマルモード、i
= 挿入モード、v
= ビジュアルモード。 - {command} ... 入力コマンド
- {operation} ... 実行コマンド
例えば「 "Ctrl + W" の後に "T" 」という入力を :tabnew
の代わりにする場合、以下のようになります。
nnoremap <C-W>t :tabnew<CR>
ノーマルモードで矢印キーを押しても何も起こらないようになります。スパルタ!
nnoremap <Left> <Nul>
nnoremap <Down> <Nul>
nnoremap <Up> <Nul>
nnoremap <Right> <Nul>
nnoremap <C-s> :w<CR>
コマンドを割り当てる場合は :
で開始します。最後に <CR>
で実行するのを忘れないように。
Vim本体の機能の他、多くのプラグインはヘルプが充実しています。早めに慣れておくと自習が捗ります。
例えばNERDTreeのヘルプを見る場合、以下で別ウィンドウに開きます。
:help NERDTree
Vimの初期操作も探すことができます。あら便利。
:help j
:help :w
:help ctrl-v
ヘルプはRead Onlyモードですが、ノーマルモードで操作できます。加えてリンクになっている個所では、 <C-]>
でジャンプできます。また履歴ジャンプも活用すると良いでしょう。
- (ヘルプで)リンクを開く
<C-]>
- ジャンプする前の位置へ戻る
<C-o>
- ジャンプから戻ってきた先の位置へ戻りなおす
<C-i>
最高のVim本です。序盤から「実践」が始まり、キー入力ひとつずつに対しカーソルや編集対象が変化していくかを並べて見せてくれます。大変わかりやすい表現になっています。(私の表現が大変わかりづらいのは申し訳ありません。)
紙の本とKindle版があります。Kindle版は固定レイアウトではないので、スマホでも読むことができます。(実践できないけど。)
英語。
多数のトピックに分かれて説明されています。言語を差し引いても一番最初はちょっと難しいかも。逆にちょっと慣れた方なら、なんとなく使っていたものがどんどん明らかになっていくので大変ためになります。
PDFやepub、紙の本も販売中。オンラインで読む分には無料。
現在のモードやファイル名、エンコード等の情報を表示します。きれい。
READMEのGif動画を見てください。ジャンプします。
NERDTreeと違ってファイル名が分かっている場合、こちらの方が選択が早いです。
例のタグや例のプロパティを例の良い感じで入力できる例のアレ。
HTMLやCSSだけじゃなさそうだけど。