増井ラボノート コロンブス日和

第9回 ExpandHelp

この記事を読むのに必要な時間:およそ 3.5 分

GitHelp

Mac版のExpandHelpは毎日使うようなものではないにもかかわらずヘルプデータの用意は面倒なので,結局あまり使わなくなってしまいました。万人向けの一般的なヘルプデータを用意するのはたいへんですが,自分が毎日のように使う複雑なシステムの利用を助けてくれるシステムならばもっとうれしいだろうと考え,Gitのヘルプシステム「GitHelp」を作ってみました。

バージョン管理システム「Git」は,最近プログラマの間で広く使われていますが,基本概念もコマンド構成も複雑なのが難点です。Gitには100個以上のサブコマンドが存在するうえに各サブコマンドの仕様も複雑です。バージョン履歴のログを表示するgit logコマンドのマニュアルページは2,000行近くもあり,これだけでも機能を理解するのは困難になっています。

Gitのコマンドに詳しいユーザでも,ちょっと標準と異なることをやりたい場合には,Gitの機能をどう組み合わせて使えば良いのか悩むことがあります。ユーザのさまざまな要求に対して良い解決手順を記述しておき,ExpandHelpの要領で検索できるようにしておけば便利です。GitHelpはGitに関するExpandHelpをコマンドラインから使えるようにしたシステムです。

たとえば「昨日のREADME.mdを見たい」と思っても,標準的なGitコマンドや引数でこれを実行することは簡単ではありません。git logコマンドでREADME.mdの編集履歴を参照し,昨日のコミットIDを見つけてgit cat-file-p (コミットID):README.mdのようなコマンドを起動すれば良いのですが,これはなかなか面倒な作業ですし操作を覚えるのはたいへんです。実はコミットIDを取得しなくてもgit cat-file-p "@{yesterday}":README.mdというコマンドで実行できるのですが,こういうマイナーな機能があることを知っているユーザは多くないでしょう。

GitHelpでは,⁠昨日の(#{pat})ファイルを表示する」という説明パターンとgit cat-file-p "@{yesterday}":#{$1}というコマンドパターンのペアを用意しておくことにより,⁠昨日」⁠README」のようなキーワードを指定するだけで 必要なコマンドを検索してリストできます。

$ githelp 昨日 AD
[0] 昨日の「README.md」ファイルを表示する
  % git cat-file -p "@{yesterday}":README.md
[1] 昨日の「data/adddelete.rb」ファイルを表示する
  % git cat-file -p "@{yesterday}":data/
adddelete.rb
[2] 昨日の「data/afteradd.rb」ファイルを表示する
  % git cat-file -p "@{yesterday}":data/
afteradd.rb
$

ここではコマンドの候補がリストされているだけですが,-xオプションを指定すると候補を選択して実行させることができます。

$ githelp 昨日 AD -x0
# GitHelp

**Gitのコマンドの使いこなしを支援**

### 解決したい問題
...

GitHelpのヘルプデータはリスト1のような配列になっています。各配列要素の1行目がヘルプ文字列のパターンになっており,2行目がそれを実行するためのコマンド文字列になっています。

リスト1 GitHelpのヘルプデータ

[
  [
    "昨日の「(#{files.join('¦')})」ファイルを(表示する¦見る)",
    'git cat-file -p "@{yesterday}":#{$1}'
  ],
  [
    "「(#{files.join('¦')})」ファイルを (#{numbers.join('¦')})日前の (もの¦バージョン)と比較する",
    'git diff HEAD "@{#{$2} days ago}" #{$1}'
  ],
  [
    "「(#{files.join('¦')})」ファイルをひとつ前のコミットと比較する",
    'git diff HEAD^ #{$1}'
  ],
  [
     "(#{numbers.join('¦')})日前から(変化した¦変わった¦変更された)ファイルをリストする",
    'githelp-changed \'#{$1} days ago\''
  ],

README.md,Rakefile,...のようなファイルがGitに管理されている環境において,ユーザがgithelp 昨日 ADを実行すると,files()の結果が['README.md', 'Rakefile', ...]のような値になるので,最初のパターンは"昨日の「(README.md¦Rakefile¦...)」ファイルを(表示する¦見る)"のようになります。この正規表現を展開した結果得られる文字列の中の昨日のREADME.mdファイルを表示するという文字列がユーザの与えたキーワード昨日ADとマッチするので,それに対応するコマンドgit cat-file-p "@{yesterday}":READMEを実行できるようになります。

このようにGitHelpでは,やりたいことの一部を示すだけでヘルプ情報を検索し,実行まで行うことができることがわかります。

ExpandHelpの実装

今回はRubyで正規表現展開ライブラリre_expandをまず実装し,それを使ってExpandHelpを実装しています。

ExpandHelpはアイデア自体は単純なのですが,正規表現の展開が必要なのでre_expandも含めると残念ながら実装はちょっと複雑になってしまいました。しかし,ヘルプなどの検索を行うときにGenerate and Testのような方法が有効だということに気づいたのはコロンブスの卵的だと思っています。GitHelpは実際毎日のGit活用に有用なので,ヘルプデータをもっと整備して毎日使っていこうと考えています。

GitHelpはhttps://github.com/masui/GitHelpで公開しており,gem installgithelpで簡単にインストールできるので,ぜひご利用ください。

Software Design

本誌最新号をチェック!
Software Design 2019年12月号

2019年11月18日発売
B5判/200ページ
定価(本体1,220円+税)

  • 第1特集
    サーバーレスでめざせ! インフラ管理ゼロなシステム
    基本のAWS Lambdaからフルサーバーレスまで
  • 第2特集
    12月6日発売『みんなのPHP』コラボ!
    PHPプログラミング・アラカルト
    なぜ愛され,なぜ進化するのか?
  • 短期連載
    Webサービスを裏で支える!! バッチ処理設計の勘所
    【1】バッチ処理の特徴と設計のポイント
  • 短期集中連載
    Webエンジニアのための時短スマホアプリ開発
    【2】React.jsをおさらいし,React NativeによるUI構築の基本を知ろう

著者プロフィール

増井俊之(ますいとしゆき)

1959年生まれ。慶應義塾大学環境情報学部教授。ユーザーインターフェースの研究者。東京大学大学院を修了後,富士通半導体事業部に入社。以後,シャープ,米カーネギーメロン大学,ソニーコンピュータサイエンス研究所,産業技術総合研究所,Appleなどで働く。2009年より現職。携帯電話に搭載される日本語予測変換システム『POBox』や,iPhoneの日本語入力システムの開発者として知られる。近著に『スマホに満足してますか? ユーザインターフェースの心理学』。