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