2024年10月21日月曜日

リストファイルの表示形式を事前に変更

リストファイルの用途は様々で、その用途に応じて適切な表示形式もかわる。リストファイルにジャンプしたあと、一々[;]で切り替えるのも面倒なので、事前にコマンドで変更できるようにする。

やり方

以下のコマンドを、リストファイルへのジャンプ前に一度実行する。これは一覧1(&L)に切り替える例。

*string o,hoge=一覧1(&L) %: *diroption -listfile cmd:"*viewstyle -listfile %so"hoge" %%: *diroption -listfile cmd:"""

一覧&2なら次のようになる。

*string o,hoge=一覧&2 %: *diroption -listfile cmd:"*viewstyle -listfile %so"hoge" %%: *diroption -listfile cmd:"""

以下は*whereisと組み合わせた例。

*string o,hoge=一覧1(&L) %: *diroption -listfile cmd:"*viewstyle -listfile %so"hoge" %%: *diroption -listfile cmd:""" %: *whereis

解説

*diroption -listfile cmd:"任意のコマンド" により、リストファイル表示時に任意のコマンドを実行することができる。 ここに、

  • 表示形式を変更
  • 自分自身を削除

の2つのコマンドを登録することで、リストファイル表示時に一度だけ、表示形式を変更することができる。FIRSTEVENTを使った以前からあるテクニックの応用ですね(詳しくはヘルプで「FIRSTEVENT を使用する」を検索)。

2024年10月5日土曜日

テキストファイル内の画像パスをPPVで表示

テキストファイル中に画像ファイルのパスを書いておけば、それを別IDのPPVで閲覧できるようにする。これで、テキストファイルのメモでも画像や図を扱いたい!という我々の永遠の課題を解決できるかもしれない?

準備

以下をScriptフォルダに保存。

以下を編集して取り込み。

_Command    = {    ; ユーザコマンド・関数
openhalfppv    = *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)/2")
    *ppv -bootid:X -k %%J"%*arg(1)" %%: *fitwindow %N,%%N,4 %%: *windowsize %%N,%*windowrect(,w),%*windowrect(,h) %%: *selectppx %n
previewimagepath = *openhalfppv %*script(%0Script\getimagepath.js,1)
    *mapkey use,K_halfppv
    *linecust imgpreview,KV_main:LOADEVENT,*ifmatch %%n,%n %(%: *RotateCustomize _User:imgpath,%*script(%0Script\getimagepath.js) %: *ifmatch !0,0%*getcust(_User:imgpath) %: *execute VX,%%J"%*getcust(_User:imgpath)"%)
    *linecust quitimgview,KV_main:CLOSEEVENT,*ifmatch %%n,%n %%: *linecust imgpreview,KV_main:LOADEVENT, %%: *linecust quitimgview,KV_main:CLOSEEVENT,
}

K_halfppv    = {
Q    ,*ifmatch !0,0%NVX %: %Oi *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)*2")
	*closeppx "%n,VX"
^N    ,*RotateCustomize _User:imgpath,%*script(%0Script\getimagepath.js) %: *execute VX,%%J%*getcust(_User:imgpath)
ENTER    ,*ifmatch !0,0%NVX %: %Oi *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)*2") %: *closeppx VX %: *stop
	*openhalfppv %*script(%0Script\getimagepath.js,1)
}

やり方

画像ファイルパスを書き込んだテキストファイルを用意し、PPVで表示する。

PPV上で以下のコマンドを実行。

*previewimagepath

PPVの大きさが半分になり、空いたスペースにPPV[X]が起動。画像ファイルを表示する。

PPvの表示ファイルが切り替わると、表示画像も切り替わる。以下はPPv中心の連動ビュー(参考:一対一対応 | PPxMemo)と組み合わせたもの。

その他キーバインド

  • [ENTER] 画像表示非表示トグル
  • [Q] 半分になったPPVの大きさをもとに戻してから終了
  • ^[N] テキストファイル内の次の画像ファイルパスを表示

追記 2024-10-14

表示している画像ファイルパスをハイライトする設定は以下。

_Command    = {    ; ユーザコマンド・関数
openhalfppv    = *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)/2")
    *ppv -bootid:X -k %%J"%*arg(1)" %%: *fitwindow %N,%%N,4 %%: *windowsize %%N,%*windowrect(,w),%*windowrect(,h) %%: *selectppx %n
previewimagepath = *openhalfppv %*script(%0Script\getimagepath.js,1)
    *mapkey use,K_halfppv
    *highlight %*script(%0Script\getimagepath.js,1)
    *linecust imgpreview,KV_main:LOADEVENT,*ifmatch %%n,%n %(%: *RotateCustomize _User:imgpath,%*script(%0Script\getimagepath.js) %: *ifmatch !0,0%*getcust(_User:imgpath) %: *execute VX,%%J"%*getcust(_User:imgpath)" %: *highlight %*getcust(_User:imgpath)%)
    *linecust quitimgview,KV_main:CLOSEEVENT,*ifmatch %%n,%n %%: *linecust imgpreview,KV_main:LOADEVENT, %%: *linecust quitimgview,KV_main:CLOSEEVENT,
}

K_halfppv    = {
Q    ,*ifmatch !0,0%NVX %: %Oi *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)*2")
	*closeppx "%n,VX"
^N    ,*RotateCustomize _User:imgpath,%*script(%0Script\getimagepath.js) %: *execute VX,%%J%*getcust(_User:imgpath) %: *highlight %*getcust(_User:imgpath)
ENTER    ,*ifmatch !0,0%NVX %: %Oi *windowsize %N,%*windowrect(,w),%*calc("%*windowrect(,h)*2") %: *closeppx VX %: *stop
	*openhalfppv %*script(%0Script\getimagepath.js,1)
}

2024年9月27日金曜日

wgetで取得した画像をPPvで表示

画像をローカルに保存するのが面倒なときのために。 以下を編集して取込。

_Command = {
wget2file = *string o,hoge=%*temp(name,f)
  %Os wget -O %so"hoge" %*arg(1)
  *return %so"hoge"
}

以下のようにして使う。

*ppv %*wget2file("https://pbs.twimg.com/media/F0vVsgTaYAsUHkA?format=jpg")

2024年9月15日日曜日

ファイル検索ダイアログ完了時にコマンド実行

問題意識

僕はhowm形式でメモを取っている(参考:moe | メモの方法論)。howmファイルの一行目をコメントにするスクリプトを利用して、以下のようにタイトルを表示している。

このメモの中から、^[W]でファイル検索をすることがあるのだが、その結果は次のようになる。

00_INDEX.TXTで紐づけたコメントは、当然ListFileでは反映されない。 タイトルが表示されない分視認性は低いが、そもそもあまり検索することもないし、特に不便だとも思ってなかったので、ずっと放置していた。

X_jinfc

最近気付いたのだが、X_jinfcを使えばこの問題を解決することができる。X_jinfcを使うと、ダイアログ完了時にコマンドを実行することができる。

以下をScriptフォルダに保存。これはhowmファイルからタイトルを取得するスクリプト。

以下を編集して取込。

X_jinfc = {
whereiscompcmd = *ifmatch "/D:\\work\\memo/",%1 %: *comment all extract,%(%*script(%0Script\gethowmtitle.js,%FCD)%)
}

これで、D:\work\memo以下で^[W]による検索をした場合、howmファイルから自動でタイトルを取得し、それをコメントにしてくれる。

一番上の「.」「..」がコメント表示になってなくて気になる場合は、以下をScriptフォルダに追加で保存してから

以下を編集して取込すればいい。

X_jinfc = {
whereiscompcmd = *ifmatch "/D:\\work\\memo/",%1 %: *comment all extract,%(%*script(%0Script\gethowmtitle.js,%FCD)%) %: *script %0Script\dotcomment.js
}

2024年9月12日木曜日

EVENTで*stopの代わりに*gotoを使う

EVENTで*stopを使うと、*linecustと相性が悪い場合があるので、代わりに*gotoを使う話です。

問題意識

FIRSTEVENTやLOADEVENTで、*ifmatchと*stopを使って条件分岐をすることは、よくあることだと思う。以下はPPC起動時に、IDが[A]ならhogeを、それ以外ならfugaをメッセージ表示する設定。

KC_main    = {    ; PPcメイン窓
FIRSTEVENT    ,*ifmatch CA,%n %: *linemessage hoge %: *stop
    *linemessage fuga
}

これだと、後で別の設定を*linecustで追加しようとした時、困ったことが起きる。例えば、PPC起動時にメッセージウインドウを表示しようとして、以下のコマンドを実行したとする。

*linecust homu,KC_main:FIRSTEVENT,%%I"hello world"

すると、FIRSTEVENTは以下のようになる。

KC_main    = {    ; PPcメイン窓
FIRSTEVENT    ,*ifmatch CA,%n %: *linemessage hoge %: *stop
    *linemessage fuga
    %mhomu %I"hello world"
}

これでは、想定した通りの動きにならない。起動したPPCのIDが[A]の時、一行目で処理が止まるからだ。手動で処理の順序をいじったりすれば解決するかもしれないが、そういうややこしいことはできればしたくない。

*stopの代わりに*gotoを使う

*stopの代わりに*gotoを使えば、この問題は解決しそうだ。

KC_main    = {    ; PPcメイン窓
FIRSTEVENT    ,*ifmatch CA,%n %: *linemessage hoge %: *goto Last
    *linemessage fuga
    %mLast
}

これなら、*linecustで追加した処理が無事実行されることになる。

KC_main    = {    ; PPcメイン窓
FIRSTEVENT    ,*ifmatch CA,%n %: *linemessage hoge %: *goto Last
    *linemessage fuga
    %mLast
    %mhomu %I"hello world"
}

*linecustが使いやすくなる分だけ、*stopよりも*gotoの方が少しお得。これがホントのgoto EVENTってやつですねw

:y=-( ゚д゚)・∵;; ターン

2024年9月10日火曜日

スクリプトをES6へ移行

PPxで使うスクリプトをES6に移行する方法です。 ほえほえ日記のスクリプトも、今後は基本的にES6で書くつもりです。

WSH Script Moduleのアップデート

WSH Script Module(旧名Script Module)を最新バージョンにする。R21+1でPPx.Enumeratorが使えるようになるので、それ以前のバージョンを使っているならアップデートは必須。PPx本体も最新のものにしておく。

既存のスクリプトを修正

ES6では使えないオブジェクトがいくつかある(参考:WSH JScript で利用できる機能まとめ | なたで日記)。おそらく問題になるのはActiveXObjectとEnumeratorの2つ。以下のように修正する。

JScript

var e = new Enumerator(FileCollection); 
var fso = new ActiveXObject('Scripting.FileSystemObject');

ES6

var e = PPx.Enumerator(FileCollection);
var fso = PPx.CreateObject('Scripting.FileSystemObject');

編集して取込

以下を編集して取込した後、PPxを再起動する。

_Others:usejs9=4

参考

2024年9月1日日曜日

一行編集のキーバインドをスイッチ

僕は、補完候補ファイルに記述したコマンドを、一行編集から呼び出して使っている。これだと「あれ、あのコマンドどのキーに登録したっけ」ということがなくなり、便利なのだ。

今回行うのは、一行編集上での疑似自動補完の切り替え。

準備

以下を編集して取込。補完候補ファイルはPPxフォルダ内のlaunch.txtという想定。

_Command	= {	; ユーザコマンド・関数
ppl2	= *ifmatch 0,0%*getcust(_User:ppx_keymode) %: *setcust _User:ppx_keymode=K_pplnormal
	*string o,name=%*input("" -title:"%*substring(%*getcust(_User:ppx_keymode),5) mode ^Rで実行コマンド切り替え" -mode:h -leavecancel -k:"*completelist -file:%%0launch.txt -match:6 -detail:""hist:h user alias"" %%: *mapkey use,%*getcust(_User:ppx_keymode)")
	*execute,%so"name"
}

-|K_pplnormal=
-|K_pplautocorrect=

K_pplnormal	= {
ENTER	,%K"@ENTER"
^R	,*mapkey delete,K_pplnormal
	*mapkey use,K_pplautocorrect
	*setcust _User:ppx_keymode=K_pplautocorrect
	*setcaption auto correct mode
}

K_pplautocorrect	= {
ENTER	,*ifmatch -1,%*sendmessage(%N-L,392,0,0) %: %K"@DOWN @ENTER" %: *stop
	%K"@ENTER"
^R	,*mapkey delete,K_pplautocorrect
	*mapkey use,K_pplnormal
	*setcust _User:ppx_keymode=K_pplnormal
	*setcaption normal mode
}

やり方

*ppl2を実行すると一行編集が起動する。[^R]で疑似自動補完のオンオフが切り替わる。現在の状態はタイトルバーで確認できる。新規にコマンドを実行したい時はnormalに。既存のコマンドを実行したい時はauto correctにするといいだろう。

参考