2023年7月30日日曜日

PPvでEPWING形式の辞書を引く

PPvで、カーソル位置の/範囲選択した単語をEPWING形式の辞書で検索し、PPv[X]にその内容を表示する。

必要なもの

EBWIN4には、EPWING形式の辞書をあらかじめ登録しておこう。

準備

以下のファイルをScriptフォルダに保存する。dic.luaのEBWIN4のパスは環境に応じて読み替えてください。

--EBWIN4で検索した結果をファイルに出力
--第一変数:検索語
--第二変数:出力ファイルパス
ebwin="D:\\bin\\EBWIN4\\ebwinc.exe /C=1 /E=u"
nyagos.exec(ebwin .. " " .. arg[1] .. " > " .. arg[2])
view raw dic.lua hosted with ❤ by GitHub
//!*script
// PPvのカーソル位置にある文字を返す
// 単語が空白区切りであることが前提
// 例: *linemessage %*script(%0\Script\selectword.js)
var linetext = PPx.Extract('%*selecttext');
var lh = PPx.Extract('%lH');
// var blankpos = linetext.indexOf( ' ' );
// 文字列を左右に分割し、空白前/後を削除
var lstr = linetext.substr( 0, lh ).replace(/.*\s(.*?)$/, '$1');
var rstr = linetext.substr( lh ).replace(/^(.*?)\s.*/, '$1');
// 文字列を再結合
var str = lstr+rstr;
// 句読点等を取り除く
var result = str.replace(/(\.|\,|\"|\'|\!|\?|\;|\:)/g, '');
// ’以前を取り除く。フランス語の単語抽出用
var result = result.replace(/.*’(.*)$/, '$1');
// 文字数が45を超えていれば以降のコマンド実行を中止
if (result.length > 45){
PPx.SetPopLineMessage("文字数が多すぎます");
PPx.Quit(-1);
}
PPx.Result = result;
PPx.Quit();
view raw selectword.js hosted with ❤ by GitHub

カーソル位置の単語を検索

単語が空白区切りになっている英文等の場合はこちらが便利。 [I]でキャレットモードにして、辞書を引きたい単語上にカーソルを置いてから、以下のコマンドを実行する。

*string o,tempfile=%*temp(name,f) %: %Oi nyagos -f %0Script\dic.lua %*script(%0Script\selectword.js) %so"tempfile" %: *ppv -utf8 -bootid:x -r %so"tempfile" -k *selectppx %n

一時ファイルが一々つくられるのが嫌な場合は、以下を適当なキーに登録して実行する。

*ifmatch "!o:e,a:d-",%si"tempfile" %: *string i,tempfile=%*temp(name,f)
%Oi nyagos -f %0Script\dic.lua %*script(%0Script\selectword.js) %si"tempfile"
*ppv -utf8 -bootid:x -r %si"tempfile" -k *selectppx %n

単語を範囲選択して検索

日本語で辞書を引くとき等は、単語の自動取得が難しいので、おそらくこちらの方法を取ることになる。

*string o,tempfile=%*temp(name,f) %: %Oi nyagos -f %0Script\dic.lua %*selecttext %so"tempfile" %: *ppv -utf8 -bootid:x -r %so"tempfile" -k *selectppx %n

参考

2023年7月29日土曜日

PPvで単語を考慮した折り返し

PPvで折り返し表示をしている場合、右端にある英単語が途中で改行される場合がある。 busyboxのfoldコマンドを利用してこれを解決する。

*ppv %C -esc:on -text -utf8 -document:"busybox fold -w 80 -s %%C > %%si'TempFile'"

nkfをかませる場合は以下のようになる。

*ppv %C -esc:on -text -utf8 -document:"nkf -w %%C | busybox fold -w 80 -s > %%si'TempFile'"

2023年7月28日金曜日

PPvでカーソル位置の単語(空白区切り)を取得

外国語の文献を読むとき、カーソル位置の単語を自動で取得できれば、それを辞書ソフトに投げることができて便利そうだなと思い、スクリプトを作った。

//!*script
// PPvのカーソル位置にある文字を返す
// 単語が空白区切りであることが前提
// 例: *linemessage %*script(%0\Script\selectword.js)
var linetext = PPx.Extract('%*selecttext');
var lh = PPx.Extract('%lH');
// var blankpos = linetext.indexOf( ' ' );
// 文字列を左右に分割し、空白前/後を削除
var lstr = linetext.substr( 0, lh ).replace(/.*\s(.*?)$/, '$1');
var rstr = linetext.substr( lh ).replace(/^(.*?)\s.*/, '$1');
// 文字列を再結合
var str = lstr+rstr;
// 句読点等を取り除く
var result = str.replace(/(\.|\,|\"|\'|\!|\?|\;|\:)/g, '');
// ’以前を取り除く。フランス語の単語抽出用
var result = result.replace(/.*’(.*)$/, '$1');
// 文字数が45を超えていれば以降のコマンド実行を中止
if (result.length > 45){
PPx.SetPopLineMessage("文字数が多すぎます");
PPx.Quit(-1);
}
PPx.Result = result;
PPx.Quit();
view raw selectword.js hosted with ❤ by GitHub

PPvをキャレットモードにし、以下のようなコマンドを打つ。

*linemessage %*script(%0Script\selectword.js)

2023年7月2日日曜日

PPv起動用PPc

カレントフォルダとは無関係な場所にあるファイルを、PPvで表示したい場合がある。

  • [ENTER] カーソルファイルをPPvで開き、自窓を閉じる

というキーバインドのPPcを用意することで、これを実現する。

準備

以下を編集して取込。

K_forppv    = {
ENTER    ,*ifmatch "o:e,a:d+","%*name(CD,"%R","%1")" %: %K"@ENTER" %: *stop
    *if %*js("PPx.result=PPx.SyncView") %: %Oi *windowsize %si"ppvid",%*windowrect(,w),%*calc("%*windowrect(,h)*2") %: *closeppx %n %: *stop
    %Oi *ppv %*name(CD,"%R","%1") -k *fitwindow %N,%%N,20 %%: *closeppx %n
\Y    ,*if %*js("PPx.result=PPx.SyncView") %: *ppvoption sync off %: *stop
    %Oi *ppv -k *setcust _User:id=%%*rightstr("%%n", 1) %: *fitwindow %N,%NV%*getcust(_User:id),30 %: *string i,ppvid=%NV%*getcust(_User:id) %: *ppvoption sync %*getcust(_User:id) %: *fitwindow %N,%NV%*getcust(_User:id),3
Q    ,*ppvoption sync off %: *closeppx %n
}

KV_main    = {    ; PPvメイン窓
O    ,%Oi *string i,ppcid=
 *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)/2")
 *ppc -r -bootid:v -single -k *jumppath %FD -entry:%FC %%: *string i,ppvid=%N %%: *mapkey use,K_forppv %%: *ppvoption sync %*rightstr("%n", 1)
 *fitwindow %N,%NCV,4
}

操作

以下のコマンドで、PPc[V]が開く。

*ppc -r -bootid:v -single -k *mapkey use,K_forppv

キーバインドは以下の通り。

  • [ENTER] カーソルファイルをPPvで開き、自窓を閉じる
  • [\Y] 連動ビュー

連動ビュー中にEnterを押すとPPc[V]が閉じ、PPc[V]があったスペース分PPvが拡大する。

PPvには、以下のキーバインドが追加される。

  • [O] PPvの大きさが半分に。空いたスペースにPPc[V]を表示、かつ連動ビュー状態に