infoのひと手間

Gaucheのreplではinfo手続きを使ってinfoドキュメントを参照することができます。関数の引数を確認したりするのに便利なんですが、知りたい関数の名前を含んだページ全体が表示されるので、ページャをスクロールさせないと見えない場合があります。そこで、~/.gauchercに以下のマクロを追加して、ページャの起動時に検索パターンを渡すようにしてみました。

;; ~/.gaucherc
(use gauche.interactive.info)
(define-macro (info fn)
  (define (%info fn)
    (with-module gauche.interactive.info
      (or (and-let* ([string? *pager*]
                     [orig *pager*]
                     [alt (case (string->symbol (sys-basename *pager*))
                            [(more) (^p (list orig "-p" #`"+/^ --.+: ,p"))]
                            [(less) (^p (list orig "-p" #`"^ --.+: ,p"))]
                            [(lv)   (^p (list orig #`"+/^ --.+: ,p"))]
                            [else #f])])
            (dynamic-wind
              (^[] (set! *pager* (alt (regexp-quote (x->string fn)))))
              (^[] (info fn))
              (^[] (set! *pager* orig)))
            (values))
          (info fn))))
  (let1 fn (if (pair? fn) (cadr fn) fn)
    `(,%info ',fn)))

more・less・lvそれぞれで以下のように動作が微妙に異なるので、場合分けしています。

  • moreは"-p"オプションが指定されていないと、パイプから読んだ内容にマッチさせた場合1行下にずれる
  • lessで"+/..."という形式で指定すると"$"を含んだパターンの検索に失敗する

あと、マクロにしているのは、引数のクオートを忘れがちなので、クオートしなくても検索できるようにするためです。
よかったらreplのお供にどうぞ。