こちらの記事は、Daniel Miessler 氏により2020年03月に公開された『 Learn vim For the Last Time: A Tutorial and Primer 』の和訳です。
本記事は原著者から許可を得た上で記事を公開しています。
Vim を学ぶ上での問題は、それが難しいということではなく、ずっとやり続けなければならないということです。このガイドでは、そのサイクルを断ち切り、今度こそ完璧にVim学習を完了できることをゴールにしています。
Vim 学習のリファレンスはオンラインで何十件もありますが、ほとんどのものは、すぐに超絶技巧を要求するか、あるいは基本的なことだけ触れてあまり深く踏み込まないかのどちらかです。
このチュートリアルは、まずvim の思想を理解すること(これは永遠に皆さんの心の中に残ります)から始まり、現在お使いのエディタのスキルを超越して、VIMマスターの一人になるまでの、すべての段階を案内することが目的です。
簡単に言い換えると、生活の一部として使えるようにvimを学んで行きましょう。
さぁ、始めましょう!
#初級
##なぜVimなのか?
さて、なぜvimを使う必要があるのでしょうか?3つ理由があると思います:
- それはユビキタス、つまりどこでも使えます。コンピューターごとに新しいエディタを覚える心配はありません。
- それは拡張性があります。設定ファイルを編集するためだけに使うこともできますし、完全なライティングプラットフォームにすることもできます。
- それは強力です。
vim
は一つの言語であるかのように動作します。そのため、あなたはもはやフラストレーションを抱えることはなく、すべてを掌握できる神状態に素早く変貌を遂げることができます。
要するに、皆さんが自身の国語や数学基礎などの適正能力を捉えることと同じように、vimを活用する能力を捉えるべきと私は考えています。技術の多くは、自分のエディタを知ることから始まります。
##アプローチ
Kana the Wizardの言葉を借りると、vimのマスターには5つのレベルがあります:
レベル0:vimって聞いたことない
レベル1:vimの基本が分かる
レベル2:vimのビジュアルモードを知っている
レベル3:vimのいくつかのモーションを知っている
レベル4:もはやビジュアルモードは要らないレベル
このレベルについては特に良い悪いと言及しませんが、少なくともここに共有しておく価値はあると思います。なんと言っても、結局の所、Kanaは魔法使いなんですから!
私のアプローチは、主に4つの領域を中心にしています。
- **準備:**正しい方法で考え、実行可能な状態にするための基本部分です。
- **完遂:**ここが本番、食事でいうとメインディッシュです。フォークが必要です。そしてナプキンも。きっと散らかると思います。
- **上級編:**ここでは、vimを使って、「VIMマスター」の一人になる方法を紹介します。
- ヒント集: ここでは、この先に立ちはだかる課題に立ち向かうためのコツを伝授します。
##設定
先にお伝えしたように、このページをvim設定便利集にしたいわけではありません。世の中にはそういうものがたくさんあります。そうではなく、このページは、vimのコンセプトに強くなり、ツールを長期的に使いこなせるようになることを目的としたチュートリアルです。しかし、その一環として、いくつかの設定の基本についてお話します。
まず、(ほとんどの場合)マニュアルでvimをインストールすることをお勧めします。私は以前 janus にハマっていましたが、それが正確に何をしているのかわからないという事実が好きではありませんでした。私の好きな設定はシンプルでエレガントなもので、それはvimでも同じはずです。
結局のところ、私はホームの下にある ~/.vim
ディレクトリと ~/.vimrc
ファイルを直接設定に使用しています。
主な~/.vimrcの変更項目
手始めに、<ESC>
キーを挿入モード解除にしておくのは、私の意見としては、時代遅れです。vimは効率を重視しているとすると、キーボードのホームポジションを離れることは作業効率としてよくありません。なのでやめましょう。
inoremap jk <ESC>
<ESC>
キーをjjに変更するのが好きな人もいますが、私はjからkへのローリングのように自然ではないと思います。
リーダーキーの変更
リーダーキーはショートカットを発生させるキーであり、非常に強力です。ですから、例えば "c"から始まるショートカットをしようとする場合は、リーダーキーの後に "c"が続くものを入力します。
デフォルトのリーダーキー(\
)もかなり邪魔な感じがするので、リーダーキーをSpace
にリマップするのが好きです。
let mapleader = " "
このリーダーキー設定はAdam Stankiewicz氏の推奨によるものです。
CapsLockのリマップ
この部分は conf ファイルではありませんが、デフォルトからの変更として重要なものの一つです。キーボードの CAPSLOCK
キーは基本的に価値がないと私は思っているので、OSの設定で Ctrl
にリマップしています。こうすることで、左手の小指を左にスライドさせるだけで、Ctrl+なんらかキー
を実行することができるようになります。
それから、ほとんどの人に推奨されている基本的なものがいくつかあり、全体的にずっと楽になります。
filetype plugin indent on
syntax on
set encoding=utf-8
set clipboard=unnamedplus
ここでポイントとしては、~/.vimrc
ファイルの最適化には一生を費やすことができますが、上記は、まず始めるための設定を挙げています。より完全な設定については、私の設定をチェックするか、参照セクションのリンクを参照してください。
##プラグイン管理
ネイティブ管理
プラグインについてあまり予備知識がない場合は、このセクションは飛ばして後で参照してください。
Vim 8.x系にアップグレードすると、ネイティブプラグイン管理をサポートします。プラグインを以下場所に置けば良いです。
~/.vim/pack/pluginfoldername/start/pluginname
これで完了です。これで、上記の方法で好きなプラグインを使って遊ぶことができ、Vimの起動時に自動的に読み込まれるようになりました。7.xで必要だったサードパーティ製のプラグイン管理オプションよりも、この方法の方がずっと私は好きです。
GitHubを利用したバックアップとポータビリティ
私がVimの設定でやっていることのひとつは、~/.vim
ディレクトリ全体をここにあるgitリポジトリの中に入れておくことです。これを使うと、新しいピカピカの環境下で git clone https://github.com/danielmiessler/vim
と言って、私の vim 環境全体を私の思い通りにすることができるようになります。
あなたも同じようにしてみてはいかがでしょうか。
新しい環境にクローンしてから ~/.vimrc
を ~/.vim/vimrc
にシンボリックリンクすれば完了です。
言語としての vim
vim の最も素晴らしい点は、使っているうちにそれを使って考えるようになるということです。vimは言語のように機能し、名詞、動詞、副詞などを持ちます。
ここで使用する用語は厳密に正しいものとは言えませんが、vim がどのように機能するかを理解するのに役立つはずです。繰り返しになりますが、このガイドはvimのヘルプや網羅本の代替ではなく、それらヘルプなどを見てもすぐには理解できないような事柄をお伝えするものです。
動詞
動詞は私たちが行う動作であり、名詞に対して働きます。例を紹介します。
-
d
: delete 削除 -
c:
change 変更 -
y
: yank ヤンク(コピー) -
v
: ビジュアルモード。Vはライン単位。vは文字単位
修飾語
修飾語は名詞の前に使われ、何かをしようとしている様子を表すのに使われます。例を紹介します。
-
i
: inside インサイド -
a
: around アラウンド -
NUM
: number (e.g.: 1, 2, 10) 数字 -
t
: 指定文字よりひとつ前に移動する -
f
: 指定文字に移動する -
/
: 文字列検索(文字列あるいは正規表現)
名詞
英語では、名詞はあなたが何かをする対象物でありオブジェクトです。vim でも同じです。ここでは vim の名詞をいくつか紹介します。
-
w
: word 単語 -
s
: sentence 文 -
)
: sentence (another way of doing it) (文を表す別の表記方法) -
p
: paragraph -
}
: paragraph (another way of doing it) (段落を表す別の表記方法) -
t:
tag (think HTML/XML) (HTML/XMLを連想せよ) -
b
: block (think programming) (プログラミングのブロックを連想せよ)
動作表現としての名詞
また、名詞を動作表現、つまりコンテンツを指定範囲だけ移動するという使い方ができます。これについては、以下の「移動」のセクションで例を見ていきましょう。
この言語を使って文章(コマンド)を作る
さて、いろいろなピースが揃いましたが、それらを使ってどうやって文章を組み立てるのでしょうか?英語のように、動詞、修飾語、名詞を直感的な方法で組み合わせます(時期にできるようになります)。
こんな感じです。
2つの単語を削除する(Delete two words)
d2w
現在の文を変更する:現在のものを削除し挿入モードにする(Change inside sentence)
cis
現在の段落をヤンクする:現在カーソルのある場所の段落をコピーする(Yank inside paragraph)
yip
次のブラケット “<” まで変更する:現在カーソルのある場所から次の”<”までのテキストを変更する(Change to open bracket)
ct<
この例での変更指定位置はブラケット”<”でしたが、何でも良いのです。そして、変更指定である"to"の構文は単純にtだったので、他にも
- "delete to the next period"(次のピリオド”.”までテキストを削除)をdt.
- "copy to the next semicolon"(次のセミコロン”;”までテキストをコピー)をyt;
と言うこともできるのです。
美しいと思いませんか?このような思考プロセスを使うことで、テキスト編集そのものが直感的な言語活用に昇華され、他の言語を扱うのと同じように、たくさん使えば自然に流暢に出てくるようになります。
##完遂する
ここまでで基本的なことをある程度扱ってきたので、具体的で機能的なものを手に入れていきましょう。
ファイルを扱う
ファイルを操作するための簡単な基礎知識をいくつか紹介します。
-
vi file
:vim
で指定ファイルを開く -
:w
:変更をファイルに書き込む -
:q!
:vimを終了する(quit)が、変更は保存しない (!) -
:wq
:変更をファイルに書き込みvim
を終了 -
:saveas ~/some/path/
:変更を指定場所に保存 -
ZZ
::wq
の高速実行
:wqは有効だが、私はコロン”:”が要らないZZを使うし、こちらが少し早いように思う。:xも使える。
テキスト検索
エディタでまずできるように求められるものの一つに探したいテキストを見つけることがあります。vimは非常に強力な検索能力を持っており、いくつかここで見ていきましょう。
文字列検索
“/”コマンドによる検索は、vim
における基本かつ強力な検索方法です。”/”を実行すると、画面下にカーソルが移り、探したいものを入力してENTER
を押します。
“include”を検索する
/include<CR>
以下のように、検索結果がハイライトされます。
検索結果が表示されたら、”n”を押すと次の結果に移り、”N”を押すと一つ前の結果に移ります。検索を”/”でなく”?”で始めると、ファイルの後ろから検索できます。
指定文字へジャンプする
vim
の驚くまでに素敵なところは、検索をどこでも実行できてどの指定文字にでもジャンプできることです。私はこの記事でHTMLを編集しているので、文の最後になりうる”<”文字列までいつでもジャンプできます。
現在位置より先の“<” の文字に移動する
f<
現在位置より先の“<” の直前に移動する
t<
1つ目の方法は、対象文字を見つけて(find) 移動する、2つ目は対象文字の直前まで(to) 移動すると覚えておくことができる。
ここでいい感じなのは、これらを名詞として使うことができることです。ちょっと前に、今読んで頂いているこの文を編集しているときに、私はこれを実行しました:
次の”<”までの文を変更する Change to the next "<"
ct<
これはどんな文字でも有効で、例えばピリオドでも、ブラケットでも、括弧でも、通常の文字でも、何でもOKなんです。文の中から移動する先を見つけるなり、そこにあると知っている文字に移動するなどできます。
検索コマンドまとめ
-
/{string}
: 文字列stringを検索 -
t
: ある文字の直前まで移動する -
f
: ある文字まで移動する -
*
: カーソルで現在選択されている単語の別の結果を検索する -
n
: 文字列を検索後、次の検索結果に移動する -
N
: 文字列を検索後、一つ前の検索結果に移動する -
;
: ある文字まで移動したあと、その次の結果まで移動する -
,
: ある文字まで移動したあと、その一つ前の結果まで移動する
“t”や”f”を使って行った検索の結果から”;”で次の結果に移動できます。また”,”では同様の動きをしますが、テキストの後ろから前に向かって移動します。
テキスト内の移動
テキスト内での移動は、生産性を高めるために非常に重要です。先にお話した通り、vimという一つの言語の中核的な原理に基づいているため、シンプルかつエレガントにこれを行うことができます。まず、いくつかの基本的なことを説明します。
基本動作
ホームポジション周辺から始めましょう。タイピストは、右手をj
,k
,l
,;
キーに置いておくことを習得していますが、vim
においても同様です。
-
j
: 一行下に移動 -
k
: 一行上に移動 -
h
: 一文字分左に移動 -
l
: 一文字分右に移動
これは最初は少し気持ち悪く、習得するには少し練習が必要ですが、すぐに自然になり、Microsoft WordやOutlookを使うのと何ら変わらなくなるでしょう(これらのアプリケーションではこのコマンドは使えませんが)。
ということで、右手の人差し指と中指は行を上下に動かし、人差し指と薬指は一文字分だけ左右に動かします。
行内の移動
行内の移動も簡単です。
-
0
: 行の先頭に移動 -
$
: 行の末尾に移動 -
^
: 行先頭の空白でない文字に移動 -
t"
: 次の”の一文字前まで移動 -
f"
: 次の”まで移動
,
と;
は、t
およびf
の移動を繰り返します。
単語ごとの移動
単語ごとの移動もできます:
-
w
: 1単語分先に移動する -
b
: 1単語分後方に移動する -
e
: 単語の最後に移動する
大文字を使用すると、文字列を分けているデリミタなどを無視することができます。
-
W
: デリミタを無視して1単語分先に移動 -
B
: デリミタを無視して1単語分後方に移動
ここで紹介した、強力で異なる意味を持つ大文字コマンドは、以降数多く登場します。
文や段落ごとの移動
-
)
: 一文単位で前に移動する -
}
: 一段落単位で前に移動する
画面単位の移動
-
H
: 画面の一番上の行に移動する -
M
: 画面の中間に移動する -
L
: 画面の一番下の行に移動する -
gg
: ファイルの先頭に移動 -
G
: ファイルの末尾に移動 -
^U
: 画面の半分だけ上に移動 -
^D
: 画面の半分だけ下に移動 -
^F
: ページダウン -
^B
: ページアップ
前後への移動
vimのノーマルモードでは、2つの場所をジャンプして行き来することができ、非常に便利です。
-
Ctrl-i
: 以前のナビゲーションロケーションに移動 -
Ctrl-o
: 以前の位置に戻る
その他の動作
- :
$行番号H
: 与えられた行番号に移動 -
M
: 画面の中間に移動する -
L
: 画面一番下の行移動する -
^E
: 一行スクロールアップ -
^Y
: 一行スクロールダウン -
^U
: ページの半分だけ上に移動 -
^D
: ページの半分だけ下に移動 -
^F
: ページ分下に移動 -
^B
: ページ分上に移動
さて、これまで登場したものを一箇所にまとめます
動作コマンドまとめ
-
j
: 一行下に移動 -
k
: 一行上に移動 -
h
: 一文字分左に移動 -
l
: 一文字分右に移動 -
0
: 行の先頭に移動 -
$
: 行の末尾に移動 -
w
: 1単語分先に移動する -
b
: 1単語分後方に移動する -
e
: 単語の最後に移動する -
)
: 一文単位で前に移動する -
}
: 一段落単位で前に移動する -
:$行番号
: 与えられた行番号に移動 -
H
: 画面のトップに移動する -
M
: 画面の中間に移動する -
L
: 画面の下部に移動する -
^E
: 一行スクロールアップ -
^Y
: 一行スクロールダウン -
gg
: ファイルのトップに移動 -
G
: ファイルの下部に移動 -
^U
: ページの半分だけ上に移動 -
^D
: ページの半分だけ下に移動 -
^F
: ページ分下に移動 -
^B
: ページ分上に移動 -
Ctrl-i:
以前のナビゲーションロケーションに移動 -
Ctrl-o
: 以前の位置に戻る
私はCAPSLOCK
をCtrl
にマッピングすることで、Ctrl
ベースの様々な動きに対応できるようにしています。
##テキストの変更
さて、ここまででテキストの中での移動について多くみてきました。ここからはテキストの変更をみていきます。まず最初に覚えておかなければならないことは、先に触れた移動は常に私たちと一緒にあるということ、これらはvim言語の重要なパーツであるということです。
モードを理解する
まず最初に把握しなければならないのは、モードの概念です。最初は少し直観的ではありませんが、一度理解してしまえば完全に自分のものになります。vimガイドの多くはモードの話から入りますが、少し締まりがないことが多いです。しかしながら、ノーマルからインサートへのモード変更については、モードの機能紹介をするには最適だと思います。
vimはノーマルモードでスタートします。初心者にとってvim の最も厄介な点の一つは、vim を開いて入力を始めることができないことです。まあ、それは実際はできるんですが、それをすると、物事はすぐに横道に逸れていきます。
- ノーマルモードはコマンドモードとも呼ばれ、通常コマンドを入力するモードです。コマンドには、移動、削除、またはこれらのあとに挿入モードを伴うものがあります。
- 挿入モードはファイルに変更を加えるモードで、ノーマルモードから挿入モードに入る方法はたくさんあります。繰り返しになりますが、練習していけば非常に簡単に感じることができますので、心配しないでください。
- ビジュアルモードは、テキストを選択する方法の一つです。ノーマルモードと似ていますが、カーソルの動きがハイライトされます。文字ごとや行ごとでテキストを選択でき、一度でもそのモードに入ると、より多くのテキストを選択することができます。
- ビジュアルモードの目的は、ハイライトしたすべてのテキストに対して何らかの操作を行うことであり、それは非常に強力なものになります。
- Exモードとは、下の方にドロップダウンして「:」というプロンプトが出てきて、コマンドを入力するモードです。これについては後述します。ここから強力なコマンドラインを実行できることを知っておいてください。
他にもいくつかモードがありますが、それらは入門編の領域から超えている傾向にあるので、ここではそれらに触らずにいきます。
##言語であることを念頭におく
私達の使っている言語、つまり動詞、修飾語、名詞があったこと思い出してみましょう。ここでは、ノーマルモードから始めて、何かを変更するために挿入モードに切り替えます。
まず動詞から始めますが、いくつかの選択肢があります。変更 (c)、挿入 (i)、追加 (a) があり、以下のようなバリエーションがあります。
基本的な変更/挿入オプション
以下オプションから見ていきましょう。
-
i
: カーソルの一つ前から挿入する -
a
: カーソルの一つ後から付け加えていく -
I
: 行先頭から挿入する -
A
: 行末尾から付け加えていく -
o
: 現在の行から一行下に新しい行を追加する -
O
: 現在の行から一行上に新しい行を追加する -
r
: 現在カーソルで選択されている一文字を変更する -
R
: 現在カーソルで選択されている一文字を変更し、入力状態のままになる -
cm
: 予め定義された範囲(単語、文、段落など)を変更する。 -
C
: 現在行において、現在位置から以降を変更する -
ct?
: “?”までを変更する -
s
: 現在位置から次のコマンドが指定する場所までを置換する -
S
: 現在行をすべて置換する
中の文を変更する Change inside sentence
cis
行先頭に行き、挿入モードにする
I
カーソルの一つ後ろから入力を開始する
a
これまで見たように、テキスト入力を始めるには、いろいろな方法があります。また、削除や挿入モードへの切り替えなど、一度に複数のことを行うためのショートカットもいくつかあります。
現在行において、現在位置から以降を削除し、挿入モードに切り替える
C
現在行をすべて削除し、挿入モードに切り替える
S
大文字小文字の変更
チルダ (~
) コマンドを使って、テキストの大文字小文字を変更することができます。これはご想像の通りに動作します。カーソルの下の文字や選択範囲のいずれかで動作します。
テキストの書式設定
段落などのテキストを素早くフォーマットすると便利なことがありますが、これは以下のコマンドで簡単に行うことができます。
現在の段落をフォーマット
gq ap
gq
はtextwidth
の設定に基づいて動作します。つまり、呼び出したものが何であっても、その指定領域内できちんとしたものになるように整います。
##テキスト削除
テキストを変更する方法がわかったので、次は直接削除する方法を見てみましょう。もうお気づきかもしれませんが、これらはアクションが違うだけで非常によく似ています。
##基本的な削除オプション
-
x
: 現在カーソルの文字を削除する(exterminate) -
X
: 現在カーソルまでの文字列を削除する -
dm
: 予め決められた範囲(単語、文、段落など)を削除する -
dd
: 現在行を削除する -
dt.
: 現在行において、ピリオド”.”までを削除する -
D
: 行末尾までを削除する -
J
: 現在行と一つ下の行を結合する(その間のものは削除)
大変シンプルですよね!
##取り消しとやり直し
取り消しとやり直しが無いテキストエディタは使い物になりません。お気づきのように、vim は操作のためのキーを直感的に感じられるように最善を尽くしており、取り消しとやり直しも例外ではありません。
-
u
: 直前のアクションを取り消す -
Ctrl-r
: 直前のアクションをやり直す
どちらのコマンドも、最後に保存した時点まで戻るか、現在の状態に戻るまで繰り返し使えます。
左手の小指で素早くできるように、CAPSLOCK
を Ctrl
にリマップしておくことを忘れないでください。
##繰り返しアクション
vim
の中で最も強力なコマンドの一つにピリオド "." があります(ちょっと不思議ですね)。ピリオド "." を使うと、感動的なことをすることができます。というのも、たった今行ったことを繰り返すことができるんです!
“.”を使って、直前のアクションを繰り返す
あなたが行う多くの作業は、繰り返すことで多くの意味を持つようになります。例えば、挿入モードに入ってテキストを追加するとか。一度だけやって、あとは移動して”.”だけでまた追加することができます。
単語を削除する
dw
そこから、さらに単語5つ削除する
5.
すごいでしょう! ビジュアルモードにおいてこれを組み合わせるとどんなことが起こるか、楽しみにしていてください。
もう一つの本当に強力なリピートコマンドは”&”で、これは最後の”ex”コマンドを繰り返すものです。
##コピーと貼り付け
テキストエディタでもう一つの不可欠なのは、テキストを素早くコピーして貼り付けることができることであり、vimはそれに長けています。
テキストのコピー
vim
はコピーを行うのですが、期待していたのとは少し違います。コマンドは c ではありません。覚えていると思いますが、c
はすでに "change" として予約されています。vim
は代わりに y
("yank")をコピーコマンドとショートカットとして使用しています。
-
y
: 選択したものをコピー -
yy
: 現在の行をコピー
覚えておいてほしいのは、この機能は、他のコピーと同じように、ソーステキストをいじっているわけではなく、つまり別のコピーを・・・コピー先で・・・コピーして・・・作っているだけなんです。
テキストの切り取り
vim
において、テキストの切り取りは単に削除と同じです。ですから、どのような構文を使っているにせよ、実際には削除されたテキストをバッファに引っ張ってきて、それを貼り付ける準備をしているだけなのです。
テキストの貼り付け
貼り付けは非常に直感的です。ですから、もし dd
を使って行を削除した場合は、p
を使ってそれを貼り付けることができます。
テキストの貼り付けについて覚えておくべきことの一つは、貼り付けは通常カーソルの直後から始まり、コピーしたもの(文字、単語、行や列など)をペーストするということです。また、汎用の undo コマンド "u
"を使って、貼り付けを元に戻すことができることも覚えておいてください。
コピーと貼り付けのまとめ
-
y
: 現在位置から次のコマンド(名詞)までの選択範囲をコピーする -
yy
: 現在行コピーのショートカット -
p
: 現在カーソル位置の後に、コピーまたは削除されたテキストを貼り付ける -
P
: 現在カーソル位置の前に、コピーまたは削除されたテキストを貼り付ける
行を入れ替える
ddp
テキストの行を入れ替えるうまいやり方です。まず現在の行を削除し、それをもとあった場所に持ってくるコマンドです。
##スペルチェック
スペルチェックができないとかなりヤバい状態になってしまいますが、vim はそれをかなりうまくやってくれます。まず conf ファイルの中でオプションを設定します。
~/.vimrc のどこかにこれがあります
set spell spelllang=en_us
スペルミスしている単語を探す
conf ファイルで set spell
を有効にしている場合、スペルミスの単語には自動的に下線が引かれます。:set spell
を実行すると設定が有効にあり、:set nospell
を実行すると無効になります。
いずれにしても、スペルミスを見つけたら、次のコマンドを使って、スペルミスを処理することができます。
次のスペルミスしている単語に飛ぶ
]s
最後のスペルミス単語に飛ぶ
[s
スペルミスしている単語上において、修正案を参照する
z=
スペルミスしている単語を正しいものとマークする
zg
スペルミスしている単語であるとマークする
zw
私は ~/.vimrc
ファイルにスペルに関連したショートカットをいくつか追加しています。最初のものは、何かを「修正」するのを簡単にしてくれます。
リーダーキーf でスペル修正
nnoremap <leader>f 1z=
次の例は、例えば何かを作っている途中でのスペルチェックを回避するもので、同じコマンドでモードのOn/Offを切り替えるトグルスイッチです。
リーダーキーsでスペルチェック切り替え
nnoremap <leader>s :set spell!
##置換
vim のもう一つの強力な機能は、強力な置換機能です。最初に何を探しているかを指定し、次にそれを何に変更するかを指定し、変更の範囲を指定することで行われます。
基本セットアップは:%s
です
各行のfooをbarに変更する
:%s /foo/bar/g
現在行のみ、”foo”を”bar”に変更する
:s /foo/bar/g
%
が無いことに注意ください
他にもオプションがありますが、上記は基本中の基本です。
#上級編
素晴らしい。ここまで、テキストエディタが持つべきいくつかの基本的なことと、vim がそれらのタスクをどのように処理するかを説明してきました。これは入門者にとっての上級編であり、Kana the Wizardになるためのものではないです。
##物事を繰り返させる
先ほど、ピリオド "." を使って素早く繰り返しができるという話をしました。コマンドの種類によっては、他のものよりも優れているものがあり、その違いを知ることが重要です。
一般的には、ピリオド "." を使った繰り返しのアイデア(Drew Neilのいうドットコマンド)は、”.”のような反復可能なコマンドと組み合わせて、個別の動作をさせたいということです。
例えば、複数の行でそれぞれ文字列が含まれているものに対して、文字列の最後にテキストを追加するとしましょう。次のようにすることができます。
文字列を探す(delinquentという文字列)
/delinquent
さて、"n "キーを押すたびに次の"delinquent"の検索結果に飛んでいきます。最初のものから始めて、 テキストを追加していきます。
行末尾にテキストを追加する(”DO NOT PAY”を追加)
A[DO NOT PAY] [Esc]
上記で一つ実行されましたが、しかし、他にも12の場所で実行しなければならないとします。"." は最後のコマンドを再実行するためのもので、検索も保存されているので、それらを組み合わせることができます。
次の検索結果に飛んで先程と同じテキストを追加する
n.
ここでお伝えしているのは、なにかの動作と保存済コマンドを理想的に組み合わせることで、必要に応じて移動と再実行ができるようになるということです。
##テキストオブジェクト
テキストオブジェクトは本当に素晴らしいものです。これにより、より複雑なターゲット(名詞)に対してアクション(動詞)を実行することができます。つまり、ある単語を選択してそれを削除したり、文頭に行ってそれを削除したりするのではなく、これらオブジェクトのどこにいても、これらのオブジェクトに対してアクションを実行することができます。
ちょっと説明が難しいので、いくつか例をご紹介します。
単語テキストオブジェクト
単語系のオブジェクトから見ていきましょう。
-
iw
: 内部単語 -
aw
: 外部単語
これらは操作対象(名詞)なので、これに対して削除や変更などを行えます。
外部単語を削除する
daw
内部と外部の違いは、スペースが含まれるかどうかです。
文テキストオブジェクト
-
is
: 内部文 -
as
: 外部文
これらは単語オブジェクトとほぼ同じように動作します。なので例えば、あなたがあるとき、ある文に対して突然嫌悪感を抱き、これをなんとかしようと考えたとしましょう。そのときに、その文の先頭に移動して、文の最後まで削除するのではなく、以下のようにすれば良いのです。
文の内部を変更する
cis
これをやれば、指定した文をサクッと消し去って、挿入モードにし、新しく書き始めることができます。
その他のオブジェクト
その他にもたくさんのオブジェクトが存在します。
- 段落:
ip
とap
- 単一クォート:
i'
とa'
- ダブルクォート:
i"
とa"
私はコードや HTML を編集するときに、これらを常に使用しています。重要なのは、操作したい対象のセクションの中にいる必要がないということです。「ci”」と伝えるだけで、ダブルクォート内のすべてを削除し、さらに挿入モードでダブルクォート内にカーソルを持ってきてくれます。これは非常にクールです。
これは、括弧()、角括弧[]、波括弧{}、タグ<>など、他のいくつかのタイプの項目についても同じことが言えます (HTMLをイメージしてください)。
ダブルクォート内にURLがあり、タグの中にリンクテキストがあるHTMLリンクを編集することを考えてみてください。ci”とcitを使うことで非常に品よく行うことができます。
テキストオブジェクトのまとめ
以下がテキストオブジェクトのまとめです:
- 単語:
iw
とaw
- 文:
is
とas
- 段落:
ip
とap
- 単一クォート:
i'
とa'
- ダブルクォート:
i"
とa"
- 逆クォート:
i
とa
- 括弧:
i(
とa(
- 角括弧:
i[
とa[
- 波括弧:
i{
とa{
- タグ:
it
とat
とても便利で、私自身が最もよく使っているのは、単語、タブルクォート、そしてタグです。
##ビジュアルモードの利用
Vim
使いの多くの技は注目を集めるものですが、ビジュアルモードを巧みに使えることほど、周囲から相当にできるやつと見られることはありません!
おそらく、ビジュアルモードについて最も良いことは、これまでに学んだすべてが更に強力にできることでしょう。これは、コマンドを、現在ハイライトされているテキストに対して適用できるようにすることで実現します。
それでは、ビジュアルモードに入ってテキストをハイライトする方法から始めましょう。ビジュアルモードに入るには、「v
」キーを押します。3つのオプションが存在します。
- 文字ベース:
v
- 行ベース:
V
- 段落ベース:
Ctrl-v
コンテナ内を選択する
ほとんどの場合、あなたのカーソルの位置は、例えばカンマやピリオド、括弧、波括弧、角括弧などに囲まれたコンテンツの内側にあると思います。以下のようなコマンドを発行することで、これらを視覚的に選択することができます。
段落内を選択する
vi(
角括弧内を選択する
vi[
数字指定をすることで、2段目を指定できます(入れ子の中にいる場合)
2段目の波括弧内を全て選択する
v2i{
また、va
を使うと、内側ではなく周りを選択することができます。このように出てくるものを全て理解して、頭がいっぱいになる必要はありません。これらは、私たちがどこでも知っている名詞や動詞と全く同じ構成であることを覚えておいてください。
文字ベースのビジュアル選択
文字ベース(ノーマルモードからv
で入る)で始めると、これを使って文字や文字のセット、単語などを選択することができます。私は行ベース(V
)に比べてはるかに使用頻度が低いのですが、それでもよく使います。
ここで理解しておきたいのは、ビジュアルモードになったことで、ハイライトされているものがモーションによって変化するということです。つまり、選択範囲を拡大するために w
や )
のような動作ができるということです。ハイライトされた部分がアクションのターゲットになります。
行ベースのビジュアルセレクト
ノーマルモードから V
キーを押すことでこのモードに入り、ここから後ほど説明するアクションを実行します。
列ベースのビジュアルセレクト
もう一つのオプションでは、テキストを縦に選択することができ、データの列を引っ張ってくるのに便利です。
ビジュアルモードで選択されたテキストに対して実行できるアクション
ここは本当に好みの問題ですが、一番多い操作は単純に削除、コピー、貼り付けです。すでによく慣れている、マウスを使ったハイライトと同じものであると考えれば結構です。
ビジュアルモードに切り替え、単語を2つ選択し、コピーする
vwwy
そして、任意の場所にてpで貼り付けできます。
あるいは、他の行ベースのアクションを行うこともできます。
行ベースビジュアルモードに切り替え、下の数行を削除する
Vjjd
テキストオブジェクトを使って最高にクールにやることもできます。
ビジュアルに段落全体を選択する
vip
ビジュアルに段落全体を選択し、下に貼り付ける
vipyjjp
コマンドが長くなっていますが、大丈夫です、これは言語なんです。例えばこういうのはスラスラ言えますよね?
あのお店に行きたい(I want to go to the store)
問題ないですよね、ここでも同じことなんです。
段落をコピーし、二行分下に移動し、そして貼り付ける
ビジュアルモードと繰り返し処理の組み合わせ
ビジュアルモードでできるもう一つのイケてること、それは”.”コマンドを適用して選択範囲に対して保存されたアクションを実行することです。以下のテキストを例にしてみましょう。
foo bar thing other yetanother also
これに、コロン”:”を各単語の前につけようと思ったとき、まず1つ目のfooの前に実際に”:”をつけ、その後全単語を選択し、そして”.
”を叩きましょう。すると:
:foo :bar :thing :other :yetanother :also
じゃーん!
実感わきませんか?ではこんな場合は?あなたのファイルは60,000単語で、それぞれに上記のような単語があり、それぞれに": "を追加しなければなりません。あなたはどうしますか?
※他のやり方としては、~/.vimrc
にvnoremap . :norm.<CR>
を付け加える。
ファイル全体にコロン”:”を追加する
0i:j0vG.
おっと、
落ち着いてください、次のようにやったんです。
- まずファイルの最初の行に飛び、コロンを挿入する
- 一つ下の行にいき、先頭に飛ぶ
- ファイル最後までビジュアルに選択する
- コロンが選択範囲に追加される
これだけで、ファイル全体にできるんです!「アルファベット、アンド記号、そしてなんちゃらかんちゃら 25」とか覚えなくていいんです。すぐにできるようになりますよ、信じてください。
##マクロの活用
マクロは怖いものだと思われていますが、実際にはそんなことはありません。皆さんが実施すること全部を記録し、それを再度実施する、これがマクロでできることの本質です。以下に簡単なまとめを示します。
-
qa
: 記録をスタートし、aというマクロ名にする -
q
: 記録を停止する -
@a
: マクロを再生する
簡単ですよね!?複数のレジスタに複数のマクロを格納しておくことができます。a、b、cといった具合に。そして、それらを @a
や @c
で再生するだけです。
なぜマクロを使うのか
おそらくこういう疑問があるでしょう:
ドットコマンドによる視覚的な選択と繰り返しがこれほど強力なら、なぜマクロを全う必要があるんだろうか?
素晴らしい質問です!そしてその答えは簡単ではありません。マクロは今できることが単に何でもできるようになります。例えば、以下の手続きを考えてみましょう。
- 行内で "widget "を検索
- 単語の語尾に行って"-maker "を追加します。
- 行頭に移動し、コロンを追加します。
- 行末尾まで行ってピリオドを追加します。
- 行末尾の空のスペースを削除します。
これが大変な作業で、先程見たような6万行のファイルだと、多少苦痛になります。例えば、Microsoft Wordでそれをやってみてください。
しかし、vim
では、これらのアクションを一度だけ実行して、それを各行で再生するだけです。
ビジュアル選択でマクロを再生することも可能で、:normal @a
(aはマクロ名で任意)とします。これを行うと、各行で、一時的にノーマルモードに切り替わり、そこでマクロを実行します。
##ちょっとしたコツ
量の多いタスクや大幅な時間削減ができるケースを見ていきましょう。
行末尾の空白スペースの削除
あなたのファイルの種類によっては、改行文字の対応が必要かもしれません。ここでは、あなたの行の最後からそれらの厄介なCtrl-M
文字を削除する方法を説明します。
Ctrl-M文字をファイル末尾から削除する
:%s/s+$//
ファイル種類の変更
set ft=unix
set ft=html
set ft=dos
現在のファイル種類を見るには、~/.vimrcに:set filetype
を入れ込むか、実行する
コンテンツを囲む
SURROUNDプラグインを使うと、テキストをマークアップで囲うという素晴らしいことができます。
-
cs"'
: 現在の単語において、ダブルクォートを単一クォートに変更する -
cs'<q>
: 上記と同じだが、単一クォートをに変える
-
ds"
: 周りのダブルクォートを削除する -
ysiw[
: 現在の単語の周りを角括弧で囲う -
ysiw<em>
: 現在の単語を強調する(テキストオブジェクトでこれが使えるんです!)。驚くなかれ、これはドットコマンドで繰り返せるのだ! -
ビジュアルモード
:任意を選択して、S
とタイプする。ウィンドウ下に移動することになり、囲う文字を指定する。例えば、<a href="/images">
、と入力してEnterを押す、といった具合に。
#終わりに
いかがでしたか? このガイドから得てほしいことが2つあります。
- vimは学習しがいがある
- vimは強力である
ここで取り上げた基本的なことを少しでも快適にできるようになれば、テキストをもっと楽しめるようになると思いますし、それは有効で、些細なことではないはずです。テキストを快適に扱えるようになればなるほど、もっと快適にアイディアに対して取り組むことができるようになり、素晴らしいことこの上ないのです。
何よりも、これがテキストエディタを使いこなすべき理由です。アイデアを手中に収めたいときには、不自由さや煩雑さではなく、自然で力強く行いたいものです。
あるいは、そんなくだらないことはすべて置いといて、設定ファイルを編集しているあなたをみた他の人が、心から感服するような、そんな人になることもできます。いずれにしても、この記事が役に立つことを願っています。
翻訳協力
Original Author: Daniel Miessler
Thank you for letting us share your knowledge!
この記事は以下の方々のご協力により公開する事が出来ました。
改めて感謝致します。
選定担当: @masatakahashiguchi
翻訳担当: @masatakahashiguchi
監査担当: takujio
公開担当: @aoharu
ご意見・ご感想をお待ちしております
今回の記事は、いかがだったでしょうか?
・こうしたら良かった、もっとこうして欲しい、こうした方が良いのではないか
・こういったところが良かった
などなど、率直なご意見を募集しております。
いただいたお声は、今後の記事の質向上に役立たせていただきますので、お気軽にコメント欄にてご投稿ください。
みなさまのメッセージをお待ちしております。