BREAKING NEWS

[4]

初心者こそ、お洒落でvimらしい使い方を学ぼう!



vimをvimらしく使っていますか?




ネットで「vimの使い方」と検索すると、vimにはモードがある事を教えてくれたり、カーソル移動やよく使う編集のためのキーバーインドの一覧をまとめてくれていたりするページが沢山ヒットします。

それらを読んで、実際に使ってみて

「うはぁ、vimって超便利!もう手放せないぜ!」

って、なりましたか?

私の場合は、正直、「何これ?モード移動とか超面倒クセーーー」って感じでした。

vi 対 Emacs どっちが最強?!

とか、言われているはずなのに、普段、Emacsを使っていた私にとっては、vimの何処が良いのか、さっぱり分かりませんでした。

私は、別にEmacs信奉者であるというわけでは無く、どちらかと言えば、マニアックな操作感を持つvimに常に魅力を感じていて、使えるようになりたいなぁと憧れさえ持っていました。

なので、偶にネットでvimの使い方を検索してみたり、vimtutorを試してみたりしていたのですが、既に慣れているEmacsを捨ててまで、「わざわざ」普段の設定ファイル編集等をvimでやってみようという気にはならず、結局、あまり使わないとキー操作もすぐ忘れてしまうというといサイクルを何度となく繰り返してきました。

しかし、世界を二分するエディタ戦争の当事者であるviが、普通に考えてこんなに単にめんどくさくて使う気になれないエディタなわけはないとずっと思っていました。きっと、「慣れれば」便利なんだろうとか、「柔軟なカスタマイズを上手くやれば自分にあった操作ができるようになるんだろう」とか、思っていました。

結構、そんな人達って多いんじゃないのかなぁ?と思ったりします。
そこで、そんな過去の私と似たあなたのために、今回のメモではvimを触ることが超楽しくなる、おしゃプロ流「vimの使い方」をメモしたいと思います。

実は、ある事を癖づけて、ある事を意識するだけで、vimの感覚が簡単だけど劇的に変わります。

「巷の」vimの使い方

さて、vimを全く触ったことが無い方は、まずは、「ドットインストール」の『vim入門』に挑戦してみましょう。macな人なら、vimは既にシステムに入っているので、すぐに挑戦できます。


色んな事を全て覚える必要はありません。まずは、vimってこんな風に使うんだ!って感覚を体験してください。

どうです?普通の文字キーでカーソル移動したり、コマンドモードで検索置換したり、なんか凄そうな雰囲気はするんだけれど、実際に使ってみると、モード移動とかめんどくさくないですか??

また、触ってみて分かる通り、他のエディタでは当然の様に直感的に出来る文字入力と比較して、vimでは、立ち上げた状態でいきなりキーボードを押したとしてもその押したキー通りの入力は出来ません。つまり、「i」という挿入モードに移行するキーを忘れてしまうと、書き込むことさえできないのです。同様に、「Esc」キーでノーマルモードに戻り、「:w」という「コマンド」で保存し、「:q」という「コマンド」で終了出来るということを忘れてしまうと、アプリの終了さえ出来なくなってしまうのです。

巷の「vimの使い方」で書かれている事

というわけで、巷で紹介されている「vimの使い方」を参考にvimの操作で最低限必要そうな、以下の点を暗記しましょう。

  • 「ノーマルモード」と「入力モード」があると言うことを把握
  • 「入力モード」に入るための「i」
  • 「ノーマルモード」に戻るための「Esc」
  • 保存するための「:w」
  • 終了するための「:q」

そう、最低限、これを覚えておけばテキストファイルを編集できます。

試しにvimを使ってテキストファイルを作成してみましょう。
zshの設定ファイルのダミーを例に作ってみます。

ターミナルから次のようにしてvimを起動してみます。

% cd ~/
% vim zshrc_dummy

起動したら、以下のテキストを入力してみて下さい。上記の最小限のキー操作を頼りに打ち込んでも良いですし、ドットインストールや巷の「vimの使い方」での紹介を覗き見ながら、便利そうな編集キーを使ってみても良いです。

入力が終わったら保存して、終了までしちゃいましょう。

# -*- shell-script -*-
# My zsh config file

###########################
# alias
###########################

alias ls='ls -FG'
alias la='ls -a'
alias ll='ls -l'
alias lla='la -l'


出来ましたか?

最低限の暗記事項さえ覚えておけば、テキストファイルは作れます。

まず、vimで文字の入力を行うためには、「i」キーで「入力モード」に入ります。「入力モード」に入ってしまえば、キーボードを打てばその文字が入力されるし、カーソルキーでカーソルを動かせますし、バックスペースを押せば字が消えます。普段、ワード等で字を書いているのと同じように、文字を入力できるし、削除も出来ます。

そして次に、全部打ち終えたら、「Esc」で、「ノーマルモード」に戻り、そこで、保存のため「:w」と打ち込み、更に終了の為に「:q」と打ち込めば完了です。

しかし、そんな入力の方法では、ノートパッド以下の操作性です。

普通、上の様な設定ファイルを打つ時には、「###############」の部分や「alias」の部分など、コピペしたくなりますよね。だから、多分、コピーがしたくなったら、ノーマルモードに戻り、コピーコマンド、ペーストコマンドを使います。
そして、入力モードにまた戻って、続きを書きます。

巷の「vimの使い方」のページにはコピーコマンドでどうやって単語を選択するかや、もしかしたら、ビジュアルモードでの範囲の選択の仕方など懇切丁寧に書いてくれている事でしょう。

で、どうですか?
vim使ってみて楽しいですか??

巷の「vimの使い方」で書かれていない

どの「vimの使い方」のページでも「i」で「入力モードに入る」、「Esc」で「ノーマルモードに入る」という事は必ず書かれていますが、それらの

「モードをいつ切り替えるのか」

ということについては、ほとんど書かれていません。

あなたがやった先のテキスト入力の事を思い出してください。

初めにノーマルモードから入力モードに切り替えるのは、誰もが同じで「書こうと思った時」です。なので、一番初めの文字「#」を打つ時に「i」キーで「入力モード」に入ったと思います。

では、いつ「ノーマルモード」に戻ったか覚えていますか?

頑張って、最後まで入力した後、保存のコマンドを打つためにノーマルモードに戻りましたか?
それとも、「##################」をコピぺするために、ノーマルモードに戻って、行削除コマンド、貼り付けコマンドを駆使した時でしょうか?

実は、vimを使いこなしている人は、普段常に「ノーマルモード」にいます。どういう事かと言えば、「入力モード」にいるのは、まさに字を打っている瞬間のみで、入力する手が止まった時には、すぐさま「ノーマルモード」へ切り替えます。

vim以外のエディタは、アプリを立ち上げた瞬間から、編集画面でキーをタイプすれば、そのまま文字が書き込めます。つまりは、いつでも「入力モード」になっているようなものなので、そこにいることが「当たり前」だと感じ、一旦、「入力モード」に入るとそこに留まり続けます。
一方、vimにとっては、「入力モード」にいる瞬間は「特別な」瞬間なのです。

なので、一番初めの問いの答えとしては、vimの使い方を知っている人ならば、少なくとも1行目の行末でノーマルモードに戻っていると思われます。もし、短ければ、1ワード打って、ノーマルモードに戻ったかもしれません。

vimで初めに覚えるべき指癖

さて、上の話だと、vimっぽい人は、モード切り替えをめちゃめちゃ頻繁にしているように思えますが、もともとモード切り替えめんどくせーとか言ってたのに、そんなに頻繁にやると更にめんどくさくなるんじゃないんでしょうか?

vimをvimらしく使う方法を実践して、めんどくさいかどうかを体験してみましょう。

いつ、どうやってノーマルモードへ戻るのか

私がメモする一番目の「vimの使い方」は、

「Ctrl + c」をカチャカチャする

です。

本来、「ノーマルモード」に入るためのキー操作は「Esc」キーで行いますが、ホームポジションから遠いのでカチャカチャするには不向きです。そこでまずは「Esc」の代わりに「Ctrl + c」キーを使ってみましょう。(ここで、「Esc」と「Ctrl+c」の効果には異なる部分があります。その違いについて丁寧にコメントを投稿していただいたので、是非この記事の最後のコメント欄もご覧ください。)

さて、しかしながら、ここではまず、「カチャカチャ」する事自体が超重要なのです。いつでも暇さえあれば貧乏ゆすりレベルで、このキーを押して結構です。

要は、気が付けば無意識に

「ノーマルモード」にいる

ようにします。

では、実際にもう一度例の設定ファイルを打ってみましょう。

% cd ~/
% vim zshrc_dummy002

新たなファイルを作成します。

まず、最初の2行を打っていきます。

立ち上げた状態だとvimは「ノーマルモード」にいます。この状態でも更に「俺はノーマルモードにいるんだ!」と自己主張するため、ウオーミングアップとして「Ctrl + c」をカチャカチャやってみましょう。

一行目は

# -*- shell-script -*-

です。今から「1行目を入力するぞ!と」決意できたら、「i」キーを押して「入力モード」に入り、この1行を一気に入力し、最後の「-」文字を入力したら、すぐさま「Ctrl + c」します。

つまり、

行末ではリターンキーで改行を入れることなく
「ノーマルモード」に戻る

事に慣れます。

「ノーマルモード」に戻ると1行目の行末文字の上にカーソルがあるはずですが、どうやって次の行を入力するのか。新しい行を作って書き始める時は「o(小文字のオー)」で「入力モード」に入ります。

次行は「o」キーで書き始める


# My zsh config file

入力モードに入ったら、一気に入力し最後の「e」の文字を打ったらスグに「ノーマルモード」へ戻ります。

まずは、行末で常にノーマルモードへ戻る癖をつけます。「Ctrl+c」が指癖になっていると、モード切り替えの操作自体は、「面倒」と認識することがなくなります。
何故かといえば、1行単位が入力時の思考の区切りになっていること、そして、現実的な操作としては、1キーで癖になってしまっていることが合わさると、切り替えが当たり前の感覚になってきます。

ノーマルモードでウロウロする

さて、2行目を打ち終えた、あなたは今、「ノーマルモード」にいます。
今のところ、文字を入力していない瞬間は、常に「ノーマルモード」にいる事を実践できています。

もう一つの指癖を付けましょう。というよりも、キーボードに手を置いているなら、既にあなたの右手の人差し指は「J」キーのポッチを常に撫でていますよね。同様に「K」キーには中指が、「L」キーには薬指が乗っているはずです。

vimでは、これに「H」キーを加えた「HJKL」の4キーでカーソルの移動が出来ます。有名ですよね。

しかし、実際vimを使い始めてみて、ちゃんとHJKLを使っていましたか?
一旦入力を始めて「入力モード」に入りっぱなしになっていると、カーソルを動かすためにわざわざ「ノーマルモード」に戻ってくる必要があります。

しかし、今はどうでしょう?何かしようと思いつく時には、既に「ノーマルモード」にいるのです。
そして、実は、「HJKL」キーは、ノーマルモードに居る間は、カーソルが動かせるというよりも、落ち着きなくカーソルをウロウロと動かしながら、「さて、何書くかなぁ~」と思考を巡らせるのが、「vimの使い方」なのです。

どうです、少しvimっぽさを実感出来てきましたか?

全てはノーマルモードから始まる

さて、なぜ、常にノーマルモード、ノーマルモードというのかといえば、vimは全てがノーマルモードから始まるように作られたエディタだからです。

編集は小さな思い付きを実現する繰り返し

先ほどやってもらったように、何かを書き写す場合、つまり、既に入力する文字列が決まっていて、それを入力するだけなら、編集作業中に何かを考えることはありません。正確に入力する集中力さえあれば、初めから終わりまで単に指を動かして文字を入力するだけです。

しかし、現実に設定ファイルを自分で作成する場合には、初めから終わりまで、一気に打ち込んでいくことはありません。頭で思いついた事をテキスト上に表現し、また考えて。。。ということを繰り返します。また、この時、編集位置も、初めから終わりまで順序良く一気に行くこともありません。

あなたが自分でzshrcを書きはじめようとする時の事を想像してみましょう。

vimを立ち上げ、画面に向かいながら、「なんてかこうかなぁ? まぁ、設定ファイルだし、zsh config fileとか初めに書いておこう」と思ったりするでしょう。

頭の中に浮かぶのは、とても小さな見通しです。
この小さな思い付きを実際にエディタ上で書き込みます。

これを書いてはみたものの、「あ、待てよ、自分の設定ファイルだし、My を付けた方がいいか」とか思いつきます。
これも小さな思い付きです。

思考とvim

このように良く見てみると、編集作業と言うのは小さな編集作業の繰り返しです。そして、vimでの編集というのは、この流れに素直に乗って使います。

「zsh config file」と書こうと思いつきます。
そこで、「書く事」を実現するために「入力モード」に入り、「zsh config file」という内容を書き込み、その後、この小さな作業の終わりを明示するために「ノーマルモード」に戻ります。

実際のvimでの操作は次の通り。

[i]zsh config file[Ctrl + c]

[]は編集用のキー操作を区別するために入れています。

次に、先頭に「My 」を書き込もうとと思いつきます。
現在のカーソル位置と、編集位置が異なるので、まず、先頭にカーソルを移動しなければなりません。そして、その位置から「書く事」を実現するために「入力モード」に入り、「My 」という内容を書きこんだら、作業の終了を宣言するために「ノーマルモード」に戻ります。
これも小さな作業ですよね。

実際のvimでの操作は次の様になります。

[I]My [Ctrl + c]

ここで[I]キーは行頭から「入力モード」に入るためのキーです。

どうでしょう、思考の流れとvimでの操作、ぴったりとリンクしていませんか?

Undoの範囲

さて、編集と言うのは小さな編集作業の繰り返しということは分かりましたが、わざわざ「ノーマルモード」に戻るのは何故でしょうか?
思考的には細切れであったとしても、結局、文字入力を続けるなら、ノーマルモードに戻っても結局すぐに入力モードに戻ってくるじゃないか?と思うかもしれません。

実は、vimでは、この小さな編集単位である「入力モードに入ってからノーマルモードに戻るまで」は、Undoの範囲になります。

つまり、自分の思考単位とUndo範囲を一致させることが出来るのです。
編集を行い、「ノーマルモード」に戻った時点で「u」キーを押すことで、その行った編集を取り消すことが出来ます。

まぁ、実は、思考との一致自体にこだわる必要は全然なく、単に、自分の好きな範囲をUndo範囲として決めることが出来るという事です。
そもそも、vim以外のエディタでは、undoの範囲は、自分で決めることが出来ません。

様々な初めの一歩を選択できるのがノーマルモード

ここで、もう一度、小さな編集単位を思い出してください。
それぞれの編集を行う時、例えば、「書く」という行為を行う時に、実は「何処に」ということがセットになっています。

連続して入力している時は、たまたま、「現在カーソルがある場所」と「編集を行う場所」が一致しているだけで、先の例でも見たように、現在のカーソル位置と、編集位置が異なる事も普通にあります。

つまり、小さな編集は「何処に」&「何をする」を実現することになります。

そこで、vimでは「何処に」を実現するため、先に紹介した「HJKL」を基礎として、カーソルを効率的に移動させるコマンドが幾つもあります。その中でも最も頻繁に使われるのが、行頭にカーソル移動させる「0(数字のゼロ)」と行末にカーソルを移動させる「$」であり、巷のvimの使い方のページでも必ず紹介されているはずです。

さらに、この行頭、行末へ移動して、何をするかと言えば通常「書く」わけですから、

「0」(行頭へ移動)+「i」(カーソル位置から入力モードにはいる)
「$」(行末へ移動)+「a」(カーソル直後から入力モードに入る)

とうのは、よくあるセットだったりします。
これが1つのキーで実現できると更に便利だと思いませんか?
ズバリ、「I」キーと「A」キーで実現できます。

多分、巷のvimの使い方のページを見たことのある人は、このキー操作のいくつかは、何度も見たことがあると思います。全て入力モードに入るコマンドです。

コマンド 動作
i カーソル位置から入力モードに入る
a カーソルの直後から入力モードに入る
I 行頭から入力モードに入る
A 行末から入力モードに入る
o 次行を新しく挿入してから入力モードに入る
O ひとつ前に行を新しく挿入してから入力モードに入る

今まで、同じ入力モードに入るのにこんなにいっぱいあったら覚えられないと思っていませんでしたか?とりあえず「i」だけ覚えておけばいいやって感じじゃなかったでしょうか?

今までは、常時「入力モード」に入り浸った状態だったので、「何かvimでこんなコマンドあったなぁ。試してみるか?」と思い立った時初めて、「ノーマルモード」に戻ってコマンドを試すという感じじゃなかったでしょうか?確かに非常にめんどくさい。

しかし、今やノーマルモードから始められる指癖が付き始めたあなたなら、感覚が異なるはずです。「ノーマルモード」にいるあなたは、やりたい事を実現するために、1つキーを押すだけで、全てを始めることが出来るのです。

vimでは、「ノーマルモード」で頭を使います。まず、何をするかを考えた後、その自分の思いついた小さな編集の事について、どうやったら効率よくまとめられるかも考えます。やがて、考え付いた自分なりの最短の小さな編集計画を、指を動かしてvimのコマンドとして実行します。

どうでしょう?少し実感出来て来ましたか?
vimは全てが「ノーマルモード」から始まるように作られているのです。

ドットコマンドとかいう神コマンド

ここまで、編集作業は小さな編集から成り立っていて、vimでは、これをUndoの範囲として具体的に活用することが出来るという話をしました。

しかし、この小さな編集単位は、もっと実用的で楽しく使うことが出来ます。
zshrc_dummy002の続きを書いていきましょう。

いま、2行目の行末「e」の文字の上にカーソルがあると思います。

まずは、次行に空行を作ります。
vim的にやってみましょう。

[o][Ctrl+c]

です。

次の行は「###################」(#の個数は適当)という飾りです。
そして、その次の次の行に同じ「###################」があります。

コピーしてくれと言わんばかりの部分ですが、コピーでないvimらしい方法をお見せしましょう。

まずは、いつものように小さな編集計画をたてます。
今、カーソル行は空行部分にあるので、今回も次の新規行を挿入して入力モードに入りそこに「###################」を書き込めばよいでしょう。

[o]###################[Ctrl+c]


これでOKです。飾りが書き込めましたね。

ここで、
「.(ドット)」キー
を押してください。


もう一本、「###################」が、現れましたか??

この「.(ドット)」コマンドは、直前に行った編集を繰り返してくれるコマンドです。この直前に行った編集とは

[o]###################[Ctrl+c]

であり、今まで話してきた、小さな編集の事です。

コピーなんか目じゃありません!ワンキーで呼び出せるのです。

もう少し進めてみましょう。

今、編集画面では

###################
###################

と並んだ状態にあり、カーソルは2本目の一番最後にあります。
次の編集は、現在カーソルのある行の1つ上に、新たな行を挿入して入力モードに入り、「# alias」と書き込むことです。

[O]# alias[Ctrl+c]



こんな感じでどうでしょう。[O(大文字のオー)]は、一つ上に行を挿入してくれます。
これで、小文字のオーや大文字のオーの使いどころが掴めて来たでしょうか?

さて、もう一度空行です。カーソルが# aliasの行にあるので、「j」キーを押して、一番下の「#############」の行まで下します。この辺りは、何でもかんでも1キーで編集してしまおうとするよりも、無意識に動かす「hjkl」に任せた方が頭が疲れなくて済みます。

空行を入れてみましょう。もうわかりますよね。

[o][Ctrl+c]

さて、次です。
aliasで始まる行が幾つか続いています。

さあ、あなたならどうしますか??

そして、今、それを考えているあなた

少しワクワクして楽しい気分じゃないですか??

モード移行がめんどくさいとか、キーを覚えるのがめんどくさいとか思っていたのは、過去の話です。
知らないうちに、モード移行はされていて、そんな事は気にならなくなっているはずです。そして、こないだまで、眺めていても覚える気にもならなかったキー操作の一覧の中に、何か面白そうなものは無いか気になり始めているんでは無いでしょうか?

[o]alias [Ctrl+c][.][.][.]

なんてどうでしょう?
はじめは、これで十分、はじめのailasに戻って「A」して適当に打っていきましょう。

もちろん、もっと賢いやり方があるかもしれません。

しかし、あんまり凝った作戦を練りすぎるのも良くありません。なんせ、目的はテキスト編集ですから。頭に思い浮かんだことを指で動かせる程度で十分。

今、ワクワクしているあなたは、きっとこのままvimに魅せられ、すぐにもっと賢いやり方を思いついて自然と指も動くようになる事でしょう。

vimを正しく学ぶ

巷の「vimの使い方」でも良く書かれていますが、vimに慣れるには「vimtutor」は最適です。
みなさんの中には既にやったことある人もいると思います。そして、その時は、つまらなかったり、苦痛だったので、きっとこのページを目にしているんだと思います。

% vimtutor en

もう一度、やってみて下さい。きっと、楽しいですから。
英語アレルギーでなかったら、英語版でやったほうが楽しいです。日本語版だと編集時に日本語に切り替えたりする作業が余計に入って、ストレスを感じやすいです。

さて、もう一つは、


という書籍です。



今日、このページで「vimってそうだったんだー」と感じたなら、それはまだまだ片鱗でしかありません。私は、この本で「巷のvimの使い方」で書かれていないvimを知ることが出来ました。vimの本は色々出ていますが、vimその物を正しく学ぼうと思うなら、この一冊は必携だと思います。

「巷のvim」の解説は、カスタマイズが柔軟でどうのこうの、とか、プラグインの導入がどうのこうのとか、vimscriptがどうのこうのという話で溢れ返っています。

しかし、そんなややこしい付け足しの話をしなくても、実は既に素のvim自体が、「Emacsと双璧」なのです。
初心者こそ、お洒落でvimらしい使い方を学ぼう! 初心者こそ、お洒落でvimらしい使い方を学ぼう! Reviewed by shunsk on 7/04/2016 Rating: 5

2 comments:

  1. すばらしい記事をありがとうございます。
    1点だけ指摘させて下さい。

    インサートモードで「Ctrl-c」を押すことと「Esc」を押すことは等価ではありません。
    少なくとも3点動作が異なります。
    ヘルプ(:h i_CTRL-C)を参照下さい。

    1. 短縮入力はチェックしない
    :iabbrevコマンドで設定した短縮入力が展開されないという意味です。
    (例)
    :iabbrev NIC Network Interface Card
    iNIC<Esc> → Network Interface Card
    iNIC<C-C> → NIC

    2. 自動コマンド InsertLeave が発生しない。
    :h autocommand
    :h InsertLeave
    正しく動作しないプラグインが出てくる可能性があります。

    3. インサートモード遷移時のカウント指定が無視されます。
    i_CTRL-Cのヘルプには明記されていませんが、個人的にはこれが一番もったいないと思います。
    (例1)
    32i#<Esc> → ################################
    32i#<C-C> → #

    (例2)
    3oHello<Esc>
    Hello
    Hello
    Hello

    3oHello<C-C>
    Hello


    もちろん、syunkichiさんが「Esc」キーの代わりに「Ctrl-c」を使用することは自由です。
    ただ、このブログを読む方に「インサートモードのEscとCtrl-Cは等価じゃないよ」と伝えて頂けると嬉しいです。

    ReplyDelete
    Replies
    1. ご指摘、有難うございます。
      なんだか、有名人にサインを貰った気分でちょっと興奮気味です。

      とても解りやすく丁寧に書いていただいたので、
      本文を書き換えてコメント欄を参照してもらうようにしました。

      私自身vim初心者なので、違いがある事自体知らなかったんですが、
      確かに3番は実際に使っている時に「あれ??」って
      思う場面がありました。「C-c」してたせいかと今更ながら知りました。


      Delete

Sora Templates

Image Link [https://scontent.xx.fbcdn.net/v/t1.0-9/13343039_103147363441877_5912666874811349341_n.jpg?oh=32de40bba33988d454d1a3104dde18ac&oe=57D1E6F4] Author Name [Syunkichi] Author Description [Let's write codes staylishly!!!!!] Twitter Username [webgeek7] Facebook Username [syunkichi.nekota] GPlus Username [114037852049523769954] Pinterest Username [pcgeek91] Instagram Username [s.nekota]