すべての基本,カーソル移動

はじめに

カーソルを移動させるコマンドは,かなりたくさんあります
基本的には h , j , k , l さえあれば,理論的にはどこにでも移動できる はずです
「なんでこんなにいろいろな種類があるの〜?」と思うかも知れません
なぜかというと, JVim(Vi)では,カーソル移動コマンドは, 「ただ単にカーソルを速く移動できるための手段」 では無くて 「いろいろなコマンドを適用する対象(範囲)を指定する手段」 でもあるの です. これがどういう意味なのかも説明します

h,j,k,l だけでもこんなに使える

まず最初に,基本中の基本ですが 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%の位置にジャンプ」という意味です

数行の移動に便利なコマンド

上下の行へ,カーソルを移動させたい場合は jkの他にも
+ - というコマンドがあります. これらのコマンドで移動すると カーソルは「行の先頭文字」の位置に飛びます

また,画面に表示されている部分の真ん中あたりの行とか,上のほうとか下のほう などという感覚的なジャンプコマンドもあります
3H ならば,「表示されている画面の上から3行目」に飛べます
H のように数値を省略すれば「画面の一番上の行」へ飛べます

3L ならば,「表示されている画面の下から3行目」にジャンプ でき, L のように数値を省略すれば「画面の一番下の行」へジャンプできます

M は「表示されている画面の真ん中の行」へ飛びます

こんなにたくさん覚えなければいけないのか

今まで解説したものの他にも,まだまだカーソルを移動させるコマンドは多くあります
何故,Viにはこんなにもたくさんの移動手段があるのかというと 「これらのコマンドは 移動のためだけに使うわけではない から」です

多くのコマンドでは

の二つの要素を指定しなければいけないわけですが, JVimでは 移動関連のコマンドは 他のほとんどのコマンドを使いたい時に「操作対象となる部分を指定するのに使う」 のです

例えば「削除」するコマンドを使いたいとします
Vi(JVim)では,削除するコマンドは d という文字なのですが,"d"だけを打っても 削除を どの範囲に適用すればよいかを知らせなければ 実行できません

実際に削除コマンドを使う例を出します, 使い方を観察してみましょう

d$

だと,「カーソル位置から行末までを削除」します

d0

だと,「カーソル位置から行頭までを削除」します

d5l

だと,「カーソル位置から 後5文字を削除」します

dff

だと,「カーソル位置から,最初に見つかった"f"の文字までの範囲を削除」します

d3H

だと,「カーソル位置から,表示されている画面の上から3行目までの行を削除」します

…というわけで,どれも

d[カーソルを移動させるコマンド]

のように使うと, 「カーソルの位置から,コマンドで移動するはずの目的地」 までの範囲 を削除することになってます

削除以外の他のすべての操作でも,この形式は変わらないように作られているので どの操作をする場合でもカーソル移動コマンドを打つわけです. ですから, JVim ( Vi ) を 使う上では,カーソル移動コマンドは非常に重要なのです. 知っていれば知っているほ ど ,自分の思った部分を一瞬で操作できるようになります. 応用は, いくらでも 可能というわけですね

[応用例]
括弧の文字の上にカーソルがある時に

d%

だと,括弧とその中身を一瞬にして削除できます

d3$

だと,「カーソル位置から行末までと,後2行のすべてを削除」します

d3j

だと,「カーソルのある行を含めて後ろ3行を削除」します
さっきの説明だと, カーソルの手前の文字と, 三行目のカーソル移動目的地よりも後ろの 部分は削除されないのではないかと思う人もいると思いますが, 実際は三行すべてが 削除されます . 何故なのか詳しくは別文章で説明しますが 一応簡単に説明する と, j コマンドは 行指向(linewise) で作用するものだからです

同様に d+ d- も, 現在行と上や下の行の二行がまるごと削除されます


前項目, 「超最低限のコマンド解説」へ

目次へ

次項目, 「文字の削除と変更コマンド」へ