引っ越しました。5sec後に移動移動します。 飛ばない場合はここをクリック

Chaostic Page    > Home > ChaosticPage > Documents > UNIX関連 > vi(m) 入門 カウント
lb bl bl
■ Contents Menu rt
rl
+をクリックで開きます rl


rl
lbbl bl rb




rt
CoryRing  次へ  前へ  コリドラスWebRing

fuguRing
rl
lbbl bl rb
rt

ファイルの操作

ファイルの読み書きには次のようなコマンドがあります。

:e filename filenameを開く
:w 上書き保存
:w! 上書き保存(強制)
:w filename filenameで保存
:w>>filename filenameに追加保存
:1,3w filename filenameに1行から3行までを保存
:q 終了する
:q! 保存せずに終了する
:wq 保存して終了する

文字列の入力

テキストは以下のコマンドで入力できます。

a カーソルの後ろに文字を入力(append text)
A 行末に文字を入力(append の強力版?)
i カーソルの位置に文字を入力(insert text)
I スペースを除く行頭に文字を入力
gI 行頭に文字を入力
o カーソルの位置に行を作成し文字を入力(open new line)
O カーソルの下に行を作成し文字を入力(open new line)

これらのコマンドを入力すると 挿入モードになり文字の入力が可能になります。 挿入モードから抜けるには

<ESC>
CTRL-[
CTRL-C

のどれかでできます。一般的には<ESC>ですが キーがきかなかったりする場合は他ので抜けるといいと思います。


画面のスクロール

画面のスクロールには次のようなものがあります。

CTRL-U 画面半分上にスクロール
CTRL-D 画面半分下にスクロール
CTRL-E 一行上にスクロール
CTRL-Y 一行下にスクロール
CTRL-F 一画面上にスクロール
CTRL-B 一画面下にスクロール

編集 --文字の削除(カット)--

編集関係のコマンドはたいていカーソル移動のコマンドと 組み合わせて使うことができます。文字の削除は

dw カーソルのあるところからその単語の終わりまで削除
de カーソルのあるところからその単語の終わりまで削除
d$ カーソルのあるところから行末まで削除
d^ もしくは d0 カーソルのあるところから行頭まで削除
dd カーソルのある行を削除

でできます。dwを例に取ると 今あるカーソルの位置からwで移動するところまで 削除せよという命令になります。それさえわかれば dw,deの違いもわかると思います。 またd2wで二つの単語を削除する事もできます。 さらにd2j下の二行を削除することができます。 カーソルの移動と同じですね。

上のことさえわかればたいていの削除がスムーズに できる思うのですがいくつかのよく使う組み合わせには ショートカットが定義されています。

x dlと同じ カーソルのある一文字を削除
X dhと同じ カーソルのある左の一文字を削除
D d$と同じ

xなどはよく使うと思うので 覚えておきましょう。


編集 --文字の変更(カット)--

編集関係のコマンドはたいていカーソル移動のコマンドと 組み合わせて使うことができます。文字の変更は

cw カーソルのあるところの一単語文を削除後入力
ce カーソルのあるところの一単語文を削除後入力
c$ カーソルのあるところから行末まで削除後入力
c^ もしくは c0 カーソルのあるところから行頭まで削除後入力
cc カーソルのある行を削除後入力

でできます。cwを例に取ると 今あるカーソルの位置からwで移動するところまで 削除し入力せよという命令になります。 ChangeWordの略だと思えば覚えやすいと思います。 またc2wで二つの単語を削除する事もできます。 さらにc2j下の二行を削除後入力することができます。 カーソルの移動と同じですね。入力し終わったら入力モードから 抜けるために<ESC>を押します。

このコマンドも削除と同じように いくつかのよく使う組み合わせには ショートカットが定義されています。

C c$と同じ
s clと同じ カーソルの文字を削除後入力
S ccと同じ


編集 ---便利な . ---

vi にはとても便利なコマンドがあります。

. 直前の編集を繰り返す

これを使うと効率的に作業できます。 例えばHTMLを編集していて(viのマニュアルから引用させてもらいました)

before<b>bold</b>after

の<b>...</b>を削除したいとします。 その場合

f< まずはじめの<を探します。
df> 次に>まで削除します。
f< その次の<を探します。
. 以前の編集すなわち次の>まで削除します。

で同じことを簡単に繰り返すことができます。


コピー(yank) & ペースト

コピペはエディタの基本ですね。 viでは削除dcをしたものを 記憶しています。したがってカットに相当するものはこれに なります。またペーストは

p カーソルの後ろにペースト
P カーソルのある位置にペースト

でできるので例えばddPとすれば カーソル行を削除してカーソルの位置にペーストされるので 文章は変化しません。 ddpとするとカーソルの行がカーソルの後ろに ペーストされるので結果として行が交換されます。

次にコピー(yank)について説明します。

yy 一行をyank
y0 または y^ カーソルから行頭までをyank
y$ カーソルから行末までをyank

どうでしょうか? これもカーソルの移動と組み合わせるだけなので 移動さえマスターすれば簡単ですね。


入力を助ける補完

vi には強力な補完機能があります。 これを知っているのと知らないので 使い勝手がかなり違うと思います。 これから説明する補完は挿入モードで利用します。

文中から候補を探して補完するには

CTRL-N 次の候補を検索
CTRL-P前の候補を検索

でできます。他にも補完する候補は検索できて 次のようになっています。

CTRL-X CTRL-Kdict(ionary)から補完
CTRL-X CTRL-F ファイル名から補完
CTRL-X CTRL-Iincludeファイルから補完
CTRL-X CTRL-]タグから補完
CTRL-X CTRL-Dマクロから補完(includeファイルも含む)

一度このキーを押して補完を始めたらあとは上の CTRL-N CTRL-Pで他の候補を検索できます。 またdictファイルの指定は変数dict を設定します。例えば :set+=filename でfilenameファイルを現在のdictに 追加できます。 これで任意のファイルを検索の対象にできます。


インデント関連

ここではインデントなどの空白に関係する ものを説明します。

:set expandtab タブを空白に展開します
:set noexpandtab タブを空白に展開しません
:set shiftwidth=4 インデントのサイズを4に指定します
:set tabstop=4 タブのサイズを4にします
:set autoindent オートインデントモードon
:set smartindent
:set cindent Cのインデントモード

インデントやタブは上のようなオプションで設定できます。 実際のインデントの変更は

<< インデントを一つ浅くする
>> インデントを一つ深くする

このコマンドももちろんカーソル移動と組み合わせることができて

<Gカーソルから行末までインデントを浅く
>1Gカーソルから行頭までインデントを深く
>3jカーソルから三行下までインデントを深く

とできます。


検索と置換

vi で検索するには/コマンドを用います。

/test testを前向きに 検索
/abc abcを前向きに検索
/abc\c abcを前向きに検索(大文字小文字を区別しない)
?test testを後向きに 検索
?abc abcを後向きに検索
?abc\c abcを後向きに検索(大文字小文字を区別しない)
n 検索文字列の次の候補を表示
N 検索文字列の前の候補を表示
* カーソル位置の文字列を前向き検索
# カーソル位置の文字列を後ろ向き検索
:set hlsearch 検索結果にハイライトをつける
:set nohlsearch 検索結果にハイライトをつけない
:set incsearch インクリメンタルサーチをする
:set noincsearch インクリメンタルサーチをしない

/のあとに検索文字列を書きます。 検索文字列として正規表現も利用可能です。 もし大文字小文字を区別しないのなら検索文字列の後に\c をかけば区別されなくなります。

置換は次のようになります。

:s/one/two oneをtwoに置換
:s/one/two/c oneをtwoに置換(確認あり)
:s/one/two/gc 同じ行全てのoneをtwoに置換(確認あり)
:%s/one/two/g ファイル内全てのoneをtwoに置換
:%s/one/two/gc ファイル内全てのoneをtwoに置換(確認あり)

sはsubstituteの略です。
はじめの/の後ろに検索文字列を書き 次の/の後ろに置換文字列を書きます。 最後の/は省略可能ですが 一つ以上置換する場合はgを、 確認を求める場合はcを書きます。 またファイル全てを置換の対象にする場合は %sの前に書きます。


バッファについて --複数ファイルの編集--

複数ファイルを操作するにはバッファを使います。 バッファには三つの状態があります。

active ファイルが読み込まれバッファが見える状態。
hidden ファイルが読み込まれているがバッファが見えない状態
inactive ファイルも読み込まれていなくてバッファが見えない状態だが一回読まれたことがある状態

バッファの状態をみるには :buffersもしくは:ls コマンドを利用します。 このリストで%は今表示されているバッファを示します。 また#がついているバッファは CTRL-^もしくは:e #で 切り替えることができるバッファです。

vi はデフォルトだと新しいファイルを開くときに カレントバッファ(今編集しているバッファ) がactiveからinactiveに変化します。 したがって編集中のファイルは保存しないと 変更内容は破棄されてしまいます。 変更内容を保存しなくてメモリに残したままにする つまりカレントバッファを activeからhideへ変化させるためには :set hidden とします。 これで新しいファイルを開くときに カレントバッファはactiveからhideに 変化して変更内容は保存しなくても破棄されなくなります。

次にバッファを自由に移動するコマンドを紹介します

:bn 次のバッファに移動(buffer next)
:bp 前のバッファに移動 (buffer prev)
:Nb N番目のバッファに移動
:bd バッファを削除

画面分割して効率アップ

vim では他のエディタ同様画面分割ができます。 画面分離関連のコマンドは CTRL-Wからはじまるので覚えやすいかも...

CTRL-W s 画面を縦に二分割する(split)
CTRL-W v 画面を横に二分割する(vsplit)
CTRL-W n 画面分割し新規ファイルを作成
CTRL-W ^ 画面分割し#がついているバッファを表示
CTRL-W c カレント画面を閉じる(close)
CTRL-W q カレント画面を閉じる(quit)

次に分割画面を移動のしかたを書きます。

CTRL-W j 下の画面に移動する
CTRL-W k 上の画面に移動する
CTRL-W h 左の画面に移動する
CTRL-W l 右の画面に移動する
CTRL-W w 次の画面に移動する
CTRL-W W 前の画面に移動する

ほとんどカーソルの移動と同じですね。


ハイライトの設定

ハイライトの設定をここでは説明します。

:set highlight ハイライトを設定する
:set nohighlight ハイライトを解除する
:syn on 構文ハイライトを有効にする
:syn off 構文ハイライトを無効にする
:set filetype=c cのシンタックスでハイライトする
:set filetype=html htmlのシンタックスでハイライトする

自動的にハイライトのタイプが設定されなかったら :set filetype=xxxのように設定すると いいかんじにハイライトとされます。


マクロを使って快適に

Emacsや秀丸同様にviでも マクロを使うことができます。 マクロをつかうと自分がした作業の繰り返しが 記録できるので作業効率が劇的に上がります。

マクロの使い方を説明しますと

qa aにマクロ記録の開始 (したにrecordingと表示される)
q マクロ記録の終了 (recording が消える)
@a aというマクロの再生

上のaの部分は任意のアルファベットを 入力してください。

次に例を挙げて説明します。いまから10行分 行の先頭に//を入力したいとします。 この場合以下のようにできます。

qb bにマクロ記録の開始 (したにrecordingと表示される)
^ 行頭にカーソル移動
i 入力モードに入る
//<ESC> //を入力し終了
j 一行下へ
q マクロ記録の終了 (recording が消える)
9@b bというマクロを9回の再生

Visualモード

vimにはVisualモードがあります。 このモードは範囲指定していろいろなことができます いわゆる範囲指定のことです。

v Visualモード開始,終了

vでVisualモードをon,offできます。 Visualモードの時にカーソルを動かすと 選択した文字列が反転します。 そしてdx削除、yでコピー ができます。


ネットワーク上のファイルの編集 (ftp http など)

vi はftpのファイルなどを直接編集することができます。
ftpの場合以下のようにファイル名を指定します。

ftp://hostname/file ftp://hostname#port/file

ftpパスワードなどは接続時に聞かれます。 ここで注意するのはftpの場合ログインするディレクトリからの パスになるところです。

この機能を使うとネットワーク上のファイルを まるでローカルファイルのように扱うことができて けっこう便利です。

さらに編集中のファイルにネット上のファイルを 挿入するには

:Nread ftp://... :Nread http://... :Nread scp://... :Nread rcp://...

でできます。 ftp以外にも様々なプロトコルに対応しています。


fold (インデントされた行を隠すみたいな・・・)

vim ではインデントされた行を隠したりすることが できます。これを利用すればプログラムなど を書くときに全体を見渡しやすくなって かなり便利だと思います。

はじめに fold する時の方法としてどのようなものが あるか説明します。fold のタイプは :set foldmethod=manualのようにするか :set fdm=manualのようにすることで 選択できます。

manual 手動でfold レベルをきめる
indent インデントの数をfold レベルにする
expr foldを定義する式を指定する
syntax 構文強調によりfoldを定義する
diff 変更されていないテキストをfoldとする
marker テキスト中の印でfoldを定義する

はじめにすべてのタイプで必要になる fold の基本操作を説明します。 foldコマンドはzではじまるので覚えやすいかもしれません。

zi foldenable をトグルで on off する
zc fold を閉じる(close)
zC fold を再帰的に閉じる(close)
zo fold を開く(open)
zO fold を再帰的に開く(open)
zr foldlevel をインクリメント、 すなわちすべてのfoldを1level開く
zR foldlevel を最大値にする、すなわちすべてのfoldを開く
zm foldlevel をデクリメント、すんわちすべてのfoldを1level閉じる
zM foldlevel を0にする、すなわちすべてのfoldを閉じる

これくらいで十分だと思います。

次にmanualmarkerの際に必要になるコマンドを説明します。

zf4j fold をカーソルから4行分設定する
zf`a fold をカーソルからaのマーク位置まで設定する
zd 設定された fold を削除
zD 設定された fold を再帰的に削除

markerの場合はfoldを設定すると 文中にfoldのマークが挿入されます。その際デフォルトだと マークの前後にC言語のコメントが挿入されます。(/*{{{*/のように) しかし場合によっては他のコメント形式がよかったりする場合が あります。そのときはcommentstringを変更します。

set commentstring=/*%s*/ C言語のコメント形式
set commentstring=\%%s texのコメント形式
set commentstring= コメントなし

つまり上の%sの部分がfoldのマークに置き換わったものが 挿入されると考えればよいと思います。

次にmanualの場合ですが、この場合内部的に処理されるだけなので 文章を保存しただけだと 一回終了してしまうとfoldの設定が消えてしまいます。 したがってmanualの時foldの設定を 保存する必要があります。

:mkview 設定した fold を保存(manual時)
:loadview 設定した fold を読み込む(manual時)

fold (対応する括弧で行を隠してみる)

前節でfoldの基本操作を説明しました。 ここではCなどで関数を開いたり閉じたりするための 設定を紹介します。

:syn region myFold start="{" end="}" transparent fold
:syn sync fromstart
:set foldmethod=syntax

これで対応する括弧をfoldの対象にする事ができます。 また閉じすぎるのを防ぐためにfoldのレベルを指定すると いいと思います。

:set foldnestmax=3 fold のネストレベルを3にする
:set fdn=1 fold のネストレベルを1にする
rl
lbbl bl rb

Powered by Zope 当ホームページ上の情報は無保証です!
ご意見・ご感想・ご質問はこちらまで↓
E-Mail: webmaster@chaostic.noexistent.com
Copyright(C)2002 loatbell, All Rights Reserved.