Gauche の環境を整える為、rlwrap と vim で利用する辞書と、vim で利用する syntax ファイルを生成する

まずは、こちらから make_gosh_completions.scm を頂く。
なんとなく、下記のように書き換えて、名前を gosh_dict_maker.scm として保存。

#!/usr/bin/env gosh

(use gauche.interactive)

(define (main args)
  (let loop ((line (read-line)))
    (if (eof-object? line)
      (with-input-from-string
        (with-output-to-string
          (lambda ()
            (apropos '||)))
        (lambda ()
          (let loop ((line (read-line)))
            (unless (eof-object? line)
              (let1 symbol (read-from-string line)
                (when (global-variable-bound? (current-module) symbol)
                  (write symbol)
                  (newline))
                (loop (read-line)))))))
      (begin
        (with-error-handler
          (lambda (e)
            (warn (ref e 'message)))
          (lambda ()
            (eval `(use ,(string->symbol line)) (interaction-environment))
            (print line)))
        (loop (read-line))))))

次に、下記のような Perl Script を用意し・・・

#!/usr/bin/env perl

use strict;
use warnings;
use feature qw(:5.10);

use version; our $VERSION = qv('0.0.1');

use Carp;
use English qw(-no_match_vars);

use FindBin qw($Bin);
use Path::Class;
use List::MoreUtils qw(uniq);

use Readonly;
Readonly my $MODULES_FILE     => $Bin . '/gauche_modules';
Readonly my $COMPLETIONS_FILE => $Bin . '/gosh_completions';

make_modules_file(get_modules(@ARGV));
make_dict_file();
exit;

sub get_modules {
    my @dirs = @_;
    my @modules;
    for my $dir (@dirs) {
        next if ! -e $dir;
        dir($dir)->recurse(
            callback => sub {
                my $file = shift;
                return if $file->is_dir;

                $file = substr "$file", length($dir) + 1;
                return if $file !~ /\.scm$/mx;

                $file =~ s{\.scm$}{}mx;
                $file =~ s{/}{.}mxg;
                push @modules, $file;
            }
        );
    }
    return \@modules;
}

sub make_modules_file {
    my $modules = shift;

    my $fh = file($MODULES_FILE)->openw or croak $OS_ERROR;
    $fh->print(
        join "\n", sort {$a cmp $b} uniq @$modules
    ) or croak $OS_ERROR;
    $fh->close or croak $OS_ERROR;
}

sub make_dict_file {
    return if ! -e $MODULES_FILE;

    my $fh = file($COMPLETIONS_FILE)->openw or croak $OS_ERROR;

    $fh->print(
        join "\n", sort {$a cmp $b} grep {1 < length($_)}
            uniq split /\n/, `cat $MODULES_FILE | $Bin/gosh_dict_maker.scm`
    );

    $fh->close or croak $OS_ERROR;
}

実行して・・・

% gosh_dict_maker.pl /path/to/gauche/0.8.13/lib /path/to/gauche/site/lib

gauche_modules と gosh_completions を作る。
gosh_completions は、補完用の辞書なので、そのまま ~/.gosh_completions に配置すれば rlwrap の辞書として使えるし、下記のように .vimrc に記述すると vim の辞書として使える。

autocmd FileType scheme set complete+=k~/.gosh_completions

続けてこちらから make_scheme_vim.scm と scheme.vim.tmpl を頂き、下記のようにすると・・・

% cat ./gosh_completions | gosh ./make_scheme_vim.scm ./gauche_modules ./scheme.vim.tmpl > ./scheme.vim

scheme.vim が出来るので ~/.vim/syntax 等に配置して利用する。