テキストエディタ

テキストエディタ

テキストエディタの操作を
学ぶチュートリアル

著者について

マイケル・ハートル(Michael Hartl)は、ウェブ開発の主要な入門書の一つである「Ruby on Railsチュートリアル」の作成者です。また、「Learn Enough」の共同創立者であり、主執筆者でもあります。以前は、カリフォルニア工科大学(Caltech)で物理学の講師をしており、そこで生涯功労賞(Lifetime Achievement Award for Excellence in Teaching)を受賞しています。ハーバード大学を卒業後、カリフォルニア工科大学で物理学博士号を取得。Y Combinator起業家プログラムの卒業生でもあります。

著作権とライセンス

Railsチュートリアル Copyright © 2020 by Michael Hartl(最終更新日: 2023/02/01 08:34:34 PT)

Railsチュートリアルで掲載しているすべてのソースコードは、MIT ライセンスおよびBeerware ライセンスの元で提供されています。なお、これらのライセンスはいずれか一方が有効になります。つまり、MITライセンスに基づいて使用する場合は、ビールも購入する必要はありません。

なお、「すべてのソースコード」とは、Railsチュートリアル内で題材としている「Railsアプリケーションのソースコード」を指します。「Railsチュートリアル」という教材は上記ライセンスで提供されていないのでご注意ください。営利・非営利問わず、事業で使用する場合は教材連携サービスをご利用ください。

The MIT License

Copyright (c) 2016 Michael Hartl

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
THE BEERWARE LICENSE (Revision 42)

Michael Hartl wrote this code. As long as you retain this
notice you can do whatever you want with this stuff.
If we meet some day, and you think this stuff is worth it,
you can buy me a beer in return.

第1章テキストエディタとは

テキストエディタ編』は、意欲満々のコンピュータマジシャンの魔法がぎっしり詰まったカバンの中でもダントツに重要なアイテムである、テキストエディタ図 1.1)の使い方を皆さんがスムーズに学べることを目指して執筆されました。テキストエディタの使いこなし方を学ぶことは、「技術の成熟」のために不可欠な要素です。

images/figures/text_editor
図 1.1: テキストエディタ

本チュートリアルは、どんなテキストエディタでも活用できる、多くの人は存在すら知らないような応用方法をご紹介しています。さらに、特定のエディタに絞ったチュートリアルは、多くの場合長年経験を積んだプロの開発者を前提として書かれていますが、本チュートリアルは初めてテキストエディタに触れる読者を前提としているので、『コマンドライン編』で学んだUnixコマンドラインの基本的な知識があれば十分学べます1

その上で、ソフトウェア開発の基礎知識、特に『Railsチュートリアル』でWeb開発を学ぶのに不可欠な知識を中心に据えて学べるように構成されていますので、開発者と共同作業するのに必要な知識を学びたい方、あるいは開発者になりたい方に最適なつくりになっています。既にテキストエディタの使い方をご存知の方でも、本チュートリアルに従って学び、かつ演習問題をこなすことで、新たなテクニックをいくつも学べることでしょう。

テキストエディタは、ワードプロセッサやメールクライアントといったさまざまなドキュメント作成用プログラムとは異なり、平文テキスト2の編集に特化しています。テキストエディタの使いこなし方を学ぶのが重要な理由は、プログラムのコード、マークアップ、設定ファイルなど、平文テキストというデータ形式が現代のコンピュータで広範囲に用いられているからです3。実際、本チュートリアルもテキストエディタで執筆されています。

「平文テキストとは何か」の定義は意外にも驚くほど難しいのですが、実用的な観点で言えば、平文テキスト形式のデータとは「いかなる書式も設定されていない」または「少なくとも書式は重要でない」ことを意味します。平文テキスト形式のデータでは、強調(イタリック)ボールドフォントサイズタイプフェース(フォントの種類)などもまったく重要ではありません。重要なのはコンテンツ、つまり何が書かれているかだけなのです。たとえば直前の文がこのように強調表示で出力されているとしても、その実態であるソースはリスト 1.1のような平文テキストでしかありません4

リスト 1.1: 本チュートリアルのひとつの文をHTMLソース形式で表示したもの
平文テキスト形式のデータでは、<em>強調(イタリック)</em><strong>ボールド</strong><small>フォントサイズ</small><code>タイプフェース(フォントの種類)</code>などもまったく重要ではありません。
重要なのは<em>コンテンツ</em>、つまり何が書かれているかだけなのです。

リスト 1.1では、欲しい書式オプションを特殊なタグ(HTMLの強調タグ<em>…</em>など)で指定しています。テキストそのもののスタイルを変更しているのではありません5

コラム 1.1. 「ワードプロセッサ」と「テキストエディタ」

テキストエディタを一度も触ったことのない人でも、似たツールであるワードプロセッサ(ワープロソフト)は触ったことがあるのではないでしょうか。実際、テキストエディタとワープロソフトの機能は多くの点で似通っています。たとえば、どちらもドキュメントを新規作成できますし、検索置換もテキストのコピペも編集結果の保存もできます。主な違いは、ワープロが「一般的なドキュメント作成」を念頭に設計されていて「WYSIWIG6原則」に従っている点です。つまり強調ボールドといった書式設定の効果がそのままワープロソフト上に反映されます。また、たいていのワープロソフトは編集結果を「独自形式のファイル」に保存しますが、こうした独自形式のファイルはときどき壊れることがあります7

テキストエディタは平文テキストを変更するよう設計されていて、マークダウン書式設定では<em>強調</em>**ボールド**と表示されます。平文テキストならどんなテキストエディタでも開くことができ、壊れにくく、壊れても最悪手動で直せます。また、ワープロソフトと比べてテキストエディタの方がプログラマーを主な対象としています。そうしたユーザーの使う機能には、ソースコードのシンタックスハイライト( 3.2.1)、オートインデント( 3.2.3)、正規表現のサポート( 3.4.3)、パッケージやスニペットによるカスタマイズ( 3.5)などがあります。そうしたわけで、優れたテキストエディタはあらゆる技術者の道具箱になくてはならないツールとなっています。

images/figures/y_u_no_word_processor
図 1.2: Microsoft Wordで平文テキストを編集したらダメなの?

コマンドライン編』『テキストエディタ編』での開発作業は、重要度の高いVimエディタの解説から始まります( 1.1)。Vimはターミナルウィンドウ内のコマンドラインで直接実行できるという特徴があります。テキストエディタの最も重要な機能例は本章でもご覧いただけますが、Vimは初心者には複雑でなじみにくいという問題があるので、本チュートリアルではまず基本的な編集作業に必要な最小限の部分についてのみ解説します。

2以降では主にVisual Studio Codeエディタを用いて、プログラマー向けテキストエディタに欠かせない強力な機能のいくつかを解説します。Visual Studio Codeはオープンソースかつクロスプラットフォームのエディタで、Sublime TextCloud9(いわゆるクラウドIDE)とも非常に近いものになっています8

本チュートリアルは『コマンドライン編』と同様に「Unixの伝統」に則っていますので、「macOS」「iOS」「Android」「Linux」といった、Microsoft Windowsを除くほぼあらゆるOSが対象になります。紹介するテキストエディタはすべてWindowsにも対応していますが、「非Unix OS」環境では手順が異なる場面も多いため、Windowsユーザーの皆さんにはブラウザで動かせるLinuxベースの「クラウドIDE9」の使用や、『Learn Enough Dev Environment to Be Dangerous』のWindowsでの手順にそってLinuxのインストールをお勧めします。

また、全体を通じて「一般的な原則」を中心に据えていますので、皆さんが最終的にどのエディタを使うことになったとしても通用する、エディタでの作業で頼りになるタスクリストが心の中にできあがるようになっています。細かな操作方法などはテキストエディタやOSによって変わるので、本チュートリアルでは皆さんの技術の成熟コラム 1.2)を促進するための理想的な機会を提供する形を取っています。最後に、すべてを一度に学ぼうとして頑張りすぎないよう気をつけましょう。本チュートリアルで学んだことのほんの一片を使いこなせるようにだけでも、作業効率が大幅に向上します。「技術の成熟」を身につけたエンジニアも毎日欠かさずテキストエディタを使い続けています。みなさんもぜひ歩みを止めることなく、新しいテクニックを見つけて自分のものにし続けましょう。

コラム 1.2. 技術の成熟

コマンドライン編』でも繰り返し登場した技術の成熟という言葉は、コンピュータやさまざまな技術を使いこなせる一般的な能力を指します。その能力には既存の知識(テキストエディタやUnixコマンドラインの使いこなし)も含まれますし、xkcdの『“Tech Support Cheat Sheet”』でも風刺されているような「未知の」知識の獲得も含まれます。コーディングやバージョン管理といった「ハードスキル」はともかく、技術の成熟の後者の側面である「未知の知識を獲得するスキル」は、直接教わってもそう簡単には身につきません。しかし、皆さまがプログラマーと共同作業するのであれば、あるいは本物のプログラマーになりたいのであれば、「自分の知らない技術であっても学べるスキル」を養うことがとても重要です。

テキストエディタにおける技術の成熟は、たとえば「エディタのメニューを見ればだいたい何ができるか見当がつく」「エディタのメニューをチェックしたりネット検索したりしながらキーボードショートカットを覚えられる」といった形で現れますし、少々曖昧な記述に出くわしても慌てなくなります。たとえばチュートリアルに「〜を取り消すには⌘Zキーを押せ」と書いてあるのに自分のシステムでは⌃Zとなっていたとしましょう。技術に成熟したエンジニアなら、仮に⌘の意味を知らないとしても 2.1あたりをさっと見たり検索したりして疑問を解消できます。そして技術の成熟は何よりも「態度・物腰」にはっきりと現れます。技術的裏付けのある自信、そして困ったときでも「まあやればできるでしょう」と嬉々として取り組む姿勢は、時間をかけて身に付ける価値があります。

テキストエディタ編』ではこの後全体を通じて、初心者では解決しづらい問題を例として取り上げるたびに、この「技術の成熟」に立ち返ります。皆さんも経験を積めば、きっと「Tech Support Cheat Sheet」でいう、技術的課題を魔法のように解決できそうな「computer people」になれます。

1.1 最小限の環境で使えるVimエディタ

昔むかし、Unixができて間もない頃にviというエディタが開発されました。Vimは「Vi IMproved」の略とされていることからわかるように、viから派生・発展した高性能なテキストエディタです。多くの開発者がVimを日常的に編集作業で使っていますが、Vimを学ぶ壁は高く、能力をフルに使いこなすには根本的なカスタマイズと「技術の成熟」が求められます(コラム 1.2)。Vimには大量のコマンドが用意されていますが、紛らわしいものも多く、一般的なキーバインディング(いわゆるキーボードショートカット)と対応しているコマンドはめったにありません。そのような理由からもVimを学んで身につけるのは簡単とはいえないので、2以降では初心者の皆さんに「モダンな」エディタを普段遣いのエディタとしておすすめすることにしました。ですが、Vimを最小限に操作できるスキルはどうしても必要になると私は考えています。理由は簡単で、VimはほぼどんなUnix環境にもまず間違いなく入っているからです。つまり、たとえ地球の反対側にある知らないサーバーにsshでログインしたとしても、Vimならそこにインストールされているでしょう。

本章では、小さな設定ファイルやGitコミットをちょっとだけ編集するのに十分な最小限のVim操作だけを説明します10。これだけでは「技術の熟成」レベルにはほど遠いのですが、 最小限のVim操作を習得するだけでも大きなレベルアップと言えます。そのぐらいVimは難しいということです。Vimについてのちょっとした知識があなたを助けてくれることもあるでしょう。

メモ: macOSをお使いの方は、今のうちにコラム 1.3の手順を終わらせておきましょう。

コラム 1.3. macOSのシェルをBashに切り替える

macOSをお使いの場合、この時点で本チュートリアルに適したシェルプログラムを使えるようにしておく必要があります。macOS Catalinaの時点でのデフォルトシェルはZ Shell(通称Zsh)に変わってしまったのですが、本チュートリアルの操作で一貫した結果を得るにはBashに切り替えておくことをおすすめします.

最初の手順として、現在システムで実行されているシェルを以下のようにechoコマンドで確認します。

  $ echo $SHELL
  /bin/bash

上のコマンドを実行すると、$SHELLという環境変数の内容を出力します。出力が上と同じであれば、既にBashが使われていますので何もする必要はありません(ごくごくまれに$SHELLの内容が現在のシェルと一致してないこともありますが、いずれにしろ以下の手順を実行すればシェルを切り替えられます)。本チュートリアルでどうしてもZshを使いたい場合など、Zshについて詳しくは「Using Z Shell on Macs with the Learn Enough Tutorials(英語)」をご覧ください。

echoコマンドの結果が以下のようになる可能性もあります。

  $ echo $SHELL
  /bin/zsh

この場合は、以下のようにchsh(change shell)コマンドを実行します。

  $ chsh -s /bin/bash

コマンドを実行すると、おそらくシステムのパスワードを入力するよう求められるので、そのとおりにパスワードを入力する必要があります。続いてCommand-Qキーを押してシェルをいったん終了してからシェルを再起動します。

再度echoコマンドを実行して、シェルが切り替わったことを確認します。

  $ echo $SHELL
  /bin/bash

このとき以下のアラートが表示されるかもしれませんが、これは無視します。

  The default interactive shell is now zsh.
  To update your account to use zsh, please run `chsh -s /bin/zsh`.
  For more details, please visit https://support.apple.com/kb/HT208050.

  [~]$

上の切り替えはいつでも完全に元通りにできますので、システムを壊したのではないかと心配する必要はありません。詳しくは『Using Z Shell on Macs with the Learn Enough Tutorials』をご覧ください。

1.2 Vimを起動する

2で説明する昨今のエディタと異なり、Vimはターミナルウィンドウで直接起動でき、グラフィカルユーザーインターフェイス(GUI)も不要です11。コマンドプロンプトで以下のようにvimと入力すればVimが起動します。

$ vim

vimコマンドの典型的な実行結果はリスト 1.2図 1.3のような感じになります。いずれの場合も行の冒頭にあるチルダ記号(~)は実際のファイルには含まれず、単にその行が未定義であることだけを意味しています。

リスト 1.2: Vimウィンドウのテキスト形式表示(メッセージやバージョン番号はこれと異なる可能性があります)
~
~
~
~
~
~                              VIM - Vi IMproved
~
~                                 version 7.3
~                           by Bram Moolenaar et al.
~                 Vim is open source and freely distributable
~
~                        Help poor children in Uganda!
~                type  :help iccf<Enter>       for information
~
~                type  :q<Enter>               to exit
~                type  :help<Enter>  or  <F1>  for on-line help
~                type  :help version7<Enter>   for version info
images/figures/starting_vim
図 1.3: ターミナルウィンドウでVimを実行する

Vimの起動は簡単ですが、少なくとも最初のうちは使いこなしが恐ろしく難しいものに感じられるかもしれません。主な理由はVimが「モーダルな(複数のモードを持つ)」エディタであることです。他のエディタでVimのようにモードを持っているものはめったにありません(コラム 1.4)。Vimには「ノーマルモード」と「挿入モード」という2つの主要なモードがあります。ノーマルモードは、あちこちのファイルを開いて回ったり、中身を削除したり、テキストの検索置換を行ったりするのに使います。挿入モードはテキストを挿入するときに使います。

コラム 1.4. 「モーダルな」Vim

私がUnixの伝統的な世界でプログラミングを学び始めたころ、子供の頃に体験したMicrosoft DOSBASICPascalとは対照的に、信じられないほど原始的なエディタに死ぬほど苦しめられたことを今もありありと覚えています。当時はハーバード大の学部1年生で、ハーバード・スミソニアン天体物理学センター研究グループの一員でした。そこで私が使ったのはviでしたが、かなり控えめに言ってもワープロと比べてとても不便だと感じました(図 1.2)。

当時特にショックだったのは、viの「モーダル編集」という考え方でした。ワープロと違い、viでウィンドウのどこかをクリックして入力開始しようとしてもできないのです。代わりに、「挿入モード」に切り替えるだけでもiaoといったオプションがいくつもありました。キー操作をほんのちょっぴり間違えただけでも何もできなくなって大混乱です。その後はワープロソフトでおなじみの「クリックして入力」できるモダンなテキストエディタを使うようになってしばらくviから離れていましたが、おどろくべきことにvi(Vim)の人気は一向に衰える気配すらありません。モーダル編集を学ぶことは、初めは意味のないことに思えるかもしれませんが、価値あるスキルがみにつくと言えるでしょう。

Vimで「ノーマルモード」と「挿入モード」という2つのモードを行ったり来たりしていると、今がどちらのモードなのかを見失いがちです。他のテキストエディタ・ワープロ・メールクライアントには「挿入モード」しかないので、なおさら混乱します。特に混乱しがちな部分は、Vimが起動時に「ノーマルモード」で起動する点です。つまり、Vimを普通のワープロのように起動直後にいきなり文字を入力しようとしても、まるで思ったとおりになりません(リスト 1.2)。

Vimの「モーダル編集」に触れたことがない人が混乱する可能性が高いので、本チュートリアルでは最初に「最も重要なVimコマンド™」を1つ覚えていただきます。日常的にVimを使っていない同僚でさえも「最も重要なVimコマンド™」として何としてもこれだけは最優先で覚えておくべきと主張していました。それが以下のコマンドです。

ESC:q!<return>

このコマンド操作は「Escキー」を押し、次に「コロン」と「q」と「!」を順に押し、最後に「Returnキー」を押す、という意味です。こうすると何が起きるかとその理由についてはこの後で説明しますが、とにかく今はこのコマンドだけを繰り返し入力して練習するところから始めましょう。

1.2.1 演習問題

  1. ターミナルでVimを起動し、例の「最も重要なVimコマンド™」を実行しましょう。
  2. ターミナルのVimをもう一度起動し、他の操作を行わずにいきなり「This is a Vim document.」と入力し、何が起こるか観察しましょう。何だかおかしなことになりませんか?
  3. 上の演習を実行した状態で例の「最も重要なVimコマンド™」を実行し、いつものコマンドラインのプロンプトに戻しましょう。

1.3 小さなファイルを編集する

 1.2で「最も重要なVimコマンド™」を覚えたので、今度はVimで実際に小さなファイルを開いて編集してみましょう。 1.2ではvimコマンドに何も渡さずに単独で実行しましたが、ファイル名を引数として渡すのが普通です。皆さんのシステムのホームディレクトリで以下のファイルを開いてみましょう。

$ cd
$ vim .bash_profile

この「.bash_profile」ファイルは皆さんのシステムに既に存在すると思いますが、もしなくてもVimが必要に応じて自動で作ってくれます。これは、コマンドライン機能を提供するシェルというプログラムの設定に使われるファイルです。ほとんどのシステムではBashというシェルがデフォルトで設定されていますが、これはBourne Again SHellの略語です12。Unixベースのシステムではよくあるように、Bashのプロファイル設定ファイルもドットで始まり、『コマンドライン編』でもご説明したとおりに隠しファイルであることを表します。つまり、lsコマンドを単に実行しただけではこのファイルはリストに表示されませんし、GUIのファイルブラウザでも表示されません。

このファイルの変更結果の保存方法は後ほど 1.4で学ぶ予定ですが、今はダミーコンテンツを追加して練習することにしましょう。先の 1.2では、テキストの位置を変更したり削除したりといった操作が可能なノーマルモードでvimを起動する方法を覚えました。今度は挿入モードに切り替えて、何か入力してみましょう。最初の手順として、iキーを押して文字を挿入できるようにします(iはinsertの最初の文字)。続いてリスト 1.313のように何か適当に入力してReturnキーを押すことを数回繰り返し、数行ほど入力します。画面には他にもいろいろ表示されているかもしれませんが、今は気にせず進めます。

リスト 1.3: iと入力してから何かテキストを挿入する ~/.bash_profile
lorem ipsum
dolor sit amet
foo bar baz
I've made this longer than usual because I haven't had time to make it shorter.

リスト 1.3のテキストを入力したら、ESCキーを押して挿入モードからノーマルモードに切り替えます。

適当なテキストを数行入力できたので、今度はこの小さなファイルの中であちこちに移動して様子を見る方法を学びましょう14。一番簡単なのは、いわゆる「矢印キー」を使う方法です。上矢印キー、下矢印キー、左矢印キー、右矢印キーを押すことによる移動は、私からのおすすめです15。Vimでファイル内を移動する方法は文字通り「無数にあります」。Vimをメインのテキストエディタにする決心がついたなら、こうしたコマンドを覚えることをおすすめしますが、そうでなければ矢印キーでもまったく問題ありません。今は、行の冒頭に移動する操作(0キー)と行の末尾に移動する操作($キー)を覚えれば十分です16

1.3.1 演習

  1. 下矢印キーを何度か押して、 1.3のファイルの上から4行目までカーソルを移動しましょう。
  2. 下矢印キーを何度か押してファイルの最下部まで移動し、それから再びファイルの上から4行目までカーソルを戻しましょう。面倒ですね?
  3. ファイルの上から4行目の位置で、上で説明したコマンドを用いてその行の冒頭にカーソルを移動しましょう。
  4. ファイルの上から4行目の位置で、上で説明したコマンドを用いてその行の末尾にカーソルを移動しましょう。

1.4 ファイルを保存してVimを終了する

カーソルを少々移動したりテキストを挿入したりできるようになったので、今度はファイルの保存方法を覚えましょう。この例では新しく便利なBashコマンドを作りますが、まずBashプロファイルのファイルの現在の状態を正しく扱わなければなりません。リスト 1.3で追加したテキストは少なくともBashにとっては無意味なので、今するべきなのはファイルを「保存せずに」閉じることです。ファイルを閉じる場合の通常のキー操作は「:q<return>17ですが、これはファイルに何も変更を加えていない場合にしか使えません。今の状態でこのキー操作を実行すると“No write since last change (add ! to override)”というエラーメッセージが表示されます(図 1.4)。

images/figures/no_quit
図 1.4: 未保存の変更がある状態でファイルを閉じようとした場合

このエラーメッセージの指示に従って、今度は「:q!<return>」と入力しましょう。これにより、Vimは変更を保存せずに終了し(図 1.5)、コマンドラインに戻ります。

images/figures/colon_q_bang
図 1.5: Vimを強制終了する

そろそろ皆さんも、 1.2で説明した「最も重要なVimコマンド™」がなぜ重要かがおわかりいただけたかと思います。ファイルでどんなめちゃくちゃな変更を行ったとしても、とにかくESCキーで挿入モードから脱出し18、続いて「:q!<return>」操作で強制終了を実行しさえすれば、変更がなかったことになるのです。

強制終了の操作を覚えましたが、Vimは編集結果を保存できてこそ実力を発揮するので、今度は意味のあるテキストを追加してから保存してみましょう。 1.3で行ったときと同様に.bash_profileファイルを編集することにしますが、今回はエイリアス(alias: 別名)をひとつ追加してみましょう。コンピュータにおけるエイリアスとは、1つ、または複数のコマンドの別名を指します。Bashエイリアスは、よく使われるコマンドの組み合わせに対してもっと短いコマンド名を定義するのに使われます19

ここではlist reverseを略したlrというコマンドを「ls -hartl」のエイリアスとして定義することにします。オプションに-hartlとあるのは、「human-readable values for the sizes (ファイルサイズを人間が読みやすい形式で表示する: 29KByteのファイルサイズを29592ではなく29Kと表示するなど)」「all(隠しファイルも含めてすべてのファイルを表示する)」「reverse(逆順表示)」「time(時刻)」「long form(ファイル名以外の情報を省略しないロング形式)」という意味の頭字語です。このコマンドで『コマンドライン編』の演習を思い出した方もいらっしゃるかもしれませんが、最近変更されたファイルをリストの上位に表示してチェックするのに便利です20。エイリアスを定義すると、以下のような長いコマンドを

$ ls -hartl

以下のようにスッキリ短くできます。

$ lr

エイリアス定義の手順は次のようになります。

  1. コマンドラインで「vim .bash_profile」と入力してVimでファイルを開き、iキーを押して挿入モードに切り替える。
  2. リスト 1.4に示されているテキストを入力する。なお一部のシステムでは.bash_profileに既に何か書かれていることもありますが、そのままにしておいて大丈夫です。
  3. ESCキーを押して挿入モードを終了する。
  4. :w<return>」と入力してファイルを書き込む。
  5. :q<return>」と入力してVimを終了する。

メモ: 操作ミスを取り消したい場合は、ESCキーを押してからuキーを押すことで、いわゆるUndo(取り消し)操作ができます。これはVim独特のキーバインディングの例でもあります21

リスト 1.4: Bashのエイリアスを定義する: ~/.bash_profile
alias lr='ls -hartl'

lr」というエイリアスを.bash_profileに追加したら、ファイルを保存してVimを終了します。しかしこれだけでは以下のようにエイリアスが効かないので、少々おどろくかもしれません。

$ lr
-bash: lr: command not found

エイリアスが有効になってない理由は、Bashプロファイルのファイルをシェルがまだ読み込んでいないためです。これを行うには以下のように「source」コマンドを用います(リスト 1.522

リスト 1.5: Bashプロファイルのエイリアス定義をsouceコマンドで有効にする
$ source .bash_profile

これで「lr」コマンドがめでたく動くようになりました。

$ lr
.
.
.
drwx------+  15 mhartl  staff   510B Sep  4 18:58 Desktop
-rw-------    1 mhartl  staff    13K Sep  4 19:13 .viminfo
-rw-r--r--    1 mhartl  staff    46B Sep  4 19:14 .bash_profile
drwxr-xr-x+ 117 mhartl  staff   3.9K Sep  4 19:14 .

ちなみに、.bash_profileファイルはターミナルのタブやウィンドウを新しく開いたときに自動的にBashに読み込まれるようになっていますので、明示的にsourceコマンドを使う必要があるのは、今開いているターミナルで設定を反映したい場合だけです。

1.4.1 演習問題

  1. よく使われる「grep -i(大文字小文字を区別しないgrep)」コマンドのエイリアスとして「g」を定義してみましょう。Vimで設定ファイルを変更してESCキーを押した後、先ほどは「:w」「:q」を順に実行しましたが、今度は代わりに2つの操作をまとめた「:wq」を実行してみてください。何が起きるでしょうか?
  2. コマンドライン編』で学んだcurlコマンドを思い出してくださいcurlコマンドはURLにコマンドラインでアクセスするのに使えます。それでは、ファイルをローカルディスクに保存する「curl -OL」コマンド23のエイリアスとして「get」を定義してください。
  3. 上の演習で作ったエイリアスを用いて、リスト 1.6のコマンドを実行してください。そのコマンドでダウンロードした長いテキストファイルは、次の 1.6の演習で使います。
リスト 1.6: この後のセクションで用いる長いテキストファイルをダウンロードするコマンド
$ get cdn.learnenough.com/sonnets.txt

1.5 コンテンツの削除

Vimには膨大なテキスト操作コマンドがあり、テキストの一部や全体を削除するコマンドも豊富に揃っていますが、この節では最小限の削除方法だけを学ぶことにしましょう。最初は「1文字の削除方法」で、ノーマルモードで「x」キーを押すことで、カーソルがある文字を1つ削除できます。

  1. .bash_profileファイルをVimで開き、わざとスペルを間違えた「aliaes」という語を挿入する
  2. ESCキーを押してノーマルモードに戻る
  3. aliaes」という語の「e」という文字にカーソルを移動し(図 1.6)、「x」キーを押す
images/figures/aliaes
図 1.6: x」キーで文字を1つ削除する練習の準備

Vimでテキストの一部を削除する方法はそれこそ無数にあるのですが、少々面倒な代わりに覚えやすい方法として、まずはxキーを連打して1文字ずつ削除する方法を覚えておきましょう。これなら最終的に語全体や行全体も削除できます。また、ある1行全体を一発で削除する操作も非常に便利なので、これも合わせて覚えておきましょう。さっき追加した余分な「alias」という語のある行にカーソルを置いた状態で「dd」となるようにdキー24を2回押してください。これでその行が一発で削除され、行と行の間も自動で詰めてくれます(図 1.7)。今削除した行をそのまま貼り付けて元に戻すには、「p」キー25を押します。これで、削除した行がカーソル行のすぐ下に挿入され、元に戻ります。pキーを押すたびに、いわゆる「コピペ」の貼り付けと同じ感覚でその行が1つずつ追加されます。

繰り返しますが、ここで学んでいるのはVimの膨大なキー操作のうち、最小限必要なごくごく一部のものにすぎません。もっと便利な操作法を知りたくなったら、いくらでも学ぶ方法があります26

images/figures/no_alias
図 1.7: ddで1行削除した結果

1.5.1 演習問題

  1. Vimで「foo.txt」という新しいファイルを開いてみましょう。
  2. そのファイルに「A leopard can’t change it’s spots.」という文字列を挿入してみましょう(図 1.827
  3. 上で入力した行で、xキーを使って間違った文字を削除し、文字列を修正しましょう。間違いが見当たらない場合は表 1.1を参照してください。
  4. ddキーでその行全体を削除しましょう。続いて、pキーを連打してその行を繰り返しドキュメントに貼り付けましょう。
  5.  1.4.1の最初の演習問題を参照して、ドキュメントの保存とVimの終了をコマンド一発で行ってみましょう。
images/figures/leopard
図 1.8: このヒョウが模様を変化させる能力についてたびたび疑問が寄せられている

1.6 大きなファイルを編集する

Vimを編集するための最小限の操作を学んできましたが、いよいよ最後のスキルは、大きなファイルの中を上や下に移動する方法です。先の 1.4sonnets.txtをまだダウンロードしていない方は、まずリスト 1.7を実行してください28

リスト 1.7: シェークスピアのSonnetsをダウンロードするコマンド
$ curl -OL https://cdn.learnenough.com/sonnets.txt

このファイルには、シェークスピアのソネット(2620行、17670語、95635文字)がまるごと収録されています。なお、『コマンドライン編』で学んだように、「 wc」コマンドで簡単にワードカウントを取れます。

$ wc sonnets.txt
    2620   17670   95635 sonnets.txt

Vimは多くのシステムで、開いたファイルの統計情報を以下のようにある程度表示してくれます。

$ vim sonnets.txt

私のシステムの場合は図 1.9のように表示されます。ファイルがこれだけ大きいと、先ほどのようにカーソルで一文字づつ移動していては疲れてしまいますね。

images/figures/sonnets_stats
図 1.9: Vim起動時に表示される統計情報

他のコマンドと同様に、Vimにはファイル内を自由に行き来するコマンドも山ほどありますが、その中でも私が特に便利だと感じている操作は「1画面ずつ下または上へ進む」「ファイル冒頭への移動」「ファイル末尾への移動」「検索」なので、まずはこれらのコマンドを覚えてみましょう。これから説明するコマンドはいずれもノーマルモードで実行します。

1画面下に進むにはCtrl-Fキー29、1画面戻るにはCtrl-Bキー30。ファイルの末尾に一発で移動するには、大文字のGを入力します。ファイルの冒頭に一発で移動するには1G、つまり1に続けてGと入力します。最後に、最も有用なナビゲーションコマンドといえばやはり検索でしょう。検索は、「/文字列」のように/に続けて文字列を入力し、最後にReturnキーを押すと、最初の該当箇所にジャンプします。そのままnキーを押すと次の該当箇所がある場合はジャンプし、ない場合はメッセージが表示されます。

これらの操作は、どうもどこかで見たような気がしますね。というのも、『コマンドライン編』で学んだ中にあるlessというファイルの内容を表示するプログラムと同じ操作だからです31。このように、多くの手法がさまざまな場面でも通用することが、基本的なUnixコマンドを学ぶことで得られる大きなメリットのひとつです。

1.6.1 演習問題

  1. Vimでsonnets.txtを開き、3画面下に移動し、続いて3画面戻って元の画面に移動しましょう。
  2. ファイルの末尾に移動しましょう。ソネットの最後の行には何と書いてありますか?
  3. sonnets.txtの冒頭に戻ってください。そして冒頭行にある古いスペルの「Shake-speare」を新しい「Shakespeare」というスペルに変更し、結果を保存しましょう。
  4. Vimの検索機能を用いて、「Cupid」(ローマの愛の神)を参照している部分がいくつあるか見つけてみましょう。
  5. 18G」と入力すると、冒頭のソネットの最終行にジャンプすることを確認しましょう。このコマンドが何を行ったのかを推測してみましょう。ヒント: 「1G」と入力したときは、ファイルの冒頭(つまり1行目)に移動しましたよね。

1.7 まとめ

本節で取り扱った重要なコマンドを表 1.1にまとめました。

コマンド 説明
ESC:q!<return> 「最も重要なVimコマンド™」
i ノーマルモードから挿入モードに切り替える
ESC 挿入モードからノーマルモードに戻る
矢印キー 上下左右への移動
0 行頭に移動
$ 行末に移動
:w<return> ファイルを保存(書き込む)
:q<return> ファイルを閉じて終了(未保存ファイルは閉じられない)
:wq<return> ファイルを保存して終了
:q!<return> 強制終了(変更を保存しない)
u 取り消し(アンドゥ)
x カーソルがある場所の文字を削除
dd カーソルがある行をまるごと削除
p dで削除したテキストを貼り付ける
it’s spots スペルミス: 「its spots」が正しい
Ctrl-F 1画面下へ進む
Ctrl-B 1画面上へ進む
G ファイルの末尾に移動
1G ファイルの冒頭に移動
/文字列 文字列」を検索する
表 1.1: 1で学んだ重要なVimコマンド

1.7.1 演習問題

  1. sonnets.txtをVimで開いてみましょう。
  2. そのファイルの末尾(最終行)に移動しましょう。
  3. そのファイルの冒頭(先頭行)に移動しましょう。
  4. 「That’s all, folks! Bard out. <drops mic>」という行を新たに追加しましょう。文末のピリオドを動かさないように注意して、そこからカーソルをスペース1個分右に移動できるかどうかやってみましょう。
  5. このファイルを保存してみましょう。
  6. 今の変更を取り消してみましょう。
  7. 結果を保存してVimを終了してみましょう。
  8. 今のファイルをもう一度Vimで開き、「2620dd」と入力してみましょう。
  9. ファイルの中身が全部消えたことを確認し、続いてファイルを壊さないために例の「最も重要なVimコマンド™」を実行してみましょう。
1. 本チュートリアルを学ぶためにUnixコマンドラインの知識が必要な理由は2つあります。1つ目は、コマンドラインからテキストエディタを起動する方法を学ぶため、2つ目はコマンドラインで実行するシェルプログラムをカスタマイズしたり拡張したりする例も含まれているためです
2. 単に「テキスト」と略されることもよくあります。
3. テキストというデータ形式がどれほど強力であるかについて詳しくは『always bet on text(英語)』をご覧ください。
4. 「技術的には」、たとえばem dash文字「‘—’」は生のUnicode文字としてテキストエディタに表示され、&mdash;とは表示されませんが、後者は前者と同等であり、テキストをレンダリング表示するときに整形されます(ほとんどのブラウザでは、Unicodeを正しく表示するために「完全な」HTMLドキュメントと正しいヘッダーが必要ですが、こうした考慮点について詳しくは『HTML編』で扱います)。
5. 書式がどのように表示されるかは、それこそアプリケーション次第で決まります。たとえば、HTMLはChromeやSafariといったWebブラウザでレンダリング(=表示内容の生成)および表示を行うよう設計されています。ブラウザでは、強調指定をイタリックで表すのが普通です。
6. 「What You See Is What You Get」の頭文字を取ったもので、編集内容と画面上の最終出力が同じという意味。
7. ワープロソフトがバージョンアップした場合に起こる、過去のバージョンで保存されたファイルの文字化けや表示崩れ・何らかのエラーでファイルが開けないトラブルを「壊れる」と表現することがあります。
8. IDE(統合開発環境)を日常的なプログラミングに愛用しているユーザーも多くいますが、こうしたIDEには必ずテキストエディタが内蔵されているので、本チュートリアルで学んだ内容がそのまま通用します。
9. クラウドIDEにはコマンドライン機能もテキストエディタも最初から組み込まれています。『Railsチュートリアル』ではCloud9の導入方法を解説しています。
10. 詳しくは「Git/GitHub編」をご覧ください。
11. Vimのそうした点が『コマンドライン編』のようなコマンドラインチュートリアルで重宝するゆえんです。
12. もともとBourne shellというプログラムが最初にあったのですが、ダジャレを愛するUnixの伝統の中で、キリスト教のborn again(新生)をもじってBourne Again Shellと呼ばれるようになりました。
13.コマンドライン編』で、~記号がホームディレクトリを表すと説明されていたことを思い出しましょう。つまりリスト 1.3~/.bash_profileの部分は、ホームディレクトリの直下にあるBashプロファイルのファイルを表しています。
14. 大きなファイル内での移動方法については後ほど 1.6で説明します
15. Vimの操作に詳しい人たちならきっと「もっといい方法があるよ!」とhキーやjキーやkキーやlキーで移動する方法を教えるでしょう。しかしこの操作を直感的に行えるようになるまでにはかなり時間がかかりますし、矢印キーの操作でも「技術の成熟」を身に付けられます。
16. これらの操作はOSに備わったキーバインディングではありません。例えばmacOSならCommand-左矢印キーとCommand-右矢印キーが相当します。1でご説明したように、こうした操作まで説明するとますます複雑で覚えづらくなります。私が初心者にメインのエディタとしてVimをおすすめしていない理由のひとつです。
17. 歴史的な理由により、特にファイル操作に関連する一部のVimコマンドはコロン :で始まります。
18. ノーマルモードではESCをいくら連打しても問題は起きませんので、普段からESCキーを叩いてから何かをする習慣をつけるとよいでしょう。
19. Zshでのエイリアス作成法はBashと少し異なります。詳しくは「Using Z Shell on Macs with the Learn Enough Tutorials(英語)」を参照してください。エイリアスを作成するための構文はBashでもZshでも同じですが、Bashでは.bash_profileにエイリアスを定義するのに対し、Zshでは.zshrcにエイリアスを定義する点だけが異なります。実はBashでは.bashrcという設定ファイルにもエイリアスを追加できるので、これで考える方がBashとZshの対応関係がよりわかりやすくなるでしょう。
20. うまい具合に私の名字と同じということもあって個人的に気に入っています
21. 他のプログラムでは、Undoを実行する場合Command-ZやCtrl-Zが広く使われています。
22. なお、Bashでは前後にスペースを置いた単独のドット(.)は「source」のショートハンドでもあるので、「. .bash_profile」と入力しても同じ結果を得られます。このドットはカレントディレクトリを表すドットとは違いますのでご注意ください。
23. 必要なリダイレクトも実行されます。
24. deleteのdと覚えるとよいでしょう。
25. putのpと覚えるとよいでしょう。
26. 例えば『Vim幼稚園からVim小学校へ』という記事もどうぞ。
27. 画像引用元: https://www.flickr.com/photos/tambako/4703806355 ( 2015-11-12)、Creative Commons Attribution-NoDerivs 2.0 Genericライセンスに基づいて無加工で利用。
28.  2.7.1の演習を終えていれば、curl -OLの代わりにもっと短いgetエイリアスを使えます。
29. forwardと覚えるとよいでしょう。
30. backwardと覚えるとよいでしょう。
31. ただし、システムによってはVimとlessの操作方法がちょっぴり異なる可能性もあります。たとえば、私のシステムだとlessでスラッシュ/検索を行うと大文字小文字を区別しますが、Vimで同じ操作を行うと大文字小文字を区別しません。こうした微妙な違いは「技術の成熟」(コラム 1.2)の精神で克服しましょう。
前の章
第1章 テキストエディタとは テキストエディタ編
次の章