[viの基本操作] Copyright (C)1998,Moritaka Ogasawara. All Rights Reserved.
(注) ^F は [Ctrl]+[F] を意味します。
1. 開始/終了
(1)開始
# vi <ファイル名>
(2)終了/保存
:wq ... 保存して終了
:q ... 保存しないで終了
:q! ... 保存しないで強制終了
:w ... 保存して、viは終了しない
[参考]
:w >>ファイル名 ... 既存ファイルに追加書き込み
2. 入力
viには [入力モード]と[コマンドモード] があります。
(1) コマンドモード => 入力モード
i ... 現在のカーソル位置に挿入
a ... 現在のカーソル位置の次に挿入
o ... 行をカーソル下に追加
O ... 行をカーソル上に追加
(2) 入力モード → コマンドモード
[Esc]
(3) 上書き
R ... 上書き開始 (入力モードになります)
r ... 一文字だけ上書き (その後自動的にコマンドモードになります)
cw ... 一単語を上書き (入力モードになります)
3. 削除
x ... 文字削除(カーソル位置)
dd ... 行削除
D ... カーソル位置から行末尾まで削除
これらの操作は、同時に内部バッファに入ります。
[高度]基本はdで以下のバリエーションがあります
d$ ... カーソル位置から行末まで削除
d0 ... 行先頭からカーソル位置まで削除
dG ... カーソル行からファイル末尾まで削除
dw ... 単語削除
df<文字> ... カーソル位置から<文字>の現れるところまで削除
4. コピー
yy ... カーソルのある一行をコピー
[n]yy ... カーソルのある行から、[n]行をコピー (例)3yy:3行コピー
コピーされたものは内部バッファに入ります。
[高度]基本はyで以下のバリエーションがあります
y$ ... カーソル位置から行末までコピー
y0 ... 行先頭からカーソル位置までコピー
yG ... カーソル行からファイル末尾までコピー
yw ... 単語コピー
yf<文字> ... カーソル位置から<文字>の現れるところまでコピー(結構便利)
5. 貼り付け(ペースト)
p ... カーソル後方に張り付け(挿入)
P ... カーソル位置に張り付け(挿入)
内部バッファにある情報が挿入されます。
6. やり直し
u ... 直前の操作を元に戻す。
U ... 行全体に対する操作を元に戻す
7. カーソル移動
j ... ↓
k ... ↑
h ... ←
l ... →
0 ... 行の先頭に移動
$ ... 行の末尾に移動
^F ... 次ページ
^B ... 前ページ
^D ... 半ページ先
:0 ... ファイルの先頭に移動
G ... ファイルの末尾に移動
:[n] ... [n]行目に移動
8. 検索
/<文字列> .... 文字列を下へ検索
?<文字列> .... 文字列を上へ検索
n .... 次を下へ検索
N .... 次を上へ検索
9. 置換
全体置換
:%s/<変換前文字列>/<変換後文字列>/g
各行の初めに見つかったものだけ置換
:%s/<変換前文字列>/<変換後文字列>/
10. 直前の操作を繰り返す
. ... 直前の操作と同じことを行なう。(非常に便利で効率が良い)
[操作]は挿入でも削除でもなんでもOK
<使用例>
"111"を検索して確認しながら"222"に変換する。(前後にスペースがあると仮定)
/111[return]
cw222[Esc]
n.n.n.n.〜
----------------------------------------
[上級者向け]
1. 行マーク
'<文字> .... 現在の行に指定文字のマークをつける(栞のようなもの)
2. バッファ名指定コピー/貼り付け
"<文字><コマンド>
<例>
"ayy ... aというバッファに1行コピーする。
その後カーソル移動してp(貼り付け)する。
3. 削除バッファの番号指定取出し/連続取出し
"[n]p ... [n]番目の削除バッファ内容を張り付け
"1pu.u.[u.u.u.u.〜] ... 順番に削除バッファを取出す
4. 画面が壊れたら...
^L
5. ファイル読込み
:r <ファイル名> ... カーソル位置以下にファイル内容を読み込む
6. 外部コマンド実行結果読込み
:r! <外部コマンド名>
7. 外部コマンドに標準入力として指定範囲を渡して結果をその範囲に取り込む
:%! <外部コマンド名> .... ファイル全体を外部コマンドに渡す
:'a,.! <外部コマンド名> .... 指定範囲を外部コマンドに渡す
:'a,.! sort .... 指定範囲をソート
8. C言語開発者向け
(1)タグジャンプ
vi -t <関数名> ... 指定関数にタグジャンプする。
:ta <関数名> 事前にctagsしておく必要がある
<例>
# ctags *.c *.h
# vi -t XXfunc
:ta YYfunc
(2) 次の関数の先頭へ
]] ... 次の関数の先頭に移動
[[ ... 前の関数の先頭に移動
(3) 対応するカッコに移動
% ... カーソル位置のカッコに対応するカッコの場所に移動する
対応を確認する場合などに使用
8. 検索/置換時の正規表現
9. viの環境設定
(1) setオプション
:set all ... 現在の設定状況を見る
:set ai/noai ... 自動インデント(行合わせ) ON/OFF [autoindentの省略形]
:set showmode/noshowmode ... 現在の入力モードを右下に表示する
:set showmatch/noshowmatch .. 入力時、()/{}の対応を表示する
:set tabstop=[n] ... tabの移動幅を[n]にする。
(2) 起動時自動設定
~/.exrc にいろいろ書き込む
set xxxxx vi起動時に自動的にsetオプションを設定する
map xxxxx キーに文字列をマップする。
ソースの基本型などを入れておくと便利
:ab xxxx yyyy xxxx文字+[スペース/Esc]を入れるとyyyyに変る
.exrcの例
---
set autoindent autowrite noshowmatch wrapmargin=0 report=1 showmode
map :set wrapmargin=8
map {!}sort -b
map! A ka
map! D ha
map! C la
map! B ja
map! L
map! Q
map! R
map V {!}xfmt
map a iFFFF.i
map u iF
main(a,b)
int a;
char *b[];
{
}?{
o
map n a#!/bin/sh
#
#
#
#
if [ "$1" = "" ]; then
fiko echo "usage : $0 "
exit 1
map p aprintf("\n");?(
la
map w awhile () {
}?(
a
map y aCNT=0
while []
do
doneko CNT=`expr $CNT + 1`ko
map s aswitch () {
case ?:
break;
default:
break;
}?(
a
map o
map o
map o} else {
:ab xin #include
:ab xde #define
:ab xun #undef
:ab xif #ifdef AFS_HIUX_WE2_ENV
:ab xel #else /* AFS_HIUX_WE2_ENV */
:ab xen #endif /* AFS_HIUX_WE2_ENV */
:ab xif2 #if defined(AFS_HIUX_WE2_ENV) && defined(KERNEL)
:ab prin printf("\n");
:ab whil while() {
}?(
a
:ab fo for() {
}?(
a
:ab iff if () {
}?(
a
---