読者です 読者をやめる 読者になる 読者になる

SuperCon-erがVimを20日間で最低限便利に使えると思われる使い方

SuperConが今年も近づいて来たようですが、本選出場者の方々はいかがお過ごしでしょうか。

「大会の環境ではViとEmacsしか使えないらしい><」という悲痛な叫びが聞こえてきたので、Vimを1年半くらい使ってきて、最低限便利に使えると思った使い方を晒してみます。

ただし、「Viしか入っていないと言いつつVimが入っている」という前提で書いているので、互換性まわりの不具合が出ても知りません←*1

記事の内容を利用する際の注意

優先度が低いと思われるものは削ってあります。

ここの知識をVimエバンジェリストの前でひけらかすと…うわなにをするやめr!…

全くもって始めての人へ

$ vimtutor

設定ファイル(.vimrc)について

設定ファイルはホームディレクトリに .vimrc というファイルを置きます。
とりあえず、これだけ書いておけば何とかなるでしょう。

タブ幅の設定を変えたい時は、次のページが参考になります。
Peace Pipe: はてな技術勉強会 .vimrc 説明補足

紙資料の持ち込みは可能だったと思うので、とりあえず印刷しておけばいいのでは?

" おまじない
" -----
" Vi互換モードを使わず、Vimとして使う
set nocompatible

" 表示関係
" -----
" シンタックス・ハイライトを有効にする
syntax on
" 左端に行番号を表示する
set number

" インデント関係
" ハードタブ教 & タブは4文字教 の人に最適化
" -----
" 自動インデント等を有効にする
filetype plugin indent on
" ファイルを開いた時のTab文字(<Tab>, \t)を空白何文字分で表示するか
set tabstop=4
" 自動インデントや << or >> で入力されるインデントの幅
set shiftwidth=4
" 入力中にTabキーを押した時、何文字分の空白で表示するか
set softtabstop=4
" Tabを空白に変換しない
set noexpandtab

" 検索関係
" -----
" 検索文字列をハイライトする
set hlsearch
" 検索する時、大文字と小文字を無視する
set ignorecase

" 普通は入れなくても動くと思うが、挙動不審なとき用の設定
" -----
" BackSpaceでなんでも消す
set backspace=indent,eol,start
" 文字コード関係で困ったとき用
set fileencodings=utf-8,eucjp,cp932
set fileformats=unix,dos,mac

起動から終了まで

起動

$ vim file.c
Esc ノーマルモードに戻る
:q 終了する
:q! 保存しないで終了する
:wq 保存して終了する

移動関係

カーソルの移動

h
j
k
l

大きな移動

gg ファイルの先頭に
G ファイルの末尾に
50G <数字> + G で、<数字>行目に
% 対応するカッコに

追記

@さんから情報頂きました。
操作に慣れるために ココ とかオススメです。

編集関係

i カーソルの下の文字の左から
a カーソルの下の文字の右から
o 次の行を開く
O 前の行を開く

コピペなど

dd 一行消す(切り取り)
yy 一行コピー*2
p 貼り付け

<v>(普通の選択) や <V>(行単位での選択) と<d> or <y> を組み合わせると、
まとめて切り取り or コピーができます

追記

@さんから『貼り付けはPのほうが直感的な挙動しそう』と教えて頂きました。
自然だと思う方で使って下さい。

検索関係

すべて ノーマルモード or コマンドモード での操作

/<文字列> 検索する
* カーソルの位置の単語を検索
:%s/<置換前の文字列>/<置換後の文字列>/gc 置換する
補足

検索のときは <n> or <N> で前の候補 or 次の候補に移動

置換のオプションの意味は、

g ファイル全体(global)
c 確認を取る(confirm)

<V>を使って範囲を指定してから置換を行うのも便利です

補完

<C-n> 後方から検索して補完
<C-p> 前方から検索して補完

実際使ってみると、どちらを使ってもあまり変わりません。押しやすい方でどうぞ。
補完結果が表示されたら、同じように <C-n> or >C-p> で補完結果を選択できます。

redo・undo

u もとに戻す
C-r やり直し

非対称なので注意しましょう

インデント

ある程度は自動でやってくれると思いますが、整形したい時

== インデントを1行整形する
範囲選択してから = 選択範囲を整形する

FAQ

端末からコードを貼り付けたい
:a!

としてから貼り付けると、インデントを保ったまま貼り付けることができます

他のファイルを開きたい
:new

で新しいウィンドウ(正確にはバッファ)が開く。

ウィンドウの移動は <C-w> + 移動したい方向(hjklで入力)

差分を見たい時は、端末から

$ vimdiff fileA.c fileB.c

というコマンドを使う

やっぱり(文字コード|改行コード)がおかしい

チューターさんに聞いてください(丸投げ)。

詳しい設定方法は↓に載ってます。
Vim: エンコーディング関係の設定の仕方 - while (”im mirrored”);

Escキーが打ちにくい…

ノーマルモードに戻るためのキーには
Escキーの他にも、<C-[> や <C-c> があります。
(<C-c>の挙動は、Escとは微妙に違うらしい↓
Vimにおける Esc と Ctrl-cの違い。 - 備忘録 beta

おわりに

だれかEmacs版を書いて下さい。
僕が読みたいので。

*1:まぁ特に凝ったことをしているわけではないので、特に問題にはならないと思いますが

*2:'yank'のy