Hatena::ブログ(Diary)

think and error このページをアンテナに追加 RSSフィード

2008-11-22

Vim講座1

21:17 | Vim講座1を含むブックマーク



テキストエディタであるvimはとても扱いやすいのだが、Vimてモード概念があって敷居が高い(誤用)よね。ということで少しだけ書いてみる。

こんなサイトもあるわけなのだけど、これ不便。普段使わないものまで全て書いてあるからだ。

初心者にとっては、どこまで知ればミニマルなのかが知りたいというのに。


概要

  • モード概念
  • カーソル移動
  • インサートモードへ
  • 保存

////////////基礎終了////////////

  • ビジュアルモードとコピペ
  • ジャンプ
  • 置換
  • Undo,Redo[***IMPORTANT***]
  • 一文字置換

こうやってみると長そうだね.




モード概念

モードは4つ。ノーマルモード、インサートモード、ビジュアルモード、コマンドモード。

ノーマルモード起動したときはこのモード。移動とかコピペとか行う。このモードに戻るには常にESC。
インサートモード挿入モード。このモードでないと文字が打てない。
ビジュアルモードいわゆる選択モード。選択範囲をコピペとかするわけだ。
コマンドモード画面下にある1行に入り込むモード。保存や終了をはじめ、様々なコマンドを打てる。

モードは主にノーマルモードとインサートモードを使う。

モードの切り替え方は以下。他にも切り替え方はあるが、省略した。

f:id:ruicc:20081116194531p:image

見ればすぐわかるがNormalじゃなくてNomalになってる。typoだ。気にすんな。それはともかく、見れば、Normalモードへの切り替えは常にESCである。それゆえ、Vimを使うものはESCキーボードの手元へ持ってこなければならない。無変換あたりに割り当てるといい。

//C-[またはC-cもESC相当として使えるようです。




カーソル移動(Normal mode, Visual mode)

ノーマルモード、ビジュアルモードでの移動は次の通り。

コマンドモード、インサートモードでの移動はカーソルキーのみ。

j
k
h
l

なんでjkl;じゃないかといったら、vimでは上下移動が重要であるからだ。だから一番おしやすいj,kに割り当てている。

f:id:ruicc:20081116201514p:image




インサートモードへ(Normal mode)

インサートモードへの切り替えは、まず4つ覚えるべきだ。i,I,a,Aの4つ。

iinsert modeへ
aカーソルの右からinsert modeへ.appendの頭文字.
I行頭へ移動してinsert modeへ
A行末へ移動してinsert modeへ

なんとインサートモードへの切り替えと移動を兼ねているわけだ。だから左右より上下の移動のほうが重要になる。

絵で表すとこんな感じ。やはり絵的に見ないと覚えにくいからな。

f:id:ruicc:20081116201114p:image

そのうち文頭にI,文末にAが浮かんで見えること請け合いだ。




保存(Normal mode, Command line mode)

保存ができなければ意味がない。

保存、上書き、終了には:(コロン)を押してコマンドモードへ移行してから行う。

だけど、まずはコロンを含めたコマンドだと覚えたほうがいい。


:w上書き保存
:w xxx.txtxxx.txtと名前を付けて保存
:qvim終了
:wq上書き保存して終了
:q!強制終了
:w!強制保存
:wq!強制保存後、終了
ZZ上書き保存して終了(コロンはいらない, :wqと同じ)
ZQ保存せずに終了(コロンいらない, :q!と同じ)

! は強制を意味する。rubyのメソッドに使われる ! と同じような意味。

恐らくまつもとゆきひろさんはvim使いなんですよたぶん違うけど。




ビジュアルモードとコピペ(Normal mode, Visual mode)

ここまでで一応エディタとして機能するが、しかしお粗末すぎる。

コピペとか削除とかできないと。そのためにはまずはビジュアルモードを理解せねば。

vビジュアル(選択)モードへ
V行選択モードへ
Ctrl+v矩形選択モードへ

ビジュアルモードに入ったならば、hjkl等で移動。

こんな感じ。

f:id:ruicc:20081118223448j:image

見ればわかるが,矩形選択オススメ.


移動して選択したならば、基本はコピペ。

y選択範囲をコピー。yankの頭文字。
d選択範囲を削除。deleteの頭文字。
pvimのクリップボードの中身をペースト。pasteの頭文字。

vimに削除はない。削除と書いてあるものは、実質Cut(削除してクリップボードに保存)と同じだ。

ビジュアルモードを使わないコピペコマンドは以下。

x一文字削除
dd一行削除
yy一行コピー
Dカーソル以降削除
p行のとき(dd,yyの後のペースト)は現在の行と次の行の間にペースト。範囲のときはカーソルの右側にペーストする。

さらに、これはコピペコマンドに限らないのだが、vimではコマンドの前に数字を打つと、その回数分だけコマンドが繰り返される。

つまり、

3dd

と打つと、そのカーソルのある行から3行が削除され、クリップボードに保存される。便利。


ジャンプ(Normal mode, Visual mode)

移動を一々hjklでやっていたら日が暮れてしまう。では効率のよい移動方法を。

まずは検索によるジャンプ。

/xxxxxxを検索する
*カーソルのある場所の文字列を検索

検索するとマッチした文字列がハイライトされる。そこに飛びたいとき。

n検索にマッチした、次の文字列へ
N検索にマッチした、前の文字列へ

これだけでかなり違う。/の後には正規表現も使える。


他の主につかう移動コマンド。

w次の単語の先頭にジャンプ。wordの頭文字。
b前の単語の先頭にジャンプ。backward wordの頭文字多分。
^文頭にジャンプ
$文末にジャンプ
Ctrl+bPageUp。Backwardの頭文字
Ctrl+fPageDown。Forwardの頭文字
Ctrl+u半ページUp。Upの頭文字
Ctrl+d半ページDown。Downの頭文字
ggでファイルの初めにジャンプ
Gファイルの終わりにジャンプ

場所に関するジャンプまとめ。

f:id:ruicc:20081116213313p:image




置換(Normal mode)

置換くらいできないと。

:s/aaa/bbb/gカーソルのある行のaaaをbbbに置換する。
:%s/aaa/bbb/g文章全体のaaaをbbbに置換する。
(範囲選択後に):s/aaa/bbb/g選択範囲のaaaをbbbに置換する。

基本はこれ。:の後の%は文章全体を意味する。正規表現使用可能。ただ、なぜかvimの正規表現は少しだけ違うので注意しなければならない。理由不明。



Undo, Redo(Normal mode)

Vimは未知のコマンドが沢山あるため、変なところを押してしまったら直せるようにする必要がある。

Vimの習得上、恐らく最も重要なコマンド。

uUndo。保存コマンド数は忘れた。1000位は余裕のはず。
Ctrl+rRedo

何故 u に対し Ctrl+r という非対称な形をとっているのか。それはrに便利なコマンドがあるためだ。




一文字置換(Normal mode)

文字を変更するのにインサートモードに入らなければならないVimにとって,1文字置換は重要.

r一文字置換。rxと押すと、カーソル上の文字をxに置き換える。replaceの頭文字。
R連続の一文字置換。Shift+rを押した後に文字を入力していくと、入力数に応じてその後の文字が置換される




基本の終わり

おそらく慣れるのに1週間くらいかかると思う。

しかし慣れた後は快適だ。

Emacsは機能がたくさんあって便利だけど、テキストエディタとして見たらキーが覚えにくて使いづらい。vimは操作感が好きだね。


ついでにこれおいとく。

vimperatorとはfirefoxアドオン。vimのようにブラウジングができるようになる。

vimに慣れたらどうぞ。


あとfiler(Dyna, Afx, DF等)をvim仕様にするとこれまた便利。



//なんかしらんけど絵が人気らしいんでVisualモードの絵を描いてみました.

//Vim講座2として書いておいたUndo,Redoと1文字置換を加えました.

//あとでVim講座2をまた別に書きます.

//Vim講座1概要を加えました.

//Vim講座3を書きました。

teruyastarteruyastar 2008/11/16 23:36 コードはFlexでかけというのか!
いやしかし、、、
俺はプログラマーとは違うんだ!!


でもコード書くには確かに便利だし、、
xkeymacsを、高速なPCだったら普通に使えるかな?
FlashCS3とは重すぎて相性が悪かったが、
CS3キーバインドを編集しなおしてでも使うべきか?


、、、今は書くコードが少なすぎる。
そのうち打つ方が限界を迎えたら移行することにしようw

kaerusanukaerusanu 2008/11/16 23:52 上の23歳のプログラマの話。
恐らく彼はタイピングがボトルネックではないと思っていたのだろう。
どれだけCtrlが打つのが早くなっても他の部分が、早くならなければそんなものは必要がないと考えていたのだろうと思う。自分がそうだったからよくわかる。
必要がないと思うものはいらないとおもう。

今の3〜10倍プログラムをするのが早くなる方法を教えればいいだろう。手が死ぬから自然とそういうものが必要になる。必要にならなければ人間は動かないものなのでしょう。

hamastahamasta 2008/11/17 01:17 これはいい絵ですね脳イメージを投射したような感じだ

vimはチュートリアルがついててあれが素晴らしい
チュートリアルのあるなしで、とっつきやすさが全く違う

teruyastarteruyastar 2008/11/17 12:45 変態キーボードやってたら、
今度は矢印が遠くなって、、、

再びXkeymacsに朝鮮!

1年前にあきらめたのは、
ウィンドウズショートカット、
Flashショートカット、
マウス登録ショートカット、
のこれら全部を書き換えねばならず
現実的ではないと思えたため断念した。

しかし、今の俺ならできる!!
2−3にち、出力落ちるがその後は、、、
もうなんかいろいろおかしいw

ruiccruicc 2008/11/17 15:54 >teruyastar
ですよね.Flasherには勧められません.しかしFlexerにもなれば何の問題もない!!

>kaerusanu
むう.コメントが的確過ぎる.確かに説得の方向を間違っていたかもしれない.ニーズがなければ恐らく無理だろうとはわかっていたが,その気付かせる方法がわからなかった.今なら気付かせるくらいはできるだろうか.

>hamasta
実はVim使いだったんですか!
確かにチュートリアルやればいい気もしますね.
:Tutorial

>teru
えーと.俺も負けないぜ!

eclipse-aeclipse-a 2008/11/17 19:34 最低限これだけ知っていれば……という線を引くのは難しいかもしれません。

ただインサートモード開始に関して、私の感覚では、置換にあたる s や c を削ったとしても o や O を削るのには違和感があります。ビジュアルモード開始の V を削る理由もよくわかりません。ビジュアルモードの c があるのもわかりません。

どうせ o や O を削るなら I や A も削っていいように思います。 0 や $ と組み合わせれば i と a で事足りると思います。

:h inserting
:h visual-start
のあたりを参照するといいかもしれません。

最低限……という線を引くなら「メモ帳にある機能をカバーする範囲で紹介」なんてのがいいのかもしれませんね!

hogehoge 2008/11/17 20:00 ミニマムだけだと別に vim でなくてもいいような気が。
vim の良さはそこには何もない訳で。デフォルトの vi で充分かも。

ruiccruicc 2008/11/17 21:04 >eclipse-e
そうですね、oとOは俺もよく使います。まあ続きも書く予定だったので後で加えればいいかなー、て思ってました。
ヴィジュアルモードのcは気まぐれで入れただけです。確かにわかりにくいんで消しました。Vは俺が知らなかっただけなので加えました。便利ですねこれ。普段はdd等でやっていたので。

>hoge
まさしくviで十分ですね。しかし俺自身がvimから始めたので、正直違いがよくわからないのです。
あとvim講座というよりvim入門を目指してます。vimをやるにしてもこの辺の操作は抜かせませんから。

講師T講師T 2008/11/18 08:13 教育機関でLinuxなどを教えている者です。ご参考になるか分かりませんが。
エディタの場合(vimに限らず)「最低限」はともかく「超最低限」のラインは実は明確です。
カーソル移動・入力・削除・保存&終了 です。これだけできれば、理論的にはどんなテキストの編集も可能です。コピー&ペーストや検索&置換は(通常「最低限」の機能には含むと思いますが)「使えると便利な機能」になります。
そんなわけで私はまず最初に、カーソル移動(h,j,k,l)、入力(a,i)、削除(x)、保存&終了(:w,:qなど)だけ教えています。ただし、vimの場合はそれに加えてJ(行連結)が入ります(xでは改行が削除できないので、うっかり改行してしまったときに修正できないのです)。
その状態で10行程度のテキストを入力させて、その後このページにかかれているような機能の紹介に入ります。
vimでなくていいとのご指摘もありましたが、えてして「最低限」とはそんなものです。vimの「魅力」を伝えるのはその後でも十分だというのがruiccさんのお考えでしょうし、私も賛成です。
絵が入っているのはとても気に入りました。自分が教えるときの参考にさせてもらうかも。

bsheepbsheep 2008/11/18 10:31 normalモードに戻る時は【ctl+[】でいいと思います
いつもキー配置を換えられる環境とは限りませんし

orangevtrorangevtr 2008/11/18 13:12 ブクマにも書いたんですけど、vimバージンの方はまずvimtutorってコマンド打つといいですよ。

基本的な操作をツアー形式で操作しながら覚えられます。30分くらいできるはず。

Emacsにもありますよね。(M-x help-with-tutorial)

ruiccruicc 2008/11/18 13:54 >講師T
「ミニマル」と書きましたが,確かに適切ではないかもしれません.ただの私的な感覚ですので.ただ,本当に最低限だけしか教えないと,使いづらいエディタと思われて終わってしまうような気がします.
Vimの入門ページはいくつかあるのですが,Vimを覚えるのに文字だけというのは分かり辛いだろうな,と思っていました.Vimの画面を見たときに思い出せるように伝えることが出来れば良いな,と思います.

>bsheep
おお,そんなコマンドが!HHKpro(USキーボード)でESCをどうしたらいいもんかとずっと悩んでいました.ありがとうございます.

>orangevtr
:Tutorialですね.このエントリを書いたあとに指摘されて 思い出しました.自分でVimを習得しようとするときには確かにそれで十分だと思います.ただ,人に勧めるのに:Tutorialやっとけよ,というのは少々乱暴な気はしますね.このエントリは,とある人にVimを勧めるために書いたエントリなのです.

orangevtrorangevtr 2008/11/18 18:24 なるほど、失礼しました。何事も状況と相手次第ですよね。

いずれにしても手を動かすのが一番早いと思います。

yamataka548yamataka548 2008/11/18 19:11 この記事いいですね。これでvimユーザーが増えるとうれしい。

ところで、指定した行番号へ移動するコマンド、<数字列>G は書いてないのかな?(見落としていたらすいません)
コンパイルエラーになった行番号に移動するときによく使っています。
例えば 100G とすると、100行めに移動します。

あと、:set number と :set nonumber で行番号の表示/非表示を切り替えられます。

janeirojaneiro 2008/11/18 20:52 一文字間違えたときに r は良く使うぞい。
単語を書き換える時には cw が便利だぞい。

d0id0i 2008/11/18 22:00 viを初心者に教えるときの問題は、モードが見えないことのような気もします。どっかのdistributionのvimがモードを最下行に表示するのがdefaultになってた気もしますが...

ところで、uも個人的には必携ですね。

ruiccruicc 2008/11/18 23:39 >orangevtr
そうですね,これを見てVimに触ってくれる人が増えてくれると嬉しいです.Vimへの関心を持つ人がたくさんいるらしいですし.

>yamataka548
正直そこまでいいエントリとは思えませんのですがVimユーザ増えてほしいですね.
<数字>Gの情報ありがとうございます.そのコマンドをずっと探していました探してないのですが.次回のエントリに加えさせていただきます.

>janeiro
Vim講座2に書いておいたのですが,誰も見なそうですのでこちらに移動しておきました.
俺はciwを良く使いますね.カーソルが単語内のどこにあっても全部消してくれるのが良いです.

>doi
そうなのですか?
winのVim,kaoriya版はデフォルトで表示されますし,Ubuntuも同様ですね.viは表示されないかもしれませんが.viはむしろ初心者には勧められない気がします.
uは確かに必須ですね,忘れてたので講座2に書いたのですが,こちらに移動しました.

>なまえ
関係ないコメントのため削除させていただきます.

tenkomatenkoma 2008/11/19 00:37 > normalモードに戻る時は【ctl+[】でいいと思います
【ctrl+c】もありますね。僕はesc → ctrl+[ → ctrl+cの順番に知ったのですが、実際使うときはバラバラに使ってます。

ruiccruicc 2008/11/19 08:55 >tenkoma
WinのKaoriya版,Ubuntuで確認しましたが,確かにC-cもESCに相当しますね.
追加しておきました.

とおりすがりとおりすがり 2008/11/19 11:28 emacsユーザのvimの昔からの疑問

どうやって日本語を入力するの?

ローカルのXならkinput2など?
では、sshでリモートに入った場合のvimは? windowsなどローカルの入力システムを使って入力? リモートでの入力システムあり?

ここがわからず、設定ファイルをいじる以外にあまり使わないvim... 文字化けすることも多くて、すぐに直せないから、結局emacs。

TransFreeBSDTransFreeBSD 2008/11/19 17:35 "P"はどうでしょうか。初心者としてはPが一般的なペーストの動作なので外せないと思います。

なまえなまえ 2008/11/19 23:06 プログラムを書くならgg=Gで全体再インデントは感動すると思います。
これを知ってvimを使うようになりました。

ruiccruicc 2008/11/20 00:23 >とおりすがり
LinuxはUbuntu8.04を使っていますが,標準で入っているAnthyをそのまま使っています.
sshは少々自信がないですが,少し動作を確認したところ,sshのリモートでもローカルのIMEを使っているようです.また.vimrcをいじってみたところ,どうやら次の設定が必要なことがわかりました.
>>
set encoding=utf8 "これは必須
set fileencoding=japan
set fileencodings=utf8,iso-2022-jp,sjis,euc-jp
<<
しかしどうやらこれで十分ではないようです.端末が日本語対応していなけれならない,.bashrcにも何か書かなければならない等色々あるらしいのですが,どこまで設定すれば必要十分であるのかは分かっていません.自分もリモートでは日本語は使わないようにしている状態なのです.
申し訳ありません.vimをプッシュする良い機会だったのですが・・・


>TransFreeBSD
確かに一般的にはPのほうが自然に見えますね.うっかりしていました.次回にフォローを入れようと思います.


>なまえ
素晴らしい.感動しましたw
emacsにもあったのでvimにもあるだろうなー,と思いながら矩形選択の一括挿入で済ませていました.ありがとうございます.
Vimの情報がこうやって集まるのはうれしいですね.