最低限 Unix / Linux [II] 【3. テキストエディタ】

  1. 事前準備
  1. シェル
  1. テキストエディタ
  1. シェルスクリプト
  1. [付録] データ圧縮・解凍とアーカイブ
  1. 本日の課題
情報実験第 4 回トップへ


3 章は非常に重要なので一通りやるようにしてください. また, 付録は飛ばしてかまいません(時間が余ったらやってください).

Linux において一際大きな役割を果たすアプリケーションである「テキストエディタ(あるいは単にエディタ)」について学びます.
Windows のメモ帳に近いイメージですが, Linux では Windows よりも多くの場面でテキストファイルを扱う必要が出てくるため, テキストエディタはより重要なアプリケーションと言えます.
本節では, テキストファイルの編集を必要とする場面をいくつか例示した上で, 伝統的なテキストエディタ「vi」の操作を学びます.

[3-1] テキストファイルを確認する

WindowsやMac では, ほとんどのファイルが拡張子に応じた専用のアプリケーションでファイルを扱うように設計されており, なおかつ各アプリケーションの設定ファイルなどは アプリケーション内で操作する仕様になっている場合が多いため, テキストエディタは単なる「文書作成ソフトウェア」に過ぎないというイメージがあります.
しかし Linux においては, 各種の設定ファイルやソースファイルもテキストファイルとして扱われているため, 文書作成以上に「管理/メンテナンス用ソフトウェア」として テキストエディタを用いる場面が多々あります.
そんなテキストファイルの具体例を見てみましょう.

/home/taro/.bashrc

このファイルは各ユーザの bash に関する基本設定を定義するファイルです.lessコマンドで文章を閲覧が出来ます.lessコマンドで内容を確認する画面に遷移し, lessの画面から脱出する際は[q]キーを押してください.
$ less ~/.bashrc
.
.
.
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes
    else
        color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac
.
.
.

パッと見ただけでは何が何だか分からず「読めない」ファイルのようにも思えますが, 読み方さえ学べば書いてある内容を理解できるようになれます.
普通の文章が書かれたファイル(「hello world!」など)だけでなく, このようなファイルも含めてテキストファイルと呼びます.
これに対して, 「読めない」ファイルとは, 例えば以下のようなファイルのことを指します.
例)
$ less sugoi_gazou.gif
GIF89ah^Aü^@õ5^@^P^P^P^[^[^["""(((---111333888AAADDDUUU___fffnnnwwwxxx{{{}}}<9D>SS<9A>\\<97>ff<90>xx¤AA JJÿw<81><81><81><84><84><84><88><88><88><8A><8A><8A><94><94><94><96><96><96><99><99><99>ªªª>>>>>>ÿ<88><88>ÿ<8F>ÿ<99><99>ÿ<9F><9F>ÿ££ÿ¤¤ÿ
ªªÿ‾‾ÿ>>>>ÌÌÌÏÏÏÑÑÑÝÝÝÿÀÀÿÌÌÿÝÝîîîÿîîÿÿÿ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@!ù^D^@^^^@^@^@!þ4 Image generated by GPL Ghostscript (device=pnmraw)
^@!ÿ^KNETSCAPE2.0^C^A^@^@^@,^@^@^@^@h^Aü^@^@^FþÀ<9A>pH,^ZH¤rÉl:<9F>?¨tJ-Z‾جvËíz¿à°xL.<9B>Ïè´zÍn>>ßð,|N‾Ûïø 1/4 ~Ïïûÿ<80><81><82><83><84><85><86><87><88><89><8A><8B><8C><8D><8F><90><91><92>W^L‾<95>?^L <98>
/^\^\μ<96>¡¡
<93>ª<<ª??<95>μ^\?¤?‾ ¤μ
! ^\"¬ÀÁ<8B>®°?´<99>‾   ±? £¬©ÂÒÓ<81><95><98>μ<9A> 1/4 <95> Ý
¢ÖÔäåùÆæéê<86>¿ëîïðñòóôõö÷øò<98>×ùýþ×?æ<8C>úÇ°à^Sôè<84>´àÀàÁ<87><87>^P£Ê<9C>ȱ¢Å<8B>^X?êÜȱ£Ç Ã<8A>^\É?£^F<86>^LÜÌ      ,^@<86>ÃÊ<98>àá^B^E
^UJFD ?gþE<9E>><83>B^D*4(Ñ¢#O2^X°`N1ZC^Bp¡±bÅ<88><^PO×;_í<84>\ÃpT1T±Xúd,^]?sàÊ<91>^K§¬<9E>^BjV`,ÊVÉ<8B>õ^DÎ3ø^F
.
.
.

どんなに訓練を積んでもこのファイルを読むことはできそうもありませんね.
このようなファイルは「バイナリ(機械語)ファイル」とよばれ, そのファイルの読み方を知っているアプリケーションでなければ扱うことができません.

以上のように, 各アプリケーション等の設定ファイルはテキストファイルとして作られており, これを書き変えることで任意の設定のもとでアプリケーションが動作します.
よって, これらのテキストファイルを編集するためのアプリケーション(すなわちテキストエディタ)は計算機を利用する上で必須であるといえます.

[3-2] vi を使う

テキストファイルを実際に操作するのに用いるのがテキストエディタです.
種類は色々ありますが, 本実習ではそのひとつである vi について取り上げます.
とは言います物の, viの操作は非常に難しいです.今回の実習で使う計算機には簡便に使えるnanoやviの発展版であるvimなどがインストールされていますので各自利用してください.
nano の利用方法についてはページの後半に記載しています.([3-3-4]にて)
vi (VIsual extended editor) は多くのUNIX系OSの標準エディタです.
つまり大抵の UNIX マシンではじめから vi は用意されています.
システムアカウントの変更を vi を元としたツール, vipw や vigr 等でおこなうのは, 確実に使えるエディタが vi であるためです.
「もしも」のトラブル時に利用できる可能性がもっとも高いエディタは vi であり,特に管理者となる人は必ず習得すべきツールといえます.

しかし残念なことに, vi の操作体系は直感的ではありません.
なぜなら vi はあまりにも古典的なソフトウェアであり, 計算機の機能がもっと制限されていた過去の時代に, その制限の枠内で最大限の機能を持たせたからです.
そのため UNIX でテキストファイルを編集するためのエディタが他に数多く用意されています.
vi の独特な操作方法を嫌う初心者ユーザーも少なくありません.
しかし上述の理由から, 誰もが一度はその基本操作を学ばなければなりません.
また, 慣れれば良い相棒となってくれるでしょう.

さて, vi の特長は次の通りです.
vi の根本思想は「ひたすら速く」です.
vi には親切なメニュー画面はありません. しかし, それは vi がユーザーインターフェイスを軽視しているという意味ではありません.
実際, vi ほどインターフェイスに神経を使っているエディターは他にないでしょう.
最少の労力で最大の成果をもたらすよう計算し尽くされています.
そのことは vi を使い込むほど実感できるはずです.

それでは, そんな vi の使用法を学習していきましょう.

[3-2-1] ファイルオープン/クローズ

vi はどんなテキストファイルを編集したいときにも使えます.
他のエディタ同様, 編集するファイルをバッファ(メモリ内の一時的な領域)にコピーし, そのバッファの内容を編集することになります.
ファイルに変更を反映させるにはバッファの編集内容をファイルにセーブしなくてはなりません.
※以下, 本ドキュメントでは特別な場合を除きこのバッファへの編集作業を"ファイルの編集"と記述しています.

vi を使うには, 次のように入力します.
$ vi ファイル名
引数のファイル名は既に存在するファイル名, あるいはこれから作りたい新規のファイル名を入力します.
ファイル名を省略した場合, バッファのみが準備され, 保存時にそのファイル名を決定することになります.

ファイルの編集内容を保存し作業を終了するには, ノーマルモード(次節を参照)であることを確認し(ESC キーを押せばよい), 以下の文字を入力します.
:wq
ファイルの編集作業を保存したり, 終了してコマンドプロンプトに戻るには幾つかの方法があります.

:q vi を終了する
:q! バッファでの編集内容を放棄し vi を強制的に終了する
:w バッファの内容をファイルに保存
:w ファイル名 バッファの内容を指定したファイル名で保存
:w! バッファの内容を強制的にファイルに保存
:wq バッファの内容をファイルに保存し, vi を終了する.
ZZ バッファの内容をファイルに保存し, vi を終了する.
※ q:quit, w:write, !:強制的 という意味の組合せになっている

[3-2-2] vi の基礎 - 状態遷移

vi の起動, 終了を覚えたので, 最低限のファイル編集の方法を見ていくことにします.

vi では, キーボードのキーは2つの役割をはたします.
例えば「a」というキーは, 「a」という文字をテキスト画面に表示するために押されますが, 別の場合にはもっと違った意味を持つ命令(コマンド)と解釈されます.

キーがどちらの働きをするかは, vi の「モード」(状態)が決定します.
これらの vi の「モード」は, 「挿入モード」と「ノーマルモード」と呼ばれます.
vi を使う時に最も大切なことは, この2つのモードをきちんと区別することです.
vi を起動させた直後は「ノーマルモード」になっています.
「ノーマルモード」では vi の終了, 編集中のファイルの更新, 文字の削除, 検索と置換, 行番号の表示設定や, 他のプログラムの実行などを行うことができます.

文字を入力する場合は「挿入モード」へ切り替えなければなりません.
「挿入モード」へ切り替えるには, a, A, i, I, o, O のいずれかを押します(それぞれ切り替わった後の動作が異なります).
「挿入モード」では, 純粋に文字を入力します. それ以外の動作を行うためには ESC キー(エスケープ・キー)を押して, 「ノーマルモード」へ切り替えなければなりません.

vi で初心者ユーザーが陥る混乱の原因は, この状態遷移を把握しきれてないことが殆どです.
「わけわかんなくなったら ESC キー!」と覚えておきましょう.
ノーマルモードの状態であれば ESC を押しても何も起こらないため, vi の状態が「ノーマルモード」であることが保証されます.

状態遷移図

[3-2-3] 実践!vi

それでは実際に vi を使ってみましょう. 以下の [練習1], [練習2] をやってみてください.
ここで必要となるノーマルモード, 挿入モードのコマンドはvi の基礎 - ノーマルモード, vi の基礎 - 挿入モードを参照してください.

[練習1]

以下の文章を書き込んだファイルを vi をつかって実際に作り, rensyu.txt というファイル名で保存してみましょう.
$ vi rensyu.txt

i
     :
     :
<-- rensyu.txt という名前の新規ファイルを viで開く

<-- "i" で挿入モードへ移る(現在いるカーソルの左側に挿入)
<-- 編集(上記の文章を入力)


以下のコマンドで書き込んだ内容が表示されましたか? 表示されれば OK です.

$ cat rensyu.txt

   With a screen editor you can scroll the page,
   move the cursor, delete lines,
   and more, while seeing the result of your edits as make them.

[練習2]

先ほど編集したファイルを vi で開いて, 以下のように文字の削除, 行の挿入・削除などを行い, 別名(rensyu2.txt)で保存してみましょう. 一文字削除や一行削除は ノーマルモードからできます.

$ vi rensyu.txt
     :
     :
<-- [練習1] で作成した rensyu.txt を viで開く



以下のコマンドで変更した内容が表示されましたか? 表示されれば OK です.

$ cat rensyu2.txt

   We will modify this file !
   With a screen editor we can scroll the page,
   and more, while seeing the result of your edits as make them.

どうですか? うまく作成できましたか?

初歩的な vi の使い方はなんとなく理解できたでしょうか? 実際にはもっといろいろな使い方があるのですが 一度に覚える必要はありません. 実際にファイルの編集をしながら, "かゆい"ところがあったら その都度新しい命令, 機能を調べてゆけば良いです. 最低限, ファイルのオープンクローズ, 挿入モードとノーマルモード間の移り方("a,i,o"コマンドと ESC キー), 1文字削除("x"), ノーマルモードでのカーソルの動かし方が わかっていれば, なんとかなります. もう少し高度な使い方をしたい人は自分で調べてみましょう.

では, 次はエディタを用いてシェルスクリプトを作成してみましょう.


<< 戻る (シェル)      次へ >> (シェルスクリプト)

[3-3] 付録(vi の具体的操作法, その他のエディタ)

[3-3-0] vi の基礎 - 各種モード

上記では,「ノーマルモード」と「挿入モード」について説明してきましたが, その他にもモードが存在します.

[3-3-1] vi の基礎 - ノーマルモード

「ノーマルモード」で実行する基本的なコマンドは次の通りです.

エディタの終了/ファイルの書き出し

カーソルの移動

h
1文字左にカーソル移動(十字キーの「←」でも良い)
j
1文字下にカーソル移動(十字キーの「↓」でも良い)
k
1文字上にカーソル移動(十字キーの「↑」でも良い)
l
1文字右にカーソル移動(十字キーの「→」でも良い)
※ "hjkl" は右手のマウントポジション(ブラインドタッチでのホームポジション)にあります.

文字入力(挿入モードへの移行)

a
現在いるカーソルの右側に挿入(追加:append)
A
現在いるカーソルの行末に挿入
i
現在いるカーソルの左側に挿入(挿入:insert)
I
現在いるカーソルの行頭に挿入
o
現在いるカーソルの下の行に挿入 (行を開ける:open)
O
現在いるカーソルの上の行に挿入

文字削除

x
カーソル位置の文字を1文字削除
dd
カーソルのある行を1行削除

アンドゥ(取り消し)

u
直前の変更を取り消す

検索

/文字
指定された文字を, 次の行より下へ検索.
?文字
指定された文字を, 前の行より上へ検索.
n
検索コマンドで指定された文字を, 正方向へ検索 ("/"では下へ, "?"では上へ)
N
検索コマンドで指定された文字を, 逆方向へ検索 ("/"では上へ, "?"では下へ)

別ファイルの読込

:r ファイル名
カーソル行の下にファイルを読み込んで挿入

[3-3-2] vi の基礎 - 挿入モード

「挿入モード」で実行する基本的なコマンドは次の通りです.

ESC キー
ノーマルモードへ移行
DEL キー
左1文字削除(「ノーマルモード」では利用できません)

[3-3-3] vi の高度な使い方

上で紹介したのは, vi を使用する上での基本的な事項だけです. 以下の内容は授業では説明しませんが, より便利に vi を使う参考として時間と興味のある方は御一読を.

※以下は断りのない限り「ノーマルモード」で使用するコマンドです.

コマンドラインにおける vi

※いきなりですが, これは「ノーマルモード」とは関係ありません.

$ vi +18 [ファイル名] ファイルをオープンし, 行18に位置づける
$ vi +/"mustard greens" [ファイル名] ファイルをオープンし, 最初の"mustard greens"にカーソルを移動
$ vi -r [ファイル名] クラッシュしたファイルを回復し読み込む
$ view [ファイル名] 読むだけのためにファイルを読み込む

カーソルの移動

w
右へ1単語分移動
W
右へ1単語分移動(区切り文字を越える)
b
左へ1単語分移動
B
左へ1単語分移動(区切り文字を越える)
Enter キー
下の行へ移動
Backspace キー
左へ1文字分移動
スペース キー
右へ1文字分移動
H
画面上端へ移動
M
画面中段へ移動
L
画面下端へ移動
Ctrl-F
1画面前へスクロール
Ctrl-D
半画面前へスクロール
Ctrl-B
1画面後ろへスクロール
Ctrl-U
半画面後ろへスクロール
G
ファイルの最終行へ移動
21G
行21へ移動

文字削除

D
行のカーソルから右の部分の削除
:5,10 d
5行から10行までを削除

テキストの複写と移動

yy
行の取り込みまたはコピー
Y
行の取り込みまたはコピー
dd
行の削除
P
取り込みまたは削除された行を現在行の上に挿入
p
取り込みまたは削除された行を現在行の下に挿入
:1,2 co 3
行1 から行2 までを行3 の下へコピー
:4,5 m 6
行4 から行5 までを行6 の下へ移動

情報の表示

:set nu
行番号の表示
:set nonu
行番号の非表示
:set ruler
ルーラーの表示
:set noruler
ルーラーの非表示
:set showmode
モードの表示
:set noshowmode
モードの非表示
Ctrl-G
ファイル名, 行数, 位置の表示

画面の更新

Ctrl-L
画面の再描画

[3-3-4] その他のエディタ(nano, emacs 他)

vi 以外にもテキストエディタは数多く存在します. たとえば, vi と並ぶ代表的なエディタとして emacs があります. emacs は vi とは対照的に, 動作が多少重いながらも使いやすくなおかつ多機能であることを特徴としています. ちなみに vi 信者と emacs 信者の対立は計算機関係者の間では有名であり, いずれも自らが最高のエディタであると主張して譲りません. 興味を持った方は「エディタ戦争」について調べてみるとよいでしょう. (ただしもちろん実習後に!) また,vi の機能を拡張してより使いやすくなった vim というエディタもあります. また,コマンド等が分かりやすく画面に書かれている nano というエディタもあります.


nanoの起動方法はviと同様に以下のコマンドで実行できます.

$ nano ファイル名

nanoの起動中に動作するコマンドは以下の通りです.基本的にCtrlキーとほかのキーの同時押しにて実行します

Ctrl + O
書き込み(保存)
Ctrl + X
終了 (保存せずに終了したい場合は, バッファを保存しますか?と聞かれるときに Ctrl + Nを押すか, Noと入力する)
Ctrl + K
1行切り取り
Ctrl + U
1行貼り付け
右クリック
クリップボード内のデータを貼り付け.

実習では最低限知っておくべきエディタとして vi を取り上げましたが, 好みに応じて他のエディタを使ってもけっこうです. nano は情報実験機にプレインストールされています. emacs はインストールされていないので,使ってみたい方はTA に声を掛けてください.




<< 戻る (シェル)      次へ >> (シェルスクリプト)

最終更新日: 2020/06/01(茂木 遥平) Copyright © 2019 inex