あふで peco を使う

Windows ファイラーの あふw で、peco を使ってフォルダ履歴をいい具合に使いたい。業務上、あっちこっちの Windows Server を UNC パスによりあふで見まくってて、よく使うフォルダ登録だけではきつくなってきたので、履歴からさくっとアクセスできるといいなぁと。

ということで、いろいろやってたら、bat 書いて、perl 書いて、jscript 書いての実装となってしまったが、非常に実用的になった。migemogrep も併せると日本語フォルダにも対応できて最高。

以下のとおり実装した。それぞれのスクリプトは C:\local\bin\afxw\script に置く。

afxw-peco.bat

このバッチはあふから実行するもの(Shift-h に割り当て)で、あふのフォルダ履歴を peco に食わせて、絞り込んだ結果を js を介してあふに渡す。js に渡す前に iconv で cp932 に変換する。Windows バッチの書き方がいまいちよくわからん…。

@echo off

cd /d C:\local\bin\afxw\script

for /f "delims=" %%i in ('perl afxw-hist.pl ^| peco ^| iconv -f UTF-8 -t CP932') do (
    cscript afxw-cd.js "%%i"
    break
)

afxw-hist.pl

あふのオートメーションサーバ機能でフォルダ履歴を取ってきて、出力する。さくっと Perl で。

#!/usr/bin/env perl

use 5.010;
use strict;
use warnings;
use utf8;
use Encode;
use Win32::OLE;

my $afxw = Win32::OLE->new('afxw.obj');

my (@dirs, %h);
for my $window (0, 1) {
    my  $count = $afxw->HisDirCount($window);
    for (my $i = 0; $i < $count; $i++) {
        my $dir = decode('cp932', $afxw->HisDir($window, $i));
        push @dirs, $dir unless $h{$dir};
        $h{$dir} = 1;
    }
}

say encode('utf8', $_) for @dirs;

afxw-cd.js

指定したフォルダをあふのオートメーションサーバ機能で開く。

var args = WScript.Arguments;
var dir = args(0);

var afxw = WScript.CreateObject("afxw.obj");
var cd = '&EXCD -P"' + dir + '"';
afxw.Exec(cd);

afxw.ini

フォルダ履歴はデフォルト 36 個なので、増やす。あまり多すぎると重くなるのかしら。

HISMAX=4096

afxw.key

あふで Shift-h すると、peco (コマンドプロンプト) が起動するように。

K0026="1072C:\local\bin\afxw\script\afxw-peco.bat"