9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

上智大学エレラボAdvent Calendar 2020

Day 5

readlineとは何か、どんな問題があるか

Last updated at Posted at 2020-12-04

この記事は、上智大学エレクトロニクス研究部Advent Calendar第5日目の記事です。

まえがき

コマンドのインストール時にエラーが発生する場合、 readline が絡んでいることが多いです。これは readline にバグがあるわけではなく、それだけ多くのコマンドに readline が使われているということの証です。しかし、この readline とは一体何者なのでしょうか。この記事ではそれを明らかにします。

readline の役割

readline はラインエディタというものの一種で、ライブラリとして配布されています。その名の通り、ライン(行)をエディタ(編集するもの)という意味で、一般的にシェルがコマンドを受け付けるところで使われています。コマンドは基本的に1行しかないためこのような名前になっているわけです。

readline の必要性

単に文字を入力するだけであればエディタまでリッチなものは必要ありません。しかし、高度なカーソル移動、履歴機能、さらにインクリメンタルサーチといった機能を提供するためには、たくさんコードを書く必要があります。具体例としてrubyによるreadlineの実装だと8,926行にも及びます。
そこで、共通化できる部分ライブラリ化してしまいみんなで共有しようということになったわけです。ライブラリ化は開発の手間が減るだけでなく、ユーザー側にもメリットがあります。使うコマンドによって動作が異なったら扱いにくくなってしまいますよね。共通化することで操作方法を統一できるため、ユーザーも操作を覚えやすくなります。

readline の落とし穴

そんな素晴らしい readline ですが、ライセンスの問題で(主に)MacOSユーザーを悩ませています。
readlineGPLv3 というオープンソースライセンスで公開されています。細かい説明は省きますが、このライセンスにはコピーレフトという特徴があり、 readline を利用してアプリケーションを開発する場合は、その開発したアプリケーションのソースコードを公開してねという約束になっています。
これが厄介で MacOS を開発しているAppleは自分たちが開発したコードを秘密にしておきたいので readline を利用してアプリケーションを開発することができません。そこで、コピーレフトではないラインエディタ libedit を利用することになりました。
このラインエディタは基本的に readline と互換性があると言われていますが、履歴ファイルの形式や、キーボード操作のデフォルト設定が異なっています。そのため行編集ツールが libedit であると見抜ける人でないと(MacOSでCUIを使いこなすのは)難しいというのが現状です。

readline をカスタマイズする

~/.inputrc を編集することでキーバインドの設定を変えることができます。細かい設定を解説すると分量が膨れ上がってしまうので、ここではいくつかの記事を紹介する程度に留めておきます。

参考文献

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?