カーソルを移動させるコマンドは,かなりたくさんあります
基本的には h , j , k , l さえあれば,理論的にはどこにでも移動できる
はずです
「なんでこんなにいろいろな種類があるの〜?」と思うかも知れません
なぜかというと, JVim(Vi)では,カーソル移動コマンドは,
「ただ単にカーソルを速く移動できるための手段」 では無くて
「いろいろなコマンドを適用する対象(範囲)を指定する手段」 でもあるの
です. これがどういう意味なのかも説明します
まず最初に,基本中の基本ですが
5h なら, h を5回押したのと同じ効果があります. つまり瞬間的
に5文字分戻れるわけです. 同様に
80j とするだけで「現在行の80行後ろに移動」できます
行番号でジャンプするコマンドを(まだ)知らなくても,ファイルの先頭にいってから
55j
などと打てば,ファイルの56行目に移動できますし, 行の先頭で 30l と
すれば,行の先頭から30文字目にカーソルを移動できるということです
カーソルをちょっと遠い場所に移動させるのに, h j k l キーを押しっぱなしに
していませんか ? ちゃんとした移動コマンドをまだ覚えていなくても 9j と
か, ちょっとした数字を打ちながらカーソルを進めるだけでも Viの感覚に慣れるための練習になります
まず,行の先頭に行くコマンドは
0 (数字のゼロ)です. ゼロを押した瞬間に行の先頭にカーソルが動きます
同じ「行の先頭」でも,行頭に空白がいくつかあって「行の最初の文字のある場所」
に行きたいことがあります
^ を押せば,行頭の空白を無視して「行の先頭文字」にカーソルが移動します
逆に行末に行くには $ です. 数値をつけて 5$ と打て
ば,「(数値)行目の行末」に移動できます
行の先頭から一定の距離の場所に移動したい場合は
20 | と打つと,その行の20文字目の場所にカーソルが移動します
漢字などの文字は 一文字の幅が半角文字二つ分なので 2 として移動します
純粋に「文字の数」の分だけの移動をしたい場合は
020l つまり,「最初にゼロを打って行頭に移動
してから」「"20l"で20回 l で文字移動」という風に移動できます
普段,カーソルを移動させたい時は,あまり「〜行目の〜文字目」なんて風には
考えないですよね. こんな時には, 数値で移動させるよりも目的地にある文字を
打てばそこに移動するコマンドが便利です
カーソルのある行内で「ここの" f "という文字の所に移動させたい」と思ったら
ff
と打った瞬間に,カーソルは"f"の上にいます
f(文字) というコマンドは, 何か文字をひとつだけ指定して, カーソル
の後ろを探しにいって文字が見つかればその文字の場所にカーソルを移動させます
探す範囲は,カーソルの位置から行末までで, 文字が見つからなかった場合は何も
しません. たとえば
fE なら,大文字の"E"という文字の場所に,
f. なら,"."(ピリオド)の場所にカーソルを移動させます
でも,もし目的地の" f "の場所の 手前にも" f "の文字があった場合は , そこ
に移動してしまいますね. こういう時には 再びffと打たなくても ; つま
り(セミコロン)を打つだけで, 直前に使った文字を再び探して移動します. これ
なら, 同じ文字が多くても安心です
; を連打しすぎて目的の場所を行き
過ぎてしまったら , を打つと,逆方向に再移動してくれます
もし,カーソルが最初行末付近にあった場合には Ff の
ように 大文字の F というコマンドで, 逆方向(つまり前方)に文字を
探しに行きます. これも同様に ; や , で次々と文字を探して移動できます
普通,この f や F コマンドはViの解説本などを見ると「行内検索コマンド」の
ような名前がつけられていますが, 実際にはこのコマンドは 「検索」ではなく
て「移動」のためのコマンド です. 文字を手がかりにカーソルを「移動」させる
手段として多いに使いましょう
でも,上の例ではアルファベットの大文字や小文字ばかりで,日本語の文章では
役に立たないのかと思う人もいるかと思います
残念ですが,実際に漢字のある場所への移動は(できなくもないですが)英文字ほど
気軽にジャンプできません. 目的地やその近くに英文字や半角の記号のある場合に
使うのが良いと思います
よく使う例としては f" などのように引用符を手がかりにジャンプ
したり, 削除の目的地として使ったりします
JVimには括弧を特別に扱うコマンドがあって, 特にプログラムやスクリプトを書く場合に
便利に使えます
まず, % コマンドについて説明します. 普通は括弧の対応を調べるコマンドとして使い,
半角の括弧類, ( , [ , { , < , > , } , ] , ) の
いずれかの文字の上で % を押すと,対応する括弧を探してその場所に
移動します. 特にプログラムなどで何重にも入り組んだ括弧の対応が正しいか
どうかを調べる時に便利です
ついでに, % コマンドは括弧だけでなく,
/* と */ のようなC言語でのコメント開始と終了文字列の対応にも反応するし,
#if, #ifdef, #else, #elif, #endif といった Cプリプロセッサの識別子の対応 にまで
反応して移動できますので,プログラムを書く人には便利でしょう
特に括弧類のない普通の文字にカーソルがある場合に % を押すと,JVimは勝手に
文章の中で )がある場所を探しに行って,あればそこにジャンプします. その場で
もう一度 %を押せば,もちろん対応する(位置に行けますので
「とにかく(や)の近くに行きたければ % を押す」習慣をつけるのもいいですね
余談となりますが, 括弧の対応を分かりやすくする手段としては showmatch オプション
を設定するという手もあります. これは, 挿入中に括弧の文字を書いた時に
自動的に対応する括弧の位置にカーソルが一瞬だけ移動して 分かりやすくなるという
ものです. 詳しくはオプション解説を読んでみて下さい
% コマンドは 直前に数値をつけて使おうとすると,全く別の意味のコマンドと
なりますので注意が必要です. たとえば 40% というコマンド
は「ファイル全体の先頭から40%の位置にジャンプ」という意味です
上下の行へ,カーソルを移動させたい場合は jやkの他にも
+ や - というコマンドがあります. これらのコマンドで移動すると
カーソルは「行の先頭文字」の位置に飛びます
また,画面に表示されている部分の真ん中あたりの行とか,上のほうとか下のほう
などという感覚的なジャンプコマンドもあります
3H ならば,「表示されている画面の上から3行目」に飛べます
H のように数値を省略すれば「画面の一番上の行」へ飛べます
3L ならば,「表示されている画面の下から3行目」にジャンプ
でき, L のように数値を省略すれば「画面の一番下の行」へジャンプできます
M は「表示されている画面の真ん中の行」へ飛びます
今まで解説したものの他にも,まだまだカーソルを移動させるコマンドは多くあります
何故,Viにはこんなにもたくさんの移動手段があるのかというと
「これらのコマンドは 移動のためだけに使うわけではない から」です
多くのコマンドでは
の二つの要素を指定しなければいけないわけですが, JVimでは 移動関連のコマンドは
他のほとんどのコマンドを使いたい時に「操作対象となる部分を指定するのに使う」
のです
例えば「削除」するコマンドを使いたいとします
Vi(JVim)では,削除するコマンドは d という文字なのですが,"d"だけを打っても
削除を どの範囲に適用すればよいかを知らせなければ 実行できません
実際に削除コマンドを使う例を出します, 使い方を観察してみましょう
だと,「カーソル位置から行末までを削除」します
だと,「カーソル位置から行頭までを削除」します
だと,「カーソル位置から 後5文字を削除」します
だと,「カーソル位置から,最初に見つかった"f"の文字までの範囲を削除」します
だと,「カーソル位置から,表示されている画面の上から3行目までの行を削除」します
…というわけで,どれも
d[カーソルを移動させるコマンド]
のように使うと, 「カーソルの位置から,コマンドで移動するはずの目的地」 までの範囲
を削除することになってます
削除以外の他のすべての操作でも,この形式は変わらないように作られているので
どの操作をする場合でもカーソル移動コマンドを打つわけです. ですから, JVim ( Vi ) を
使う上では,カーソル移動コマンドは非常に重要なのです. 知っていれば知っているほ
ど ,自分の思った部分を一瞬で操作できるようになります. 応用は, いくらでも
可能というわけですね
[応用例]
括弧の文字の上にカーソルがある時に
だと,括弧とその中身を一瞬にして削除できます
だと,「カーソル位置から行末までと,後2行のすべてを削除」します
だと,「カーソルのある行を含めて後ろ3行を削除」します
さっきの説明だと, カーソルの手前の文字と, 三行目のカーソル移動目的地よりも後ろの
部分は削除されないのではないかと思う人もいると思いますが, 実際は三行すべてが
削除されます . 何故なのか詳しくは別文章で説明しますが 一応簡単に説明する
と, j コマンドは 行指向(linewise) で作用するものだからです
同様に d+ や d- も, 現在行と上や下の行の二行がまるごと削除されます