【Vim】指定されたPerlモジュールのソースファイルを開く


Perlモジュール名を指定するとそのソース(.pmファイル)を開いてくれるコマンド。已にどっかにありそうな機能ではあるが、勉強のために作ってみた。

使い方

openPM.vimをpluginディレクトリ(Unix系なら~/.vim/plugins、Windowsなら$HOME/vimfiles/plguin)に、searchPM(WindowsはsearchPM.bat)をパスの通ったディレクトリに置き、実行権限を与える。そしてVimを起動し、

:OpenPM モジュール名

で、.pmファイルが開く。モジュール名が指定されなかった場合は、カーソル下にある文字列を認識して開く。

使用例

こんなファイルでカーソルをここにおいて、

100211-0001.png
:O<Enter>」とすると、モジュールのソースが開く。

100211-0002.png

ソース

openPM.vim

function! OpenPM(pm)
    let pm = a:pm
    " もしpmがnullなら
    if !strlen(pm)
        " カーソル下にある、アルファベット、数字、コロンの組み合わせを
        " モジュール名として取得
        setlocal iskeyword=a-z,A-Z,48-57,_,:
        let pm = expand('<cword>')
        setlocal iskeyword<
    endif

    " searchPMを使ってファイル名を取得
    let pmfile = system('searchPM ' . shellescape(pm))

    " 取得できなかったら
    if !strlen(pmfile)
        echohl ErrorMsg
        echo 'ファイルが見つかりません : ' . pm
        echohl None
        return
    endif

    " ファイルを開く
    execute 'edit ' . pmfile
endfunction
command! -nargs=? OpenPM :call OpenPM('<args>')

searchPM

#!/usr/bin/perl
use strict;
use warnings;
$ARGV[0] or exit;
( my $path = $ARGV[0] ) =~ s!(::|-)!/!g;
for ( @INC ) {
    my $pm = "$_/$path.pm";
    ( my $pod = $pm ) =~ s!pm$!pod!;
    my $file = -f $pm ? $pm :
        -f $pod ? $pod : undef;
    if ( $file ) {
        print $file;
        last;
    }
}

searchPM.bat (Windows用)

@rem = '--*-Perl-*--
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
perl -x -S %0 %*
if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
goto endofperl
@rem ';
#!/usr/bin/perl
#line 15

use strict;
use warnings;
$ARGV[0] or exit;
( my $path = $ARGV[0] ) =~ s!(::|-)!/!g;
for ( @INC ) {
    my $pm = "$_/$path.pm";
    ( my $pod = $pm ) =~ s!pm$!pod!;
    my $file = -f $pm ? $pm :
        -f $pod ? $pod : undef;
    if ( $file ) {
        print $file;
        last;
    }
}

__END__
:endofperl
@rem = vim:syn=perl

コメントを残す