viの操作が分かりづらい4つのモードです。 それを分かりやすくする為、モードの移動の図解を付けました。 使い方をいつも忘れるのでメモしてます。 マウス使用や画面分割方法も追加しました。
ViとVim
viはVisual Editor、vimはVisual Editor Improve。 vimにはビジュアルモードが追加されいて、範囲指定でコピーやカットが出来るようになっています。(uBuntuのviにはビジュアルモードが入ってましたので、違いはほとんどないですが、vimはカスタマイズできるのとディレクトリの候補リストが表示されます。) vimは初期値ではvi互換モードとなっていて操作方法は、ほぼvi = vimです。 なので、ここではviエディタの使い方を書きました。
viはほぼ全てのLinux Distributionに付随してきますが、vimは別途インストールが必要な場合があります。 uBuntu20.04 LTSでは以下の様に出てきました。 vimを使用するには、『sudo apt install』インストールする必要があります。
モード間移動(図解)
- viを難しくしているのはこのモードです。 正しいモードに入らないと操作ができずviの終了すら出来ないのです。 そこでモード間の移動を分かりやすくするよう図にしました。
- viを起動するとまずノーマルモードに入ります。 しかし終了する時はコマンドモードです。
- モードはvi画面の左下に表示されています。 表示例は各モードの説明で紹介します。
vi起動方法
// $ vi ファイル名 // ファイルを指定して起動 ファイルがまだ存在しない場合でもOK。【これしか使ってません🤣】 $ vi -R ファイル名 // 読み込み専用で起動 $ vi -r ファイル名 // 壊れたファイルをリカバリする $ vi //ファイルがまだ存在しない場合。 終了時にファイル名を指定する。 $ vim ファイル名 //起動方法はvimもviと同じ
ノーマルモード
例
vi .profile
で起動するとノーマルモードに入ります。組込みLinuxの場合ファイル名だけ表示されていればノーマルモードです。
赤い枠内で以下の事が分かる事は。
- ~/ .profileはホームディレクトリにある.profileファイルを編集している事を示しています。
- モードについて何も表示されていない場合は、ノーマルモードです。
- カーソルがある場所が、ファイル全体で48行中の1行目で2%の場所を示しています。(カーソルを下や右に動かしてみてください。 行が変わると数値が変わりますが左右の移動では数値は変わりません。)
uBuntuの場合、画面下に以下の様に表示されます。 赤枠内に何も表示されていないのでノーマルモードです。
ノーマルモード内操作コマンド一覧
ノーマルモードで以下コマンドを打ち込むと、基本的にENTERが無くても直ぐ実行されます。 例えば、2つ上の図で『e』の上にカーソルがありますが、その場で『x』を入れると『e』が削除されます。 『dd』を入力すると、『e』の行が全て削除されます。 失敗した時は『u』を入力します。 全て半角小文字です。 青付と文字は私が特によく使うコマンドです。 変に知らない間に文字を削除したら怖いので、ノーマルモードでは基本検索と行コピペしか使っていません。
- /文字列 カーソルの後方検索(ENTER必要)
- ?文字列 カーソルの前方検索(ENTER必要)
- n /か?で始まる文字列検索の次を検索
- x カーソルの1文字削除
- Shift + X カーソル直前1文字削除
- Shift + D カーソルから行末まで削除
- dd カーソルの1行全て削除 *間違えて消してしまったら『u』でundo。
- 行数dd カーソル行含めn行削除
- :開始行,終了行d 行範囲指定して削除(ENTER必要)
- r カーソルのある1文字だけ変更
- yy カーソルの1行全てコピー
- 行数yy カーソル
- p カーソルの後ろにペースト
- Shift + P カーソルの前にペースト
- w 1単語次に移動
- b 1単語前に移動
- ^ 行の先頭に移動
- Shift + $ 行の末尾に移動
- Shift + H 画面先頭行の先頭に移動
- Shift + M 画面センター行の先頭に移動
- Shift + L 画面最終行の先頭に移動
- Ctrl + F 1ページスクロールダウン
- Ctrl + B 1ページスクロールアップ
- gg ファイルの最初行の先頭に移動
- Shift + G ファイルの最終行の先頭に移動
- %s/文字列1/文字列2/g ファイル内の文字列1を全て文字列2に置き替える
- u Undo。 下の図の場合に後13回Undoで遡れる
- . 直前の操作の繰り返し(:で始まるコマンドは繰り返せない)
- h, j ,k ,l 1文字ずつ左、下、上、右に移動するが普通に矢印キーを使った方が安全
インサートモード
文字を色々追加したり変更したりする場合はこの『インサートモード』で編集します。 コピーやペーストは基本的に、ノーマルモードで実行します。(例外は、vi外でコピーした文字列の貼り付けhはインサートモードで実行します)
例
ノーマルモード時に『i』を押すと、インサートモードになり画面下に『I』が表示される。
uBuntuの日本語モード場合、画面下に以下の様に表示される。(viもvimも同じ)
uBuntuの英語モードの場合、(viもvimも同じ)
【超便利】vi外でコピーした文字列の貼付け方法
- Shift+ins vi外でコピーした文字列はインサートモード時ペーストできる。
その他インサートモード移行方法
色々あり試して頂いたらいいと思いますが、『i』しか使いません。
- i カーソル位置でインサートモードに移行<==これしか使わない。
- a カーソルを1文字後ろにずらしてインサートモードに移行
- Shift + I カーソルを行の先頭に移動してインサートモードに移行
- Shift + A カーソルを行の末尾に移動してインサートモードに移行
- o 下に空白行を追加してインサートモードに移行
- O 上に空白行を追加してインサートモードに移行
コマンドモード(コマンド入力)
ファイル保存や終了する際に入らなければならないモード。
例
ノーマルモード時に『:』をタイプする。 画面下に『:(コロン)』が表示されているとコマンドモードです。 組込LinuxもuBuntuもvimも同じ。
よく使うコマンド一覧
以下コマンドをタイプしてENTERで実行。『:』はコマンドモードに入る為のキー。 青付と文字は私が特によく使うコマンドです。
- :w 上書き保存
- :q 終了
- :wq 保存&終了
- :q! 強制終了
- :w! 強制保存
- :w ファイルに名前を付けて保存(既に存在するば場合はエラー)
- :w! ファイルに名前を付けて強制保存
- :500 500行に移動
- :set nowrap 折り返し表示しない
- :set backup ファイルを保存する時にバックアップファイルを作成する
- :set nobackup
- :set tabstop=数値 半角スペース数をタブに設定
- :set number 行番号表示
- :set nonumber 行番号非表示
- :set mouse=a マウスでの操作を有効にする
- :set showmatch カーソルがある括弧のペアを強調表示する
- :set textwidth=100 0にすると制限なし
- :set all 全ての設定を表示する
- :split 画面の横分割
- Ctrl+wj 下分割に移動
- Ctrl+wk 上分割に移動
- :vsplit 画面の縦分割
- Ctrl+wh 左分割に移動
- Ctrl+wl 右分割に移動
- :bd 現在の分割(画面)を削除
- :set list 制御文字表示(^MはCR、$はLF、^Iはタブ)
- :set nolist 制御文字非表示(^Mはnolist時でも表示される)
- :!シェルコマンド viを抜けて結果を見れる。 ENTERでviに戻ってくる。【便利です】
『q』を押して’q’ is not implementedと表示されると、コマンドモードではないのでエラーとなっている。『:』を先に押してから『q』を押すと認識して貰える。
ビジュアルモード
組込みLinux用等でBusyBoxについてくるviではビジュアルモードに入れないけど、uBuntuのviにはビジュアルモードがある。
uBuntu日本語モードの場合、画面下に以下の様に表示される。(viもvimも同じ)
uBuntu英語モードの時(viもvimも同じ)
コピー(y)、カット(d)、ペースト(p)
- 『v』でビジュアルモードに入る
- 『v』を押してビルあるモードに入る時にカーソルがある位置から上下左右矢印キーで範囲選択する。
- ビジュアルモードで一度コピー(y)やカット(d)すると、自動的にノーマルモードに戻る。
- ノーマルモードで、ペースト(p)する。
【便利】行単位選択(Shift+V)
行単位で選択したい場合は、Shift+Vでビジュアルモードに入る。 コピー、カットの操作は同じ。 一番使うかな。 削除の場合は『ノーマルモード』の『dd』で一行ごと削除するのも便利。
ブロック選択(Ctrl+V)
四角の形で選択したい場合は、Ctrl+Vでビジュアルモードに入る。
【便利】一括コメントアウト (Ctrl+V ~ Shift+I ~ 文字 ~ ESC)
- 行の先頭でCtrl+Vでビジュアルモードに入り、コメントアウトしたい行を選択。
- Shift+Iでインサートモードに入り、コメントアウトとして使う文字を入れる。 以下の例は『#』。
- Shift+Iを押すと、先ほどCtrl+Vで選択した範囲の先頭に戻り、選択範囲の薄い灰色が消えるが、気にせず、『Shift+#』を入力。
- この状態で『ESC』を押すと選択した全ての行に『#』が入りました。
- 因みに、『#』が入った状態で『u』とすると『undo』できます。
ショートカット (:開始行番号,終了行番号s/^/#/)
- 『:set number』で行番号を表示して
- 『:7,10s/^/#/』とすると7~10行の先頭に『#』が入ります。
コメントアウト一括削除
- 普通に、ブロック範囲指定で消すだけです。
- コメントアウトを消したい先頭行の『#』にカーソルを合わせ、Ctrl+V
- コメント文字『#』だけを選択し
- 『d』(カット)
ここで『p』を押してしまうとこんなのになるので注意。 もししてしまったら『u』でundo。
末尾一括入力
- 入力したい先頭行にカーソルを合わせ、『Ctrl+V』
- 入力したい行を選択して、『Shift+$』で各行末迄選択
- 『Shift+A』でインサートモードに入る
- 入れたい文字を入力
- 『ESC』で抜けると選択した行の末尾に同じ文字列を一括付け足せる一覧
- 以下の例は『 //』半角スペース3つと//を付け足し
Vim
viに機能追加したもの。 uBuntuで立ち上げるとこんな感じでちょとおしゃれ。(日本語モード時)
uBuntuが英語モードの時
Vimの便利な機能
ディレクトリ検索
『インサートモード』で以下の例の場合は、『/』が入った状態で、Ctrl+X ⇒ Ctrl+Fとすると、以下の様に候補が現われて選択できる。 子ディレクトリでも同じ事が出来る。 『/h』の時に実行すると、『/home/』が自動的に入力される。 ディレクトリ名を忘れた時や、長いディレクトリ名の打ち間違えも無くなる。
『~』が入った状態で、Ctrl+X ⇒ Ctrl+Fとすると『/home/ichiri/』となった。 この状態で、Ctrl+X ⇒ Ctrl+Fとすると以下の様になる。
vim互換モード
vimrcに’compatible’か’cp’とするとviと互換性モードとなる。(初期値)
強制終了 (Ctrl+Z) —注意
- Ctrl+Z 変更を保存せずviを強制終了。
- 簡単なので、私も多様しています。
- しかしファイル変更中に、Ctrl+Zをしてしまうと、変更途中が.swapファイルに保存され、以下のようなメッセージが出てきます。
- 『r』を押すと、変更していた状態に戻ります。
- 『a』と『q』の違いは解りませんが、同じように編集モードに入らず抜け出します。
- 『e』を押すと、変更していた状態を使用せずに、前回変更途中のファイルにもどらず、変更前の状態で編集開始できます。
- 何か変更後『:wq』で上書き保存しても、次回viで開く時にswapファイルが増えて、どのswapファイルで開くのか聞かれます。
- 一回『Ctrl+Z』をしただけなのに、こんなにswapファイルができてしまってました。
- 上の図のメッセージにもあるように、このメッセージを避けるには、swapファイルを削除してくださいとあります。
- swapファイルは、『.』から始まる隠しファイルです。
- 『Ctrl+Z』は便利ですが、使い方を間違えてswapファイルを作ってしまったら、手間が増えます。
- ファイルを変更してしまったら、正規の方法で『ESC』でノーマルモードに戻り『:q』で保存せずquit。
- ファイルを閲覧して変更せずに抜け出す時は、『Ctrl+Z』でもいいと思います。
- なので、『Ctrl+Z』はちょっと注意が必要ですね。
おまけ
Small Vi(viが正常動作しない時の解決方法)
uBuntuのインストール直後などでviを起動すると『i』を押してもIntertモードにならず、上下左右を押すと「D」「B」「A」「C」が入力されてしまいます。その時は、バージョンを確認してみてください。 下の6行目のようにSmall versionと表示されると、Tiny Vimと呼ばれる最低限のVimになっています。
$ vi --version VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Apr 18 2023 11:40:57) Included patches: 1-3995, 4563, 4646, 4774, 4895, 4899, 4901, 4919 Modified by team+vim@tracker.debian.org Compiled by team+vim@tracker.debian.org Small version without GUI. Features included (+) or not (-): +acl -file_in_path -mouse_urxvt -tcl -arabic -find_in_path +mouse_xterm -termguicolors +autocmd -float +multi_byte -terminal -autochdir -folding -multi_lang +terminfo : :
その時は、以下を実行してvimを上書きインストールすると正常に動作します。
$ sudo apt install vim
常に番号表示方法
- ~/.vimrcに以下を書き込む。
- viもこれで対応する。
- ターミナルを立ち上げた時に自動的に読み込まれるが、ターミナルが既に立ち上がっていたら『
$ source ~/.vimrc
』を実行する。
set number
タブ幅設定
- ~/.vimrcに以下を書き込み『
$ source ~/.vimrc
』を実行する。
set tabstop=4
色付け設定
vi編集画面のテーマ色設定。 uBuntuではできたけど、linux-xlnx-6.1.5ではsource ./.vimrc
で何故か『 -sh: colorscheme: command not found 』となりました。
syntax on colorscheme pablo
使えるテーマはviのコマンド入力モードでcolorschemeで半角スペースを開けタブを押していくと順番に表示されます。
:colorscheme <TAB> blue deakblue defapret+ delek+ desert+ elflord+ evening industry koehler+ morning murphy pablo+ peachpuff+ ron+ shine slate+ torte zellner+
私の.vimrc
色々なところに書き込む事が頻繁にあるので、ここにメモ代わりに置いてます。(uBuntu 4台目、ラズパイ、組込Linux(BBB、Ultra96V2、ZynqMP専用機) なので1年で8回設定しています。.bashrcも同様に設定必要なのでどこかにメモっとこう。
set textwidth=160 set mouse=a set tabstop=4 set number syntax on set showmatch colorscheme pablo
vi vs nano
はじめの頃はnanoばかり使っていましたが、今はほとんどviを使っています。
viはモードやコマンドを覚えないとややこしいです。 なので、最初はnanoを使うことをおすすめします。 そして、viのモードやコマンドを覚えたら、viの方が便利なので、viを使っています。 viが便利と思う点。
- 組込みLinuxをする時はnanoを使えない場合がある。(組込みLinuxは使用する容量を極力小さくするのでnanoが入れれない場合がある為)
- Chrome等、viの外のアプリの文字列をペーストできる。
- delとbackspaceの動作が通常の動作で使える。(nanoはどちらもbackspaceの動作になるので間違える。)
- プログラムソースコードや.bashrcなどの設定ファイルは自動で文字に色付けしてくれる。
- ビジュアルモードで簡単に複数行のコピペが出来る。
しかしある程度の量の編集をしようとすると、私はVScode>notepad++>vi>nanoで使っています。
コメント