2019年12月23日月曜日

PPxでオフライン英和辞書(一行編集)

昨日の今日であれなのだが、英和辞書を引くもっと簡単な方法があった。

準備


無料 英和辞書データ ダウンロード - ブラウザで使えるWeb便利ツール 

から辞書データ(テキスト形式)をダウンロードし、ejdic-hand-utf8.txtを適当な場所(ここではPPXフォルダ)に置いて、 以下のコマンドを実行する。

*string o,name=%*input("" -title:"英和辞書" -mode:e -k:"*completelist /set /file:%%0ejdic-hand-utf8.txt")


一行編集からインクリメンタルサーチで辞書を検索できる。



実行


僕はユーザコマンドに登録し、Ctrl+Shift+Fのホットキーで呼び出せるようにしている。

_Command = { ; ユーザコマンド・関数
eiwa = *string o,name=%*input("" -title:"英和辞書" -mode:e -k:"*completelist /set /file:%%0ejdic-hand-utf8.txt")
}
K_tray = { ; PPtrayホットキー(キー指定 不可,V_xx 形式を推奨)
^\F ,*focus !#%*findwindowtitle("英和辞書"),%0PPTRAYW.EXE -c *eiwa
}

翻訳の無い洋ゲーをやる時に使ったり




英語の字幕の意味を調べたりといろいろ便利。



他の調べ物でも、テキストファイル形式の辞書さえあれば応用できそうですね。

2019年12月22日日曜日

PPxでオフライン英和辞書(ripgrep)

英語の意味を調べる際、ブラウザなしで済ませる方法を考える。今回は

  • テキストファイル形式の辞書
  • ripgrep

の組み合わせ。
オンラインならば、Translate-shellをwslで使うのがいいかも。

準備


無料 英和辞書データ ダウンロード - ブラウザで使えるWeb便利ツール 

から辞書データ(テキスト形式)をダウンロードし、ejdic-hand-utf8.txtをPPXフォルダに入れる。

Releases · BurntSushi/ripgrep · GitHub

からバイナリをダウンロードし、rg.exeをPPXフォルダに入れる。

コマンド



%0rg.exe -N ^%"テキストを入力"%E %0ejdic-hand-utf8.txt

単語がたくさんひっかかりすぎる!という場合は、正規表現も使えるので

^%"テキストを入力"%E\s

とテキストの後ろに空白をいれる等、何かしらの工夫をするといいと思う。

参考


2019年12月21日土曜日

一行編集でメモ(Script)


前回の方法だと、与える文字列によってはエラーになるようだ。
なのでスクリプトを用いて同じことをする。



memo.js


//!*script

// 引数の文字列をPPXフォルダのmemo.txtに書き込むスクリプト
// 一行編集からの利用を想定
// 引数がなければエディタで開く

var fso = PPx.CreateObject("Scripting.FileSystemObject");

var filepath = fso.BuildPath(PPx.Extract('%0'),"memo.txt");
var str="\r\n["+PPx.Extract('%*now')+"] ";

// 引数がなければファイルをエディタで開く
if (PPx.Arguments.Length < 1){
  PPx.Execute("editor "+ filepath);
  PPx.Quit(-1);
}

// 引数が複数あればそれをつなげる
for (var i = 0; i < PPx.Arguments.length; i++) {
  if (i==0){
    str=str + PPx.Arguments.Item(i);
  } else {
    str=str + ","+PPx.Arguments.Item(i);
  }
}

// memo.txtに書き込み
var file = fso.OpenTextFile(filepath, 8, true);
file.Write(str);
file.Close();

エイリアスへ登録


A_exec = { ; エイリアス
memo = *script %0\Script\memo.js,
}

やり方


memo

とだけ入力すると、PPxフォルダのmemo.txtをエディタで開く。

memo メモの内容

とすると、メモの内容を日時付きでmemo.txtに追記する。

2019年12月8日日曜日

一行編集で簡易メモ(コマンドプロンプト)




一行編集でメモを取れるようにする。

_Command = { ; ユーザコマンド・関数
memo = *ifmatch 0%*arg(1),0 %: %Ob editor %0memo.txt %: *stop
 %Ob echo [%*now] %*arg(1)>> %0memo.txt
}

*memo

とした場合、memo.txtをエディタで開く。

*memo hogehoge

とすると、日時と一緒にhogehogeをmemo.txtに書き込む。

2019年12月1日日曜日

一行編集で指定ウィンドウをアクティブに

%*inputで読み込ませるファイルに、以下を追加する。

*focus "-xyzzy-",D:\bin\xyzzy\xyzzycli.exe
*focus "PPC[",*ppc
*focus "PPV[",*ppv
*focus " - Kinza",C:\Users\alpha\AppData\Local\Kinza\Application\kinza.exe

これで、あるソフトを使いたいとき、既に起動しているときは窓をアクティブに、起動してないときは起動するようにできる。
ちなみにxyzzyは、設定ファイルをいじってタイトルバーに-xyzzy-を含むようにしている。

つらつらと




窓の切り替えをどうするかは難しい問題だ。
窓間切り替えソフトを使うにしても、

1.窓間切り替えソフトの起動
2.インクリメンタルサーチで絞り込み

という動作が、Alt+Tabより決定的に効率的になるかは微妙だ(10年くらい前の知識で話してるので今は違うかもしれない)。
私は、

・すべての動作をランチャ起点にする
・そこに窓間切り替え操作を含める

が最適解だと思っている。そしてそれは、CuteExecのような「起動してればそのソフトをアクティブに」「起動してなければ起動」という動作になると思うのだ。
僕の場合、使うソフトなんてほぼほぼ決まっている。ファイラ、エディタ、ブラウザの3つだ。ppcを使いたいときは、何も考えずに「ppc」を2文字か3文字まで打って、Enter。xyzzyを使いたいときは、「xyzzy」の2文字か3文字まで打ってEnter。それにより、思考を中断されずに最速で次の操作に移れるはずだ。

2019年11月29日金曜日

PPxでripgrep+peco


カレントフォルダ以下をriprepで検索し、pecoで絞り込んでPPVで表示できるようにする。
howmファイルをインクリメンタルサーチできたら便利かもなと思ったのがきっかけ




利用したツール



  • ripgrep:高速な検索ツール
  • busybox:いろいろなlinuxのシェルコマンドを使える
  • peco

rg.exe busybox64.exe peco.exeをPPXフォルダに置いておく。

コマンド


*ppb -c chcp 65001 %%: %%0rg.exe -n -M 40 --max-columns-preview --color never -E Shift_JIS %%E . | %%0peco.exe | %%0busybox64.exe awk -F : -e "{printf $1 \" -k *jumpline L\" $2}" | %%0PPBW.exe -c *ppv %%%%1\%%%%*stdin(-utf8)


参考


Paper Plane xUI(PPx)に一発でソースコード検索&表示できる「peco」改を移植した - Qiita

2019年11月26日火曜日

PDFCPUで複数画像ファイルを一つのPDFに

PDFCPUについては、hokorobiさんのコメントで存在を知った。
ImageMagick+QPDFなんて比べものにならないくらい早いしコマンドも簡単なので、こっちを使いましょう。

インストール


Releases ・ pdfcpu/pdfcpu ・ GitHubからWindows用のバイナリを入手し、適当な場所に解凍


コマンド


pdfcpu import out.pdf %#FC

画像ファイルをマークし、%#FCで渡す(レスポンスファイルや*.jpgといった形式は現時点では無理そう)。
渡すファイルの数が多すぎて、コマンドラインの文字数制限が心配なときは

*maxlength 32000 %: pdfcpu import out.pdf %#FC

とするといいかもしれない(多分)。

2019年11月24日日曜日

ImageMagickとQPDFで複数画像ファイルを一つのPDFに

複数の画像ファイルを一つのPDFにまとめるとき、今まではImageMagickを使っていた。
だが、100枚単位の画像でこの処理をすると、数十GBのキャッシュを食ってたので(おま環かもしれないけど)、

1.ImageMagickでそれぞれの画像ファイルを1ページのPDFに変換
2.QPDFでPDFを一つにまとめる

という過程を取るようにしてみる。

*set tmpdir=%'tmp'\PDFTEMP %:
 *set inputfile=%"PDFに変換するファイル"%{*.%|%t%|%} %:
 *makedir %'tmpdir' %:
 *ppb -c %%OBis %%'imagemagic' mogrify -path %%'tmpdir' -format pdf %%'inputfile' %%:
 *cd %%'tmpdir' %%:
 %%'qpdf' --empty %%1\output.pdf --pages *.pdf -- %%:
 *delete %%'tmpdir'

参考



2019年11月19日火曜日

RANGEEVENT

RANGEEVENT


エントリカーソル移動カスタマイズで、デフォルトにない動作や、分岐など複雑なことをしたいときは、RANGEEVENTを使う。

XC_mvLR = 4,1,4,B0000,16,B0000

KC_main = {
RANGEEVENT1 ,*linemessage rangeevent1
RANGEEVENT2 ,*linemessage rangeevent2
}

こうすると、カーソル左右で範囲外移動をしたときに KC_main の RANGEEVENT1 / RANGEEVENT2 が呼び出されるようになる。

PPCからPPVに窓間移動




二画面で反対窓にPPVを埋め込み表示している時用の設定。PPVが表示されていればPPVにフォーカスを。そうでなければ窓間移動をさせる。

XC_mvLR = 4,1,16,B0000,16,B0000

KC_main = {
RANGEEVENT1 ,*ifmatch %NC,%NC#L %: %K"@BS" %: *stop
 *ifmatch 0,0%NVY %: %K"@TAB" %: *stop
 *focus VY
RANGEEVENT2 ,*ifmatch %NC,%NC#R %: %K"@BS" %: *stop
 *ifmatch 0,0%NVY %: %K"@TAB" %: *stop
 *focus VY
}

KV_page = { ; PPvテキスト(ページ)追加設定
LEFT ,*focus C
RIGHT ,*focus C
}

ちなみに埋め込み設定は以下。

_others = { ; その他設定
SyncViewID = Y
}

_Command = {
halfview = *ifmatch /.+/,%NVY %: *ppvoption sync %: *stop
 %Oi *ppv -bootid:Y %*name(CD,"%R","%1") %: *ppvoption sync %: *wait 100,1 %: *capturewindow VY -pane:~ -selectnoactive
}

E_cr = { ; [Enter]用判別
:JPEG ,
:BMP ,
:XJS ,
:XVBS ,
PNG ,*halfview
JPG ,*halfview
JPEG ,*halfview
BMP ,*halfview
GIF ,*halfview
TXT ,*halfview
XYZZY ,*halfview
INI ,*halfview
VBS ,*halfview
JS ,*halfview
PY ,*halfview
PYW ,*halfview
HOWM ,*halfview
CFG ,*halfview
LOG ,*halfview
}

2019年11月18日月曜日

エントリカーソル移動カスタマイズの考察

XC_mvXXでエントリカーソル移動をカスタマイズできる。

  • XC_mvUD カーソル↑↓の設定
  • XC_mvLR カーソル←→の設定
  • XC_mvPG Page Up/Page Downの設定
  • XC_mvSC スクロールバーの設定
  • XC_mvWH ホイールの設定

設定項目の分析


XC_mvLR = 4,1,4,B0000,0,B010 ; [←][→]


右の数値だが、これは2つ1セットで見る。


4,1が「通常時動作」、4,B0000が「画面外に移動したときの動作」、0,B010が「範囲外に移動したときの動作」である。


通常時動作


通常の動作。

最初の数値が移動の種類を。次の数値が移動量を示している。デフォルトでは、「左右の方向に1桁スクロールする」動作を単位量1で実行する。あまりここをいじることはないだろう。

 画面外動作



ファイル数が多いと、ファイルが複数ページに渡って表示される。そのとき生じる、カーソルが画面外にはみ出したときの動作をここで指定する。デフォルトでは「4:一桁分スクロール」をする。

範囲外動作


最初と最後のエントリを超えてさらに移動したり、あるいは左端と右端のエントリからさらに左、右へ移動したりといった、範囲外操作をした場合の動作指定。デフォルトでは停止をする。
親ディレクトリへの移動や、最初のエントリと最後のエントリでカーソルループさせたいときはここをいじる。

この画像では「親ディレクトリへ」「末端/先頭に到達していない時は移動する」設定になっている。

設定方法


①移動方法 ②移動量


通常時移動は、最初の数値で移動方法を。次の数値で移動量を設定する。

移動方法は以下。
↓単位 形態:既定値 ページ スクロール カーソル移動せずにスクロール
---------------------------------------------------------
±1行(上下)   0       1        2        3
±1桁(左右)   4       5        6        7
±1ページ     8       9       10       11
±1/10ページ 12      13       14       15

上方/下方のマーク 16
次/前に選択したマーク 17

③画面外、範囲外方法



画面外、範囲外ともに、最初の数値で動作を設定する。

  0:停止
  はみ出す場合は移動しません。
  1:画面反対(線対称)
  左端なら右端に、右端なら左端に水平方向移動します。ページ移動は行いません。
  2:画面反対(点対称)
  左上端なら右下端に、右下端なら左上端に移動します。ページ移動は行いません。
  3:一行分スクロール
  上下方向に1行スクロールします
  4:一桁分スクロール
  左右方向に1桁スクロールします
  5:ページ切替
  6:親ディレクトリへ
  7:ドライブ選択
  8:[←]/[→]使用
  9:page up/down使用
 10:前のPPcへ
 11:次のPPcへ
 12:前のドライブへ
 13:次のドライブへ
 14:反対窓のPPcへ
 15:半ページ切替
 16: KC_main の RANGEEVENT1 / RANGEEVENT2 を実行
 17: KC_main の RANGEEVENT3 / RANGEEVENT4 を実行
 18: KC_main の RANGEEVENT5 / RANGEEVENT6 を実行
 19: KC_main の RANGEEVENT7 / RANGEEVENT8 を実行


④画面外、範囲外他



2つ目の数値でその他の設定を行う。

 B0000
  ||||
  |||+-- 1=リピート無し→「方法」を実行  リピート中→停止
  ||+--- 1=末端/先頭に到達していない時は移動する
  |+---- 1=二枚窓時は窓間移動を優先(移動方向が隣接窓側なら窓移動)
  +----- 1=移動時にマークする(Explorer風選択,画面外他のみ有効)

2019年11月8日金曜日

ImageMagickにレスポンスファイルを渡す

レスポンスファイルを作ってImageMagickに渡すことで、マークファイルを一括処理する。

-|M_Picture =

A_exec = { ; エイリアス
imagemagic    = "C:\Program Files\ImageMagick-7.0.8-Q16\magick.exe"
}

M_Picture = { ** comment **
ペイント(&P) = mspaint %FCD
-- = 
左に90度回転(&L) = %Ob *cd %*name(DB,"%a*8FCDB") %: %'imagemagic' mogrify -auto-orient -rotate 270 @%*name(C,"%so"response"") %: *trimmark
右に90度回転(&R) = %Ob *cd %*name(DB,"%a*8FCDB") %: %'imagemagic' mogrify -auto-orient -rotate 90 @%*name(C,"%so"response"") %: *trimmark
拡大縮小 = %Ob *cd %*name(DB,"%a*8FCDB") %: %'imagemagic' mogrify -geometry %"数値を入力してください"%{30%}%% @%*name(C,"%so"response"") %: *trimmark
拡張子を変換 = %Ob *cd %*name(DB,"%a*8FCDB") %: %'imagemagic' mogrify -format %"拡張子を入力してください"%{%|%t%|%} @%*name(C,"%so"response"") %: *trimmark
-- = 
壁紙にする(&W) = *customize X_bg:Path=%FDC %: *customize X_bg:Type=10
}

E_scr = { ; \[Enter]用判別
JPG ,%M_Picture,A
PNG ,%M_Picture,A
JPEG ,%M_Picture,A
BMP ,%M_Picture,A
}

2019年11月6日水曜日

pecoでサブフォルダを検索しAIMP4へ

pecoはWindows版のバイナリ(peco_windows_amd64.zip)を使う。

*ppb -c chcp 65001 %%: dir /a:d /b | %%0peco.exe | %%0ppbw.exe -c D:\bin\AIMP4\AIMP.exe %%%%*name(DC,"%%%%*stdin(-utf8)")

これでサブフォルダを検索し、AIMP4に投げる。


以前のやり方だと「日本語表示が崩れる」「実行後PPbが閉じない」という問題があったが、それぞれ「chcpでUTF-8にする」「PPb -c command...の形式にする」ことで解決するようだ。

migemoを使う場合




peco/migemogrepからバイナリを取得。

User\ユーザー名\.config\peco

にconfig.jsonを作成し、次のように記述。

{
    "CustomFilter": {
        "Migemo": {
            "Cmd": "D:\\bin\\ppx\\migemogrep\\migemogrep.exe",
            "Args": [ "$QUERY" ],
            "BufferThreshold": 10000
        }
    }
}


これでフィルターにmigemoが追加される。あとはCtrl+Rでフィルターを切り替えるか、コマンドラインオプションで指定する。

*ppb -c chcp 65001 %%: dir /a:d /b | %%0peco.exe --initial-filter Migemo | %%0ppbw.exe -c D:\bin\AIMP4\AIMP.exe %%%%*name(DC,"%%%%*stdin(-utf8)")

参考


Paper Plane xUI で peco を使ってタブを切り替える - Qiita

2019年11月3日日曜日

一行編集でステップイン・アウト

以前、一行編集でステップイン・アウトをする方法を紹介したが、その後色々と大きな動きがあったので書き直し。
PPxスレPart.6のステップイン・アウト関連の一連のレスを参考にした。1.69+2以降で動作する。



一行編集のタイトルが「PPlauncher」で、内容がファイルパスかフォルダパスなら、カーソル左右でステップイン・アウトを。それ以外の場合は通常のカーソル移動をする。

K_lied = {
LEFT ,*ifmatch !PPlauncher,%W %: %K"@LEFT" %: *stop
 *ifmatch "option:e,a:d+,a:d-","%*edittext" %: %K"@END" %: %k"^\LEFT BS" %: *stop
 %K"@LEFT"
RIGHT ,*ifmatch !PPlauncher,%W %: %K"@RIGHT" %: *stop
 *ifmatch "option:e,a:d+,a:d-","%*edittext" %: *replace %*edittext%*addchar(\) %: %K"@F4@TAB" %: *stop
 %K"@RIGHT"
}



2019年10月25日金曜日

7zca.dllを使う


解凍ソフトでは7-Zipが個人的に好きでずっと使ってる。
以前はscriptを作って7zG.exeを実行したりしてたが(7-zip(7zG.exe)で書庫の展開)、今なら7zca.dllを使えばよさげ。


1.TORO's Libraryから7zca.dllをダウンロードし、PPXフォルダに入れる
2.7-Zipフォルダ内にある7zip.dllのパスを通す。とりあえずPPXフォルダにコピーすればよさそう
3.以下を編集して取込

P_arc = {
7zca64.DLL = B10000000010,0,Szipca
 a=x "%1" "%!2%\" *
 e=e "%1" "%!2%\" %@
 s=e "%1" "%2" "%C"
7zca32.DLL = B10000000001,0,Szipca
 a=x "%1" "%!2%\" *
 e=e "%1" "%!2%\" %@
 s=e "%1" "%2" "%C"
}


4.カスタマイザーの「その他 - 書庫DLL/P_arc」で7zca64.DLLを上の方へ

2019年10月16日水曜日

一行編集からAIMP4を操作


補完候補リストによく使うコマンドラインを追加して、一行編集からAIMP4を操作できるようにする。

D:\bin\AIMP4\AIMP.exe /PLAY
D:\bin\AIMP4\AIMP.exe /PLAYPAUSE
D:\bin\AIMP4\AIMP.exe /NEXT
D:\bin\AIMP4\AIMP.exe /PPREV
D:\bin\AIMP4\AIMP.exe /EXIT
D:\bin\AIMP4\AIMP.exe /RESTORE

それほど頻繁に使わないけど、コマンドラインオプションは記憶させたいときは

D:\bin\AIMP4\AIMP.exe
 /PLAY
 /PLAYPAUSE
 /NEXT
 /PPREV
 /EXIT
 /RESTORE

とする。こうすると、AIMP4のパス入力後にSpaceキーを押すと、コマンドが補完される。


参考:AIMP4のコマンドラインオプション


/ADD_PLAY - Add objects to a playlist and start playing.
/BOOKMARK - Add files and / or folders to your bookmarks.
/DIR - Add folder(s) to the playlist.
/FILE - Add file(s) to the playlist.
/INSERT - Add objects to the active playlist.
/QUEUE - Add objects to the active playlist and put them in custom playback queue.
/RESTORE - Bring player to top.
/SKIN - Install skins to AIMP. After installation, opens the Preferences window on the choice of skin.
/PLS - Opens playlists in new tabs.
/CDA - Creates a new playlist with a list of files from a specified media and starts its playback.
/PLAY - Start playing.
/PLAYPAUSE - Start playing / Pause playback.
/PAUSE - Pause playback.
/STOP - Stop playback.
/NEXT - Next file.
/PREV - Previous file.
/MUTE - Mute / Unmute .
/VOLUP - Increase volume.
/VOLDWN - Reduce Volume.
/EXIT - Exit from the app.

2019年10月13日日曜日

現在窓の位置を複数記憶(UserDataバージョン)


現在窓の位置を複数記憶し、再現できるようにする。
以前の記事では同じことをエイリアスを使用して行ったが、今回はユーザーデータを使用する。

Script


以前のSetDimensions.jsとほぼ同じだが、区切り文字を「,」から「;」に変更している。

SetDimensions2.js

//!*script 
// 窓の位置と大きさを変更する
// 第一引数:"x;y;width;height"
// PPXMES.DLLとPPXWIN.DLLが必要

// 引数がなければ終了
if (PPx.Arguments.Length < 1){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var hoge = PPx.Arguments.Item(0).split( ";" );

// 実行元が一体型PPcかそれ以外かで分岐
if (PPx.GetComboItemCount != 0&&PPx.Extract('%n').substr(0,1)=="C"){
  PPx.Execute("*windowposition %*findwindowclass\(\"PaperPlaneCombo\"\)"+","+hoge[0]+","+hoge[1]); // 位置の変更
  PPx.Execute("*windowsize %*findwindowclass\(\"PaperPlaneCombo\"\)"+","+hoge[2]+","+hoge[3]); // 大きさの変更
} else {
  PPx.Execute("*windowposition %N"+","+hoge[0]+","+hoge[1]); // 位置の変更
  PPx.Execute("*windowsize %N"+","+hoge[2]+","+hoge[3]); // 大きさの変更
}


窓の位置を登録


*script %0\Script\setSeqUserData.js,ppvpos,%*windowrect(,l);%*windowrect(,t);%*windowrect(,w);%*windowrect(,h)

これを実行するたび、ppvpos0 ppvpos1 ppopos2…に現在窓の位置と大きさ(x;y;width;height)を登録する。

窓の位置を変更


*script %0\Script\SetDimensions2.js,%*script(%0\Script\getSeqUserData.js,ppvpos)

getSeqUserData.jsを実行するたび、順次ppvpos0 ppvpos1 ppopos2…の中身を返すので、その値を使いSetDimentions2.jsで窓の位置と大きさを変更する。

登録例


僕はPPVに2ストロークキーで登録。


  • C_s,s 登録
  • C_s,C_s 実行
  • C_s,e エディタで編集

-|K_SetPPvDimensions =

KV_main = { ; PPvメイン窓
^S ,*setnextkey K_SetPPvDimensions
}

K_SetPPvDimensions = { ** comment **
S , *script %0\Script\setSeqUserData.js,ppvpos,%*windowrect(,l);%*windowrect(,t);%*windowrect(,w);%*windowrect(,h)
^S ,*script %0\Script\SetDimensions2.js,%*script(%0\Script\getSeqUserData.js,ppvpos)
E , *ppb -c *string o,name=%%*script(%%0\Script\SeqUserData2file.js,ppvpos) %%: %%Obsq xyzzy %%so"name" %%: *script %%0\Script\file2SeqUserData.js,ppvpos,%%so"name"
}


2019年10月12日土曜日

PPc - xyzzy間フォーカス切り替え

Shift+Tabで、PPcとXyzzyのフォーカス切り替えをする。

PPx

KC_main = { ; PPcメイン窓
\TAB ,*focus "-xyzzy-"
}


xyzzy

; xyzzyのタイトルバーの書式に -xyzzy-を含ませる。
(setq-default title-bar-format "-xyzzy- %f (%M) [%k:%l]")
; Shift+TabでPPcにフォーカス
(set-extended-key-translate-table exkey-S-tab #\F20)
(global-set-key '#\F20 #'(lambda () (interactive)
      (call-process "D:\\bin\\ppx\\PPTRAYW.EXE -c *focus C")))

2019年10月10日木曜日

設定ファイルの一部を取得

・設定ファイルから任意の設定項目を取り出し、クリップボードにコピーする
・文字コードがUTF-16のPPX.CFGがPPXフォルダにあることが前提


準備


1.BusyBoxからバイナリをダウンロードし、busybox64.exeをPPXフォルダに入れる
2.以下を編集して取込

_Command = { ; ユーザコマンド・関数
cfg2sed2clip = %Obsq %0busybox64.exe iconv -f UTF16 -t UTF8 %0PPX.cfg | %0busybox64.exe sed -n "/^%*arg(1)/{p; :loop n; p; /^}/q b loop }"  | %0busybox64.exe iconv -f UTF-8 -t CP932 | clip
}

KC_main = { ; PPcメイン窓
'@' ,*string o,name=%*regexp("%*input("" -title:"CFG部分取得" -mode:e -k:"*completelist /set /file:%%0PPX.CFG")","s/^(.*);/$1/") %:
  *ifmatch "/{/","%so"name"" %: *cfg2sed2clip "%so"name"" %: *stop
  *cliptext %so"name"
}

使い方


・@を押すと、PPX.CFGを補完候補リストにした一行編集が表示される
・X_vzs = 0のような一行形式のものは、その行をクリップボードにコピー
・KC_mainのような複数行に渡るものは、{}の中身を含めてクリップボードにコピー

ユーザーコマンドとして使う場合


_Command = { ; ユーザコマンド・関数
cfg2sed2clip = %Obsq %0busybox64.exe iconv -f UTF16 -t UTF8 %0PPX.cfg | %0busybox64.exe sed -n "/^%*arg(1)/{p; :loop n; p; /^}/q b loop }"  | %0busybox64.exe iconv -f UTF-8 -t CP932 | clip
cfgfazzy = *string o,name=%*regexp("%*input("" -title:"CFG部分取得" -mode:e -k:"*completelist /set /file:%%0PPX.CFG")","s/^(.*);/$1/") %:
 *ifmatch "/{/","%so"name"" %: *cfg2sed2clip "%so"name"" %: *stop
 *cliptext %so"name"
}

参考






2019年10月7日月曜日

一行編集で定型文取得



一行編集の候補ファイルに、次のように記載しておけば定型文をクリップボードにコピーできる。

*cliptext (」・ω・)」つかー! (/・ω・)/にゃーん!
*cliptext <pre class="prettyprint">%bn</pre> %mブログ用タグ
*cliptext %*now %m現在日時
*cliptext %*now(date) %m今日の日付

%mでメモを記載して検索をしやすくしたり、%bt、%bnでタブ文字や改行文字を入れたりすることも可能。また、

X_ltab = 4

とすると、一行編集でもmigemoを有効にできるようだ。

2019年10月6日日曜日

一行編集でランチャ改

PPxをランチャとして使う」の連載記事以降、色々と動きがあったので書き直す。新しく追加された%*inputを利用。某大型掲示板を参考に、スクリプトを使ってた箇所を使わずに済ませたり、無駄に煩雑な箇所をシンプルにしたりした。

1.PPtrayを使いホットキー(Ctrl+Space)で起動。トグル動作をする
2.l_cmd.txtを登録。コマンド、実行パス、フォルダを混在して記載
3.実行パス→実行、フォルダ→PPCで開く、その他→コマンド実行と分岐

_Command = { ; ユーザコマンド・関数
ppl = *string o,name=%*input("" -title:"PPlauncher" -mode:e -k:"*completelist /set /file:%%0l_cmd.txt") %:
 *ifmatch "o:e,a:d+",%so"name" %: *execute C,*jumppath "%so"name"" %: *stop
 *ifmatch "o:e,a:d-",%so"name" %: *execute ,"%so"name"" %: *stop
 *execute,%so"name"
}

K_tray = { ; PPtrayホットキー(キー指定 不可,V_xx 形式を推奨)
^' ' ,*focus !#%*findwindowtitle("PPlauncher"),%0\PPTRAYW.EXE -c *ppl
}

l_cmd.txt
howm2dir
xyzzy
D:\bin
D:\Data
D:\Download
D:\work
D:\Temp
D:\bin\afxw\AFXW.EXE
D:\bin\AIMP4\AIMP.exe
D:\bin\NeeView\NeeView.exe
D:\bin\nyanfi\NyanFi.exe
*ppb
*ppc ;PPcを実行
*ppc -runas ;管理者/別のユーザでPPcを実行
*ppv
*pptray
*ppcust
*closeppx ;[wildcard] 全PPx終了
*screensaver ;スクリーンセーバを起動
*monitoroff ;モニターを省電力モードにする
*logoff ;Windows をログオフ
*poweroff ;Windows をシャットダウンし、電源を切る
*reboot ;Windows を再起動
*shutdown ;Windows をシャットダウン
*terminate ;Windows を強制シャットダウン
*suspend ;サスペンド状態に移行
*hibernate ;休止状態に移行
*ppe  ;"filename"  PPeで編集(終了待ちしない)


2019年9月28日土曜日

pecoでフォルダ階層移動

pecoのインストール


以下からWindows版のバイナリ(peco_windows_amd64.zip)をダウンロード

https://github.com/peco/peco/releases/

PPXフォルダにpeco.exeを置く

コマンド


(echo .. & dir /a:d /b)  | %0peco.exe | %0ppbw.exe -c *execute C,*jumppath %%*stdin

適当なフォルダでこれを実行。カーソル上下か、インクリメンタルサーチで絞り込むかしてから、Enter。



思ったこととか


・サブフォルダを選択したら、さらにそのサブディレクトリをpecoって階層移動

ができたら楽しそうだなと思って、ここ数日研究していた。bash環境だとやってる例はあるのだが(pecoでcdを快適にした|bashでもpeco - マクロ生物学徒の備忘録)、wshでやろうとすると割とややこしそうなので、放置しようかなと思っている。

ここで僕がしようとしてるのは、「思考の流れと一致する操作」を「思考と同じ速度で行う」こと。少しでもタイムラグがあれば、結局その手段は使わなくなる。ターミナルを開くまでの時間、挙動速度などを考えると、別の手段を取った方がいい気もする。

参考



2019年9月25日水曜日

連番付き変数で一時ブックマーク

一時ブックマークを実装する。以前はエイリアスを利用していたが、今回はユーザーデータを利用する。

  • setSeqUserData.js
  • getSeqUserData.js
  • SeqUserData2file.js
  • file2SeqUserData.js

は以下にあり。


設定


A_exec = { ; エイリアス
xyzzy = D:\bin\xyzzy\xyzzy.exe
}

KC_main = { ; PPcメイン窓
^S ,*setnextkey K_bookmark
}

K_bookmark = { ** comment **
S ,*script %0\Script\setSeqUserData.js,BM,%FCD
^S ,%J %*script(%0\Script\getSeqUserData.js,BM)
E ,*ppb -c *string o,name=%%*script(%%0\Script\SeqUserData2file.js,BM) %%: %%Obsq xyzzy %%so"name" %%: *script %%0\Script\file2SeqUserData.js,BM,%%so"name"
^E ,*ifmatch !CX,%n %: *alias ppcx_cmd = *execute %n,%%%%J%%FCD %%: %%K"@Q" %: *ppc -bootid:x -single %*script(%0\Script\SeqUserData2file.js,BM)
}

キーバインド


2ストロークキーを利用。
例えばC_s,sなら「Ctrl+Sのあと、Sを押す」の意味。

・C_s,s カーソル下のファイルを登録
・C_s,C_s 登録したパスに順番に移動
・C_s,e 登録したパスをエディタで編集
・C_s,C_e 登録したパスをPPCで表示

使い方


C_s,s カーソル下のファイルを登録



C_s,C_s 登録したパスに順番に移動



C_s,e 登録したパスをエディタで編集




C_s,C_e 登録したパスをPPCで表示。Shift+Enterでジャンプ



参考


つかさのほえほえ日記 - PPxで一時ブックマーク

2019年9月21日土曜日

サブ窓中心の運用③実行ファイルに投げる

1.メイン窓でファイルを選択してから、Shift+X
2.実行ファイルをサブ窓で選び、Shift+Enter



あらかじめ、実行ファイルのパスを並べたListFileを作成しておく。ここでは、PPXフォルダにbin.txtという名前で保存している。
KC_main    = {
\ENTER    ,*ifmatch CX,%n %: *execute ,%'ppcx_cmd' %: *stop
    %K"@\ENTER"
CLOSEEVENT ,*ifmatch CX,%n %: *alias ppcx_cmd = %%K"@\ENTER" %: *stop
\X ,*alias ppcx_cmd = %%Ob %%{%%FCD %%|%%} %%*extract(%n"%%%%#FCD") %%: %%K"@Q" %: *ppc -bootid:x -single %0bin.txt
}

サブ窓中心の運用②「戻る」履歴一覧

1.メイン窓でShift+Gを押して、「戻る」の履歴一覧をサブ窓で表示
2.サブ窓でShift+Enterを押し、メイン窓のパスを変更する



「戻る」の履歴は、それぞれのPPCごとに記録され、%*dirhistoryで取得できるもの。ちなみに全PPC共通のヒストリは%hnで取得できる。

KC_main    = {
\ENTER    ,*ifmatch CX,%n %: *execute ,%'ppcx_cmd' %: *stop
    %K"@\ENTER"
CLOSEEVENT ,*ifmatch CX,%n %: *alias ppcx_cmd = %%K"@\ENTER" %: *stop
\G ,*ifmatch !CX,%n %: *alias ppcx_cmd = *execute %n,%%%%j%%FCD %%: %%K"@Q" %: *ppc -r -bootid:x -single %*script(%0\Script\dirhistory2file.js9)
}

dirhistory2file.js9

//!*script

// %*dirhistory(n)をListfile形式でファイルに保存。そのファイルパスを返す
// %j %*script(%0\Script\dirhistory2file.js9,fuga.txt)
// *ppc -bootid:z -single %*script(%0\Script\dirhistory2file.js9)
// という具合に使う

// 第一引数 : 保存先のファイルパス(省略可能。その場合はテンポラリファイルに保存)

// テンポラリファイル名の作成
function getTempFile() {
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var tDir = fso.GetSpecialFolder(2);
  var tFile = fso.GetTempName();
  return tDir + "\\" + tFile;
}

var arr1 = new Array();

var stream         = new ActiveXObject("ADODB.Stream");
    stream.type    = 2;
    stream.charset = 'UNICODE';

stream.open();
stream.WriteText( ";ListFile", 1);  // 第2引数が 0:改行なし, 1:改行あり
for (var i = 0; i < 10; i++) {
  if (PPx.Extract("%*dirhistory\("+i+"\)") != ""){
    arr1.push(PPx.Extract("%*dirhistory\("+i+"\)")); // 配列に登録
  } else {
    break;
  }
}

// 配列から重複を除く
var arr2 = arr1.filter(function (x, i, self) {
  return self.indexOf(x) === i;
});

arr2.forEach(function( value ) {
  stream.WriteText(value , 1);  // 第2引数が 0:改行なし, 1:改行あり
});


// 第ニ引数(保存先のファイルパス)があればそこに、なければテンポラリファイルに保存
var filepath;
if (PPx.Arguments.Length < 1){
  filepath = getTempFile();
} else {
  filepath = PPx.Arguments.Item(0);
}
stream.saveToFile(filepath, 2);    //1:新規作成 2:新規作成 or 上書き
stream.close();

PPx.Result = filepath;


2019年9月20日金曜日

サブ窓中心の運用①基本的な仕組み


やりたいこと


今回行いたいのは、以下の動作。

1.メイン窓から操作元のファイルを指定し、サブ窓を開く
2.サブ窓で操作先のファイルを選択し、Shift+Enter
3.操作が実行され、サブ窓が閉じる



例えばファイルをコピーしたい場合、思考の流れとしては、

1.コピーしたいファイルを窓Aで選択
2.コピー先のフォルダを窓Bで選択
3.実行

となる。「窓A→窓B」で操作は終わるはずなのだ。しかし、通常の操作では

1.コピーしたいファイルを窓Aで選択
2.コピー先のフォルダを窓Bで選択
3.窓Aへ戻り、コピー操作を実行

となる。「窓A→窓B→窓A」と窓間移動が一度増えるのである。それを解消するのが今回の目的(ちなみにこれは、サブ窓を使う以外にも、「反対窓でマークしたファイルを操作」「fenrirを使う」「一行編集を使う」といった解決方法が存在する)。

準備


ポイントは、サブ窓のキーバインドの一時的な変更。

KC_main    = {
\ENTER    ,*ifmatch CX,%n %: *execute ,%'ppcx_cmd' %: *stop
    %K"@\ENTER"
CLOSEEVENT ,*ifmatch CX,%n %: *alias ppcx_cmd = %%K"@\ENTER" %: *stop
}


こうすると、エイリアスppcx_cmdに実行したい内容を登録すれば、サブ窓に使うPPC[X]のShift+ENTERの挙動を変更することが可能になる。

ファイル移動、コピー、解凍


KC_main    = {
\ENTER    ,*ifmatch CX,%n %: *execute ,%'ppcx_cmd' %: *stop
    %K"@\ENTER"
CLOSEEVENT ,*ifmatch CX,%n %: *alias ppcx_cmd = %%K"@\ENTER" %: *stop
\M ,*ifmatch !CX,%n %: *alias ppcx_cmd = *file !move ,%%*extract(%n"%%%%@*8FCDN"),%%1 %%: %%K"@Q" %: *ppc -r -bootid:x -single %1
\C ,*ifmatch !CX,%n %: *alias ppcx_cmd = *file !copy ,%%*extract(%n"%%%%@*8FCDN"),%%1 %%: %%K"@Q" %: *ppc -r -bootid:x -single %1
\U ,*ifmatch !CX,%n %: *alias ppcx_cmd = *script %0Script\wrap_7zG.js,%%*extract(%n"%%%%a8FDC"),%%1 %%: %%K"@Q" %: *ppc -r -bootid:x -single %1
}

やってることは以前の記事と同じ。ただ少し書き方を変えている
処理元のファイルにカーソルをあわせるか、マークするかしたあと、

移動:Shift+M
コピー:Shift+C
解凍:Shift+U

でサブ窓PPC[X]が開く。あとは処理先のディレクトリで、Shift+Enterを押せばいい。

参考


PPx 逆引き辞典 - PC-98ファイラーHFやPyxisのような感覚でコピー/移動/解凍
キャズムを超えろ! - Pyxisという偉大なファイラ / OSSの魅力
つかさのほえほえ日記 - コピー/移動/解凍先フォルダ選択を別窓で
つかさのほえほえ日記 - 反対窓でマークしたファイルを現在窓に移動/コピー
つかさのほえほえ日記跡地 - PPxとfenrirの連携

追記


2019/09/20 サブ窓をZからXに変更

2019年9月19日木曜日

連番付き変数のファイル入出力


連番付き変数をファイルに書き出し


%*script(%0\Script\SeqUserData2file.js,hoge)

とすると、連番付き変数(この例なら_User:hoge1 _User:hoge2 _User:hoge3 …)を一時ファイルに一行ずつ書き込み、そのパスを返す。また、

*script %0\Script\SeqUserData2file.js,hoge,%0fuga.txt

として、指定したファイル(この場合はfuga.txt)に書き込むこともできる。
連番付き変数の中身がファイルパスなら、

*ppc %*script(%0\Script\SeqUserData2file.js,hoge)

とすれば、お気に入りのように使うことができる。

 SeqUserData2file.js

//!*script
// 連番付き変数をファイルに保存。そのファイルのパスを返す

// テンポラリファイルに保存してそのパスを利用したい場合は
// %*script(%0\Script\SeqUserData2file.js,hoge) のように。特定のファイルに保存したい場合は
// *script %0\Script\SeqUserData2file.js,hoge,fuga.txt とする

// 第一引数 : ユーザデータ(_User:hoge1 _User:hoge2 _User:hoge3...のhoge)
// 第ニ引数 :保存先のファイルパス(省略可能。その場合はテンポラリファイルに保存)

// 引数がなければ終了
if (PPx.Arguments.Length < 1){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit();
}

// テンポラリファイル名の作成
function getTempFile() {
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var tDir = fso.GetSpecialFolder(2);
  var tFile = fso.GetTempName();
  return tDir + "\\" + tFile;
}

var cmd = PPx.Arguments.Item(0);

var stream         = new ActiveXObject("ADODB.Stream");
    stream.type    = 2;
    stream.charset = 'UNICODE';

stream.open();
stream.WriteText(';ListFile',1);

// 登録済みパス一覧を表示
for (var i = 0; true; i++) {
  var str = PPx.Extract("%*getcust\(_User:"+cmd+i+"\)");
  if (str){
    stream.WriteText(str,1);
  } else {
    break;
  }
}

// 第ニ引数(保存先のファイルパス)があればそこに、なければテンポラリファイルに保存
var filepath;
if (PPx.Arguments.Length < 2){
  filepath = getTempFile();
} else {
  filepath = PPx.Arguments.Item(1);
}
stream.saveToFile(filepath,2);
stream.close();
PPx.Result = filepath;

連番付き変数をファイルから読み込み


 *script %0\Script\file2SeqUserData.js,hoge,%0fuga.txt

とすると、fuga.txtの内容を一行ずつ読み込み、連番付き変数(この例なら_User:hoge1 _User:hoge2 _User:hoge3 …)にセットする。

file2SeqUserData.js

//!*script
// テキストファイルの内容を連番付き変数にセットする
// 第一引数:ユーザーデータユーザデータ(_User:hoge1 _User:hoge2 _User:hoge3...のhoge)
// 第二引数:テキストファイルのパス
// *script %0\Script\file2SeqUserData.js,hoge,%0fuga.txt のようにして使う

// 引数がなければ終了
if (PPx.Arguments.Length < 2){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var s = new ActiveXObject('ADODB.Stream');
var cmd = PPx.Arguments.Item(0);
var fn = PPx.Arguments.Item(1);

// エイリアスをリセット
for (var i = 0; i < 20; i++) {
  PPx.Execute("*setcust _User:-|"+cmd+i+" = ");
}

// ファイルを読み取り
s.type = 2;
s.charset = 'UNICODE';
s.open();
s.loadFromFile(fn);

var i = 0;

// エイリアスを順次セット
while(!s.EOS){
  line = s.readText(-2);
  if (line != "" && line != ";ListFile") {
    PPx.Execute("*setcust _User:"+cmd+i+" = "+line);
    i++;
  }
}
s.close();


2019年9月16日月曜日

連番付き変数の登録・取得(_User:name)

_Userを使うと、一時的に文字列を記憶するための変数を利用できる。

_User *setcust _User:name=param , %*getcust(_User:name)
・PPxの設定項目として用意されています。
・PPx内で共通です。(PPc/PPv/PPtray等の何処からでも参照・変更できます。)
・プロセスが終了しても内容は失われません。
PPx間で内容を受け渡ししたいときや、長期に渡り設定を記憶する必要があるときに適しています。

_User:hoge0 _User:hoge1 _User:hoge2 _User:hoge3...というような、連番付き変数に登録する仕組みと、呼び出す仕組みとを作ってみる。

登録


*script %0\Script\setSeqUserData.js,hoge,%FCD

とすれば、_User:hoge0 _User:hoge1 _User:hoge2...にカレントファイルのパスを登録する。

setSeqUserData.js

//!*script
// 第一引数 : ユーザデータ(hoge1 hoge2 hoge3...のhoge)
// 第二引数 : 登録したいデータ(%FCDなど)
// *script %0\Script\setSeqUserData.js,hoge,%FCD のようにして使う。
// この例だと、_User:hoge0 _User:hoge1 _User:hoge2...に順番にカレントファイルを登録する

// 引数がなければ終了
if (PPx.Arguments.Length < 2){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit();
}

var cmd = PPx.Arguments.Item(0);
var macro = PPx.Arguments.Item(1);

// 既に登録されていたら登録しない
for (var i = 0; i < 5; i++) {
  if (PPx.Extract("%*getcust\(_User:"+cmd+i+"\)") == PPx.Extract(macro)){
    PPx.SetPopLineMessage("既に登録されてます");
    PPx.Quit();
  }
}

// _User:に登録
for (var i = 0; i < 5; i++) {
  if (!PPx.Extract("%*getcust\(_User:"+cmd+i+"\)")){
    PPx.Execute("*setcust _User:"+cmd+i+" = "+macro);
    PPx.SetPopLineMessage(cmd+i+"に登録しました");
    break;
  }
}

呼び出し


%*script(%0\Script\getSeqUserData.js,hoge)


とすれば、_User:hoge0 _User:hoge1 _User:hoge2...の中身を順次取得する。

getSeqUserData.js

//!*script
// 第一引数: ユーザーデータ(hoge0 hoge1 hoge2...のhoge)
// 実行すると、hoge0 hoge1 hoge2 hoge3...の値を返す
// %*script(%0\Script\getSeqUserData.js,hoge)のようにして使う

// 引数がなければ終了
if (PPx.Arguments.Length < 1){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var cmd = PPx.Arguments.Item(0);

// cmd0があるかどうかをチェック
if (!PPx.Extract("%*getcust\(_User:"+cmd+0+"\)")){
  PPx.SetPopLineMessage("コマンドが空です");
  PPx.Quit(-1);
}

// cmd_idに1を足す。なければ0を入力
if (!PPx.Extract("%*getcust\(_User:"+cmd+"_id\)")){
  PPx.Execute("*setcust _User:"+cmd+"_id = 0");
}else {
  var i = parseInt(PPx.Extract("%*getcust\(_User:"+cmd+"_id\)")) + 1;
  PPx.Execute("*setcust _User:"+cmd+"_id = "+ i);
}
var i2 = PPx.Extract("%*getcust\(_User:"+cmd+"_id\)");

// commandを実行
if (PPx.Extract("%*getcust\(_User:"+cmd+i2+"\)")){
  PPx.Result = PPx.Extract("%*getcust\(_User:"+cmd+i2+"\)");
}else{
  PPx.Execute("*setcust _User:"+cmd+"_id = 0");
  PPx.Result = PPx.Extract("%*getcust\(_User:"+cmd+0+"\)");
}


参考:ブックマークのローテート - ppxmemo

2019年9月15日日曜日

PPeでメモを取る

僕は普段、howm形式でメモをとっている(参考:MoE
このような、あとで保存しておきたい用のメモとは別に、覚え書き的なメモ(例えば今日これからする予定だとか、気になった本だとか、あとで検索したい言葉だとか)を取りたいと思った。
この用途にxyzzyだと大げさなので、PPeを使ってみる。
PPCからCtrl+Hで起動。PPxフォルダにmemo.txtを作成する。キーバインドは最低限僕が必要なものだけ。

KC_main = { ; PPcメイン窓
^H ,*ppe %0memo.txt -new -k *setcaption -memo-
}

-|K_xyzzy =

K_ppe = { ; PPe(K_ppeに該当しない場合はK_edit参照)
^X ,*setnextkey K_xyzzy ; 2ストロークキー。Key Moduleが必要
^E = @END ; 行末へ
}

K_xyzzy = { ** comment **
S ,%k"^S"
^C ,*ifmatch !-memo-,%W %: %k"^S &F4" %: *stop ; 内容が変更されていたら保存して終了
 %k"&F4"
}

2019年9月12日木曜日

一行編集でWebブックマークを開く



各行によく行くサイトのurlを書いたテキストファイルをPPxフォルダに用意する。
正規表現でurlを抽出し、実行する。

web.txt

http://hoehoetukasa.blogspot.com ほえほえ日記
https://twitter.com/ twitter
https://egg.5ch.net/test/read.cgi/software/1476708638 スレ
http://xopstukasa.blogspot.com/

以下を実行。

*start %*regexp("%*input("" -title:"Webブックマーク" -mode:e -k %%:
 *completelist /set /list /file:"%0web.txt")","s@(https?://[\w/:%#\$&\?\(\)~\.=\+\-]+)(.*)@$1@")

2019年9月7日土曜日

ImageMagickで複数画像ファイルを一つのPDFに

ImageMagickを使い、マークした複数の画像を一つのPDFにする。
レスポンスファイルを使う。

*string o,tempdir=%*name(D,"%aFDC")  %:
 *string o,filename=%*name(C,'%so"response")  %:
 *cd %so"tempdir" %:
 %Ob %'imagemagic' @%so"filename" %"拡張子を入力してください"%{%FD\%|hoge%|.pdf%}

普通に

%Ob %'imagemagic' %@FDC hoge.pdf


とすると失敗したので色々模索してみた。もっと簡単な書き方があるかもしれない。

2019年6月13日木曜日

一行編集からメニュー呼び出し


メニューを登録したキーは忘れる


マスクメニュー、ファイルパスコピーメニュー、などなどたくさんのメニューを僕は作ってきたはずだが、使い続けているものはほぼない。
なぜでしょう?登録キーを忘れてしまうからですね!YES!
ホットキーを工夫しようと2ストロークキーを利用してみようとメニューのメニューを作ろうと、無理なものは無理。そもそもメニューにしてまとめているのは、普段それほど使わないから。そんなのどうしたって忘れてしまう。

コマンドなら忘れないかも


だが!一行編集で、コマンドから呼び出せるようにしたならどうか?
かつてfenrirを使ってたときは、普段使わないソフトだろうと見つけることができた。同じことが一行編集を使えばできるのではないか、という思いつきです。

前準備


PPtrayを常駐し、一行編集をホットキーで起動できるようにしておく。以下はCtrl+Spaceで呼び出している。

K_tray = { ; PPtrayホットキー(キー指定 不可,V_xx 形式を推奨)
^' ' ,*if %*findwindowtitle("PPlauncher") %: *focus !"PPlauncher" %: *stop
 *execute,%*input("" -title:"PPlauncher" -mode:h)
}

やり方


とりあえずメニューを用意する。

A_exec = { ; エイリアス
qpdf = D:\bin\qpdf\bin\qpdf.exe
}

-|M_QPdf =

M_QPdf    = {    ** comment **
結合(&C)    = %Ob qpdf --empty --pages %#FCD -- %"アウトプットのファイル名"%{%|output%|.pdf%}
抽出    = %Ob qpdf --empty --pages %FCD %"抽出したいページを指定"%{1%|-2%} -- %"アウトプットファイル"%{%|output%|.pdf%}
回転    = %Ob qpdf --rotate=%"角度を指定"%{+90%|%} %FCD %"アウトプットファイル"%{%|output%|.pdf%}
}


ユーザーコマンドにわかりやすい名前で登録する。

_Command = { ; ユーザコマンド・関数
pdfmenu = *execute C,%%M_QPdf,C
}

履歴にコマンドを登録する。

*addhistory h,"*pdfmenu"


2019年6月11日火曜日

QpdfでPDFメニュー

Qpdfは、コマンドラインでPDFを操作するツールらしい
今まではPDFtkを使ってたが、久々に使うとなぜか思い通りの操作にならなかったので、試しにこっちを使ってみる

A_exec = { ; エイリアス
qpdf = D:\bin\qpdf\bin\qpdf.exe
}

-|M_QPdf =

M_QPdf    = {    ** comment **
結合(&C)    = %Ob qpdf --empty --pages %#FCD -- %"アウトプットのファイル名"%{%|output%|.pdf%}
抽出    = %Ob qpdf --empty --pages %FCD %"抽出したいページを指定"%{1%|-2%} -- %"アウトプットファイル"%{%|output%|.pdf%}
回転    = %Ob qpdf --rotate=%"角度を指定"%{+90%|%} %FCD %"アウトプットファイル"%{%|output%|.pdf%}
}

参考


Qpdf : コマンドラインのPDFツール

2019年2月1日金曜日

PPxをできるだけあふっぽくする



コンセプト


  • 思い立って、PPxをできるだけあふっぽくしてみた
  • 以前は自分がよく使うキーバインド以外は実装しなかったが、今回はAFXW.TXTを見ながらできるだけ網羅的にやってみた
  • ビューアは埋め込み方式

事前準備


1.PPxをインストールする
2.以下のPPx Moduleをインストールする

  • Paper Plane xUI Message Module
  • Paper Plane xUI Window Module
  • Paper Plane xUI Text Module
  • Paper Plane xUI Script Module

3.PPxフォルダにScriptという名前で空フォルダを作成する
4.ppxmemo - ファイル置き場から以下をダウンロードし、Scriptフォルダに移動する。

  • MarkCursor.js
  • MarkCursorR.js
  • afx_o.js
  • afx_shift_o.js
  • go_mark.js
  • go_markR.js
  • dirhistorymenu.js


設定の取り込み


  1. 以下のコードをクリップボードにコピーする
  2. カスタマイザーを起動(PPCUSTW.EXEを実行するか、メニューバーから「ツール - カスタマイズ」を選択)し、ファイルタブから「編集して取込」をクリック
  3. クリップボードの内容をペーストした状態で「編集して取込」ウィンドウが開く。左下にある「追加する」のCHECKを外し、OKを押す
  4. PPxを再起動する

X_combo = 1 ; 複数 PPc を一体化 0:しない 1:する
X_combos = B0000011000001000010000000001001,B0000000 ; 一体化時設定
X_mpane = 2,2 ; 一体化時の最大同時表示ペイン数,起動時のペイン数
X_inag = 0 ; 現在窓以外はグレー調に 0:しない 1:する
XC_celD = _AUTO,_AUTO,4,7 ; エントリ表示 文字,背景,カーソル,マーク
CC_log = _WHI,_BLA ; 共用ログ、アドレスバー(文字,背景)_AUTO可
C_eInfo = _AUTO,_DRED,_AUTO,_DBLA,_DBLU,_DCYA, _DBLA,_BRO,_BLU,_WHI,_AUTO,HA00000,_AUTO, _SBLU,_BRO,_CYA,_GRE,_RED,_MAG,_DRED, _AUTO 
XV_drag = 2,1,3,0 ; ドラッグ開始ボタン スクロール,選択,窓移動,ジェスチャ(右のみ)
  ; 0:使用しない 1:左 2:右 3:中/ホイール 4:左右同時 5:第4 6:第5

KC_main = { ; PPcメイン窓
&'\' ,%M_ClipPath
^ENTER = @Z
'_' ,*autodragdrop C#~,r
^UP = @PUP
^\LEFT = @^LEFT
&Z = @F11
H ,*ifmatch /.+/,%NVY %: %KVY"H" %: *stop
 *script %0Script\dirhistorymenu.js %: *execute ,%%j%%M_hoehoe,%1
HOME ,*ifmatch /.+/,%NVY %: %KVY"HOME" %: *stop
 %K"@HOME"
W = @O
'~' ,*cursor 16,-1,5,1,5,0
'^' ,*cursor 16,1,5,1,5,0
'`' = @'+'
'*' = @\F
\D = @D
^\END ,%K~"@^F5
^\RIGHT = @^RIGHT
^END = @^F5
DEL = @\DEL
INS = @\INS
B ,*ifmatch /.+/,%NVY %: %KVY"B" %: *stop
 %K"@B"
E ,%"Text edit"%Orib,editor %FDC
P ,*pack "%2%\|%X|" %Or-
\P ,%"Pack File Ex" %M_xpack
F12 ,%M_cust,C
Q = @&F4
Z = CUSTOMIZE
ESC ,*ifmatch /.+/,%NVY %: *ppvoption sync %: *stop
 %K"@PAUSE"
&RIGHT ,*pairrate -3
&LEFT ,*pairrate +3
'-' = NULL
I ,*countsize
\I ,*ifmatch /.+/,%NVY %: %KVY"\I" %: *stop
 *countsize
L ,*ifmatch /.+/,%NVY %: %KVY"L" %: *stop
 %K"@\L"
J ,*ifmatch /.+/,%NVY %: %KVY"J" %: *stop
 %j%M_pjump
\J ,*ifmatch /.+/,%NVY %: %KVY"\J" %: *stop
 %K"@L"
\F ,*ifmatch /.+/,%NVY %: %KVY"\F" %: *stop
 %K"@\F"
^\UP = @DEL @UP @UP @INS @DOWN
^\DOWN = @DEL @INS @DOWN
O ,*script %0\Script\afx_o.js
\O ,*ifmatch /.+/,%NVY %: %KVY"\O" %: *stop
 *script %0\Script\afx_shift_o.js
^A ,*ifmatch /.+/,%NVY %: %KVY"^A" %: *stop
 %K"@&\A"
^B = @&\B
^C ,*ifmatch /.+/,%NVY %: %KVY"^C" %: *stop
 %K"@&\C"
^D = @&\D
^E = @&\E
^F = @&\F
^G = @&\G
^H = @&\H
^DOWN = @PDOWN
^I = @&\I
^V_H4A = @&\J
^K = @&\K
^L = @&\L
^M = @&\M
^N = @&\N
^O = @&\O
^P = @&\P
^Q = @&\Q
^R = @&\R
^S = @&\S
^T = @&\T
^U = @&\U
^V ,*ifmatch /.+/,%NVY %: %KVY"^V" %: *stop
 %K"@&\V"
^W = @&\W
^X = @&\X
^Y = @&\Y
^Z = @&\Z
'\' ,*ifmatch /.+/,%NVY %: %M_WallPaper,1 %: *stop
 %K"@^\F10
^V_H31 = @&\1
\HOME = @\END
^V_H32 = @&\2
^V_H33 = @&\3
^V_H34 = @&\4
^V_H35 = @&\5
^V_H36 = @&\6
^V_H37 = @&\7
^V_H38 = @&\8
^V_H39 = @&\9
F ,*ifmatch /.+/,%NVY %: %KVY"F" %: *stop
 %K"@\J"
^' ' ,*script %0\Script\MarkCursor.js
^\SPACE ,*script %0\Script\MarkCursorR.js
^V_HBA ,*script %0\Script\go_mark.js
^\V_HBA ,*script %0\Script\go_markR.js
A = @\HOME
\A = @\END
END ,*ifmatch /.+/,%NVY %: %KVY"END" %: *stop
 %K"@F5"
\E ,*ifmatch /.+/,%NVY %: %KVY"\E" %: *stop
 *makefile %1\%"新規テキストの編集"%$E %: %Ob editor %1\%"新規テキストの編集"%$E
\X = @H
^INS ,%z"#17:\"
^DEL ,%z"#10:\"
\V = @I
\M ,*ppcfile !move,%M_pjump,A
\C ,*ifmatch /.+/,%NVY %: %KVY"\C" %: *stop
 *ppcfile !copy,%M_pjump,A
LEFT ,*cursor 4, -1,6,B0100,6,B0100
RIGHT ,*cursor 4, 1,6,B0100,6,B0100
D = @\D
V_HBD = @^D
NUM- ,*pairrate 50
PUP ,*ifmatch /.+/,%NVY %: %KVY"PUP" %: *stop
 %K"@PUP"
PDOWN ,*ifmatch /.+/,%NVY %: %KVY"PDOWN" %: *stop
 %K"@PDOWN"
^LEFT ,*ifmatch /.+/,%NVY %: %KVY"^LEFT" %: *stop
 *cursor 8,1,12,0,12,0
^PUP ,*ifmatch /.+/,%NVY %: %KVY"^PUP" %: *stop
 %K"@^PUP"
F2 ,*ifmatch /.+/,%NVY %: %KVY"F2" %: *stop
 %K"@F2"
^RIGHT ,*ifmatch /.+/,%NVY %: %KVY"^RIGHT" %: *stop
 *cursor 8,1,13,0,13,0
^PDOWN ,*ifmatch /.+/,%NVY %: %KVY"^PDOWN" %: *stop
 %K"@^PDOWN"
F3 ,*ifmatch /.+/,%NVY %: %KVY"F3" %: *stop
 %K"@F3"
F4 ,*ifmatch /.+/,%NVY %: %KVY"F4" %: *stop
 %K"@F4"
F5 ,*ifmatch /.+/,%NVY %: %KVY"F5" %: *stop
 %K"@F5"
SPACE ,*ifmatch /.+/,%NVY %: %KVY"SPACE" %: *stop
 %K"@SPACE"
^F4 ,*ifmatch /.+/,%NVY %: %KVY"^F4" %: *stop
 %K"@^F4"
\L ,*ifmatch /.+/,%NVY %: %KVY"\L" %: *stop
 %K"@\L"
\F5 ,*ifmatch /.+/,%NVY %: %KVY"\F5" %: *stop
 %K"@\F5"
\SPACE ,*ifmatch /.+/,%NVY %: %KVY"\SPACE" %: *stop
 %K"@\SPACE"
\S ,*ifmatch /.+/,%NVY %: %KVY"\S" %: *stop
 %K"@\S"
\U ,*ifmatch /.+/,%NVY %: %KVY"\U" %: *stop
 %K"@\U"
TAB ,*ifmatch /.+/,%NVY %: %KVY"TAB" %: *stop
 %K"@TAB"
2 ,*ifmatch /.+/,%NVY %: %KVY"2" %: *stop
 %K"@2"
4 ,*ifmatch /.+/,%NVY %: %KVY"4" %: *stop
 %K"@4"
8 ,*ifmatch /.+/,%NVY %: %KVY"8" %: *stop
 %K"@8"
\N ,*ifmatch /.+/,%NVY %: %KVY"\N" %: *stop
 %K"@\N"
\T ,*ifmatch /.+/,%NVY %: %KVY"\T" %: *stop
 %K"@\T"
^SPACE ,*ifmatch /.+/,%NVY %: %KVY"^SPACE" %: *stop
 %K"@^SPACE"
&ENTER ,*ifmatch /.+/,%NVY %: %KVY"&ENTER" %: *stop
 %K"@&ENTER"
R ,*ifmatch /.+/,%NVY %: %KVY"R" %: *stop
 %K"@R"
\END ,%K~"@F5"
}
KC_tree = { ; PPcツリー(キー制限有,V_xx 形式を推奨)
}
KC_incs = { ; PPcインクリメンタルサーチ(制限有)
}
K_list = { ; PPc AutoD&D(制限有)
}
KV_main = { ; PPvメイン窓
&ENTER ,*ifmatch /.+/,%NVX %: *closeppx "VX" %: *stop
 %Ox *ppv -bootid:X -k *ppv -r %FCD
ENTER ,*ifmatch "!/VL/",%n %: *stop
 *ifmatch "/CA/",%*extract(C"%%n") %: *closeppx "VL" %: *execute C,*pane newpane CB %%: *focus CA %: *stop
 *ifmatch "/CB/",%*extract(C"%%n") %: *closeppx "VL" %: *execute C,*pane newpane CA %%: *pane swappane %%: *focus CB
1 = @END
2 = @DOWN
3 = @PDOWN
4 = @LEFT
6 = @RIGHT
7 = @HOME
8 = @UP
9 = @PUP
E ,%"JMTE|Text edit"%Orib,editor %{%FDC%}
^LEFT ,%K-C"@UP@N"
^RIGHT ,%K-C"@DOWN@N"
^UP ,%K-C"@\SPACE@N"
^DOWN ,%K-C"@SPACE@N"
F12 ,%M_cust,C
}
KV_page = { ; PPvテキスト(ページ)追加設定
^' ' = @I
&Z ,%KC"@F11
&DOWN ,%K-C"@DOWN@N"
&UP ,%K-C"@UP@N"
\C = @C
\T = @C
\N = @U
\ENTER ,%"JMTE|Text edit"%Orib,editor %FDC
8 ,*viewoption -tab:8
4 ,*viewoption -tab:4
2 ,*viewoption -tab:2
TAB ,*RotateExecute id,*viewoption -hex,*viewoption -text
\O ,*viewoption -utf8
\I ,*viewoption -utf16be
\U ,*viewoption -utf16
\S ,*viewoption -sjis
\J ,*viewoption -jis
\E ,*viewoption -euc
\SPACE = @'['
\F5 = @'['
\L = @'['
H = @'['
\F4 = @B
\F = @B
SPACE = @']'
L = @']'
F5 = @']'
F4 = @F
F3 = @J
^LWIN = @END
^RIGHT = @END
F2 = @END
^PUP = @HOME
F1 = @HOME
^LEFT = @HOME
}
KV_crt = { ; PPvテキスト(キャレット)追加設定
^RIGHT = @END
^LEFT = @HOME
}
KV_img = { ; PPv画像追加設定
^W ,*ifmatch "/CA/",%*extract(C"%%n") %: %Q"現在の画像を壁紙にしますか?" %: *customize X_bg:P_ca=%FDC %: *customize X_bg:T_ca=1 %: *stop
 *ifmatch "/CB/",%*extract(C"%%n") %: %Q"現在の画像を壁紙にしますか?" %: *customize X_bg:P_cb=%FDC %: *customize X_bg:T_cb=1
F ,*togglewinsize
F4 ,*togglewinsize
L = @K
R = @L
END ,*zoom -1
HOME ,*zoom 0
\R = @K
'\' ,%M_WallPaper,1
\L = @L
}

E_cr = { ; [Enter]用判別
BAT ,%M_Ccr,!X
EXE ,%M_Ccr,O
COM ,%M_Ccr,!X
:EXE32C ,%M_Ccr,!X
:EXEX64C ,%M_Ccr,!X
:EXEDOS ,%M_Ccr,!X
:SCR ,%M_Ccr,O
:HELP ,%M_Ccr,O
. ,%M_Ccr,!V
DOC ,%M_Ccr,!V
TXT ,*allview
:UTEXT ,%M_Ccr,!V
:DOC95 ,%M_Ccr,!V
:DOC97 ,%M_Ccr,!V
:DOCX ,%v"%C\word\document.xml"
JPEG ,*ifmatch "/CA/",%n %: *halfview %: *stop
 *allview
:JPEG ,*ifmatch "/CA/",%n %: *halfview %: *stop
 *allview
BMP ,*ifmatch "/CA/",%n %: *halfview %: *stop
 *allview
:BMP ,*ifmatch "/CA/",%n %: *halfview %: *stop
 *allview
:DIR = C_DIR
:LHA = C_DIR
:PKZIP = C_DIR
:CAB = C_DIR
:XLF = C_DIR
GZ = C_DIR
7Z = C_DIR
CAB = C_DIR
RAR = C_DIR
:XVBS ,%"Script" *script %{%R%|%}
:XPLS ,%"Script" *script %{%R%|%}
MAKEFILE. ,%{MAKE %|%}
MAK ,%{MAKE -f%C%}
PNG ,*ifmatch "/CA/",%n %: *halfview %: *stop
 *allview
JPG ,*ifmatch "/CA/",%n %: *halfview %: *stop
 *allview
GIF ,*ifmatch "/CA/",%n %: *halfview %: *stop
 *allview
CPP ,*allview
H ,*allview
C ,*allview
L ,*allview
EL ,*allview
HTML ,*allview
HTM ,*allview
XYZZY ,*allview
EMACS ,*allview
SCM ,*allview
INI ,*allview
VBS ,*allview
JS ,*allview
PY ,*allview
PYW ,*allview
CFG ,*allview
LOG ,*allview
HOWM ,*allview
}

-|M_ClipPath =

M_ClipPath    = {    ** comment **
ファイル名\t【カーソル上】    = *cliptext %R %: *linemessage Clip : %R
フルパスファイル名\t【カーソル上】    = *cliptext %FCD %: *linemessage Clip : %FCD
--    = 
フルパス名    = *cliptext %1 %: *linemessage Clip : %1
--    = 
ファイル名\t【マーク・スペース区切り】    = *cliptext %#FC %: *linemessage Clip : %#FC
フルパスファイル名\t【マーク・スペース区切り】    = *cliptext %#FCD %: *linemessage Clip : %#FCD
}
-|M_WallPaper =

M_WallPaper = { ** comment **
PPC全体の壁紙にする(&1) = *customize X_bg:P_ca=%FDC %: *customize X_bg:P_cb=%FDC %: *customize X_bg:T_ca=20 %: *customize X_bg:T_cb=20
PPC[&A]の壁紙にする = *customize X_bg:P_ca=%FDC %: *customize X_bg:T_ca=1
PPC[&B]の壁紙にする = *customize X_bg:P_cb=%FDC %: *customize X_bg:T_cb=1
-- =
PPC全体の壁紙をナシにする = *customize X_bg:-|P_ca= %: *customize X_bg:-|P_cb= %: *customize X_bg:-|T_ca= %: *customize X_bg:-|T_cb=
PPC[A]の壁紙をナシにする = *customize X_bg:-|P_ca= %: *customize X_bg:-|T_ca=
PPC[B]の壁紙をナシにする = *customize X_bg:-|P_cb= %: *customize X_bg:-|T_cb=
-- =
壁紙の明るさを調整する = *customize X_bg:Bright=%"明るさ(Bright)"%{%*getcust(X_bg:Bright)%}
}
X_win = { ; 表示形式全般 *layout
 ;  +--------B8:1=タイトルバーを表示させない
 ;  |+-------B7:1=(PPcのみ)簡易ヘッダを表示する
 ;  ||+------B6:1=(PPcのみ)標準の情報行を表示させない
 ;  |||+-----B5:1=標準のステータス行を表示させない
 ;  ||||+----B4:1=標準のツールバーを表示する(PPc:B_cdef,PPv:B_vdef)
 ;  |||||+---B3:1=(PPcのみ)スクロールバーの位置を下端<->右端で切替
 ;  ||||||+--B2:1=スクロールバーを表示させない
 ;  |||||||+-B1:1=タスクバー等で1つにまとめる(要PPtray)ただし不都合有り
 ;  ||||||||+B0:1=MenuBar表示
V = B100100100
}

_others = { ; その他設定
SyncViewID = Y
}
_Command = { ; ユーザコマンド・関数
allview = %Oi *ppv -bootid:L %*arg(1) %*name(CD,"%R","%1") %: *wait 100,1 %: *execute C,*capturewindow VL -pane:0 %: *execute C,*pane hide ~
halfview = *ifmatch /.+/,%NVY %: *ppvoption sync %: *stop
 %Oi *ppv -bootid:Y %*name(CD,"%R","%1") %: *ppvoption sync %: *wait 100,1 %: *capturewindow VY -pane:~ -selectnoactive
}

2019年1月30日水曜日

PPc上からPPvを操作

連動ビュー使用時、PPc上からPPvを操作する方法。
PageUpだとか検索だとかいった操作をPPvで行う場合、一々そちらにフォーカスを移すという動作が面倒なので、やってみた。

_others = { ; その他設定
SyncViewID = Y
}

KC_main = { ; PPcメイン窓
PUP ,*ifmatch /.+/,%NVY %: %KVY"PUP" %: *stop
 %K"@PUP"
PDOWN ,*ifmatch /.+/,%NVY %: %KVY"PDOWN" %: *stop
 %K"@PDOWN"
F ,*ifmatch /.+/,%NVY %: %KVY"F" %: *stop
 %K"@F"
'[' ,*ifmatch /.+/,%NVY %: %KVY"[" %: *stop
 %K"@'['"
']' ,*ifmatch /.+/,%NVY %: %KVY"]" %: *stop
 %K"@']'"
'=' ,*ifmatch /.+/,%NVY %: %KVY"=" %: *stop
 %K"@'='"
}


このように、


  1. 連動ビュー用のPPvIDを決めておき
  2. *ifmatchでそのIDのPPvが存在してるか否かを判別。起動してればPPvを操作、してなければPPcを操作


とすればいい。

2019年1月20日日曜日

MakeComment.jsの自動実行!



僕はPPxとXyzzyでメモ環境を作っている(Memo on the Electron)。今回は、メモのタイトル表示に使うMakeComment.jsを自動実行する話。

準備


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

MakecommentA.js

//!*script
//カレントディレクトリに一行目とファイルパスを対応させたコメントファイル(00_INDEX.txt)を作成


var strLine = "\r\n";
var currentDir = PPx.Extract('%1');
var fs = PPx.CreateObject("Scripting.FileSystemObject");

// すべてのhowmファイルにコメントがついていれば終了
for (var i = 0; i < PPx.EntryAllCount; i++) {
  if (PPx.Entry(i).Name.match(/.howm$/i) && PPx.Entry(i).Comment.match(/^$/i))
    break;
  else if (i == PPx.EntryAllCount - 1)
    PPx.Quit();
}

for (var i = 0; i < PPx.EntryAllCount; i++) {
  var fullpath = fs.BuildPath(currentDir,PPx.Entry(i).Name);
  // ファイルあるいはフォルダが存在しない場合の処理
  if (!(fs.FolderExists(fullpath) || fs.FileExists(fullpath))) {
    continue;
  }
  // .あるいは..の処理
  else if (PPx.Entry(i).Name == "."){
    str = PPx.Entry(i).Name + "\t*\r\n";
    strLine =  strLine + str;
  } else if (PPx.Entry(i).Name == ".."){
    str = PPx.Entry(i).Name + "\t**\r\n";
    strLine =  strLine + str;
  }
  // サイズが0のファイルとディレクトリは読み込まない
  else if (PPx.Entry(i).Size == 0) {
    if (PPx.Entry(i).Comment != ""){
      str = PPx.Entry(i).Name + "\t" + PPx.Entry(i).Comment + "\r\n";
      strLine =  strLine + str;
    } else {
      str = PPx.Entry(i).Name + "\t" + PPx.Entry(i).Name + "\r\n";
      strLine =  strLine + str;
    }
  }
  // 拡張子がhowmのファイルを読み込む
  else if (PPx.Entry(i).Name.match(/.howm$/i)) {
    var entryName = PPx.Entry(i).Name;
    var objItem = currentDir + "\\" + entryName;
    // ファイルの内容を取得
    objInFile = fs.OpenTextFile(objItem, 1);
    // ファイル名+Tab+一行目の最初二文字~40字を切り取ったもの+改行をstrに代入
    var title = objInFile.ReadLine().slice( 2,40 );
    if (title == "") title = "-blank-"
    str = entryName + "\t" + title + "\r\n";
    strLine =  strLine + str;
    objInFile.Close();
  }
}

if (strLine == "\r\n"){
  PPx.Quit();
} else {
  strLine = strLine + '00_INDEX.txt\t *** COMMENT FILE ***';
}

// カレントディレクトリに00_INDEX.txtを作成
strCreateFile = fs.BuildPath(currentDir,"00_INDEX.txt");
fs.CreateTextFile(strCreateFile);

// 00_INDEX.txtに書き込み
objOutFile = fs.OpenTextFile(strCreateFile, 2);
objOutFile.Write(strLine);
objOutFile.Close();

// F5で更新
PPx.Execute("%K\"@[F5]\"")


最初に、コメント無しのhowmファイルがあるかどうかをチェック。なければ終了するようにする。フォルダを読み込むたびに、不要にコメントファイルを作成すると鬱陶しいからだ。

フォルダ設定


このスクリプトを自動実行したいフォルダに行き、以下のコマンドを実行。

*diroption -thisbranch


ディレクトリ別の設定メニューが表示されるので、「実行」を選択。


出てきた一行編集ウィンドウに、

*script %0\Script\MakeCommentA.js

と入力する。これで、そのディレクトリ以下でこのスクリプトを自動実行するようになる。



スクリプトの最後にF5で更新しているが、「すべてのhowmファイルにコメントがついていれば終了」がスクリプト内にあるから無限ループにはならない…はず?

参考


MakeComment.jsの自動実行? - つかさのほえほえ日記

2019年1月15日火曜日

フォルダ履歴ジャンプメニュー(動的)




PPcでフォルダ履歴メニューを表示し、選択したらパス移動する。
5年前にも同じことをしていたようなのだが、今回はスクリプトを使い、メニューを動的にした。履歴がない場合はその項目を表示しない。

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

dirhistorymenu.js

//!*script
// ディレクトリ履歴メニューを作成

PPx.Execute("*setcust -|M_hoehoe ="); // メニューの削除
for (var i = 0; i < 10; i++) {
  var name = PPx.Extract("%*dirhistory("+i+")");
  if (name){
    PPx.Execute("*setcust M_hoehoe:"+name.replace('\\t','\\\\t')+"="+name); // メニューの登録。\t は桁揃えになるので置換
    }
}

以下のコマンドを実行。

*script %0Script\dirhistorymenu.js %: *execute ,%%j%%M_hoehoe,%1

*executeをかませているのは、ショートカットにマクロ文字を使うため。

参考


フォルダ履歴ジャンプメニュー - つかさのほえほえ日記