2021年12月23日木曜日

サブ窓の起動パスをフォルダごとに記憶

前回の記事のコピー/移動バージョンです。

僕は、移動やコピーをする際は、サブ窓で処理先を指定している。

  1. 処理元のファイルを選択
  2. Shift+Cを押してサブ窓を起動
  3. 処理先のフォルダに移動してShift+Enter


という順序だ。

今回は、サブ窓の起動パスをフォルダごとに記憶するようにする。

KC_main	= {	; PPcメイン窓
\C	,*string o,dest=%*getcust(S_destlist:%1)
	*ifmatch 0,0%so"dest" %: *string o,dest=%1
	*ppc -r -bootid:x -single -k %%j%so"dest" %%: *mapkey use,K_subwin %%: *linemessage コピー先を選択してください %%: *string i,temp_exec=*file !copy ,%%%%*extract(%n"%%%%%%%%@*8FCDN"),%%%%1 %%%%: *setcust S_destlist:%%%%*extract(%n"%%%%%%%%1")=%%%%1 %%%%: %%%%K"@Q"
\M	,*string o,dest=%*getcust(S_destlist:%1)
	*ifmatch 0,0%so"dest" %: *string o,dest=%1
	*ppc -r -bootid:x -single -k %%j%so"dest" %%: *mapkey use,K_subwin %%: *linemessage 移動先を選択してください %%: *string i,temp_exec=*file !move ,%%%%*extract(%n"%%%%%%%%@*8FCDN"),%%%%1 %%%%: *setcust S_destlist:%%%%*extract(%n"%%%%%%%%1")=%%%%1 %%%%: %%%%K"@Q"
}

K_subwin	= {
\ENTER	,*execute ,%si"temp_exec"
}

S_destlistに処理元のフォルダパスと処理先のフォルダパスをセットにして保存している。ここに記載がない場合はカレントディレクトリが起動パスになる。

参考

2021年12月22日水曜日

サブ窓から実行ファイルに投げる(拡張子ごとにパスを記憶)

僕はファイルを特定のプログラムで開きたいとき、

  1. 処理元のファイルを選択
  2. Shift+Xを押してサブ窓を起動
  3. 実行ファイルにカーソルをあわせてShift+Enter

という操作で実現できるようにしている。

今回は、サブ窓で最初に開くフォルダを拡張子ごとに記憶できるようにする。


以下を編集して取込。

KC_main	= {	; PPcメイン窓
\X	,*ppc -r -bootid:x -single -k %%J%ME_execList %%: *mapkey use,K_subwin %%: *linemessage EXEファイルを選択してください %%: *string i,temp_exec=*ifmatch .exe %%%%: %%%%Ob %%%%FCD %%%%*extract(%n"%%%%%%%%#FCD") %%%%: %%%%K"@Q" %%%%: *ifmatch !0,0%%%%*extract(%n"%%%%%%%%FT") %%%%: *setcust E_execList:%%%%*extract(%n"%%%%%%%%FT"),%%%%FCD
}

K_subwin	= {	** comment **
\ENTER	,*execute ,%si"temp_exec"
}

E_execList	= {
*	,D:\bin
}

実行ファイルをE_execListに登録、次回からはそのパスを開くようにしている。 E_execList:*は登録した拡張子がない場合にサブ窓で開くパス。各自読み替えてください。

参考

2021年12月21日火曜日

指定ハイライトを順次マーク

 PPxでは指定ハイライトが1~7まで用意されている。

カレントディレクトリに指定ハイライトがある場合、それを順次マークできるようにする。


以下のスクリプトを保存。これは、引数に1~7の数値を取り、その数値以上かつ最も近い数値の指定ハイライトをマークするスクリプト。また、マークした指定ハイライトの数値+1を戻り値として返す。

highlightmark.js

//!*script
// 第一引数 : 1~7の数値
// 戻り値   : マークした指定ハイライトの数値+1(数値が7のときは1)
// 
// 第一引数の数値以上かつ最も近い数値の指定ハイライトをマークする

if (PPx.Arguments.Length < 1){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit();
}

var arg = parseInt(PPx.Arguments.Item(0));
var hl_1st_num = 0;
var hl_last_num = 0;
if (arg > 7 || arg <1 ) PPx.Quit();

// 指定ハイライトnの値を取得
// 最小値をhl_1st_numへ、引数の数値以上かつ最も近い値をhl_last_numへ
// hl_last_numが存在する場合、エントリマークを実行
for (var i = 1; i < 8; i++) {
  for (var j = 0; j < PPx.EntryAllCount; j++) {
    if(PPx.Entry(j).Highlight == i){
      if (!hl_1st_num) {
        hl_1st_num = i;
      }
      if (arg > i) continue;
      hl_last_num = i;
      PPx.Entry(j).Mark = 1;
    }
  }
  if (hl_last_num) break;
}

// hl_last_numが存在しない場合のエントリーマーク実行
if (hl_1st_num && !hl_last_num) {
  for (var i = 0; i < PPx.EntryAllCount; i++) {
    if(PPx.Entry(i).Highlight == hl_1st_num){
      PPx.Entry(i).Mark = 1;
    }
  }
}

// 返り値の処理
if (hl_last_num == 7) {
  PPx.Result = 1;
} else if (!hl_1st_num && !hl_last_num) {
  PPx.Result = 1;
} else if (hl_last_num) {
  PPx.Result = hl_last_num+1;
} else if (hl_1st_num) {
  PPx.Result = hl_1st_num+1;
}


以下のコマンドを適当なキーに登録する。

*ifmatch 0,0%si"hl" %: *string i,hl = 1
*unmarkentry
*string i,hl=%*script(%0\Script\highlightmark.js,%si"hl")


参考 つかさのほえほえ日記:ハイライトモード

2021年12月19日日曜日

ハイライトモード

キーバインドを一時的にハイライトモードに変更。ハイライトを使いやすくする。

また、ハイライトを保存、再現できるようにする。

Paper Plane xUI Key Moduleが必要。


以下を編集して取込。


KC_main = {
F1	,*mapkey use,K_highlightmode %: *linemessage HIGHLIGHT MODE: Press H for HELP
}

K_highlightmode = {
SPACE	, *markentry -highlight:1 %R %: %K"@DOWN"
\SPACE	, *markentry -highlight:0 %R %: %K"@UP"
^S	, *makelistfile 00_LISTFILE.txt -basic -highlight
H	, %"highlight mode"%I"SPACE%bt:ハイライト%bn\SPACE%bt:ハイライト解除%bn1~7 %bt:指定ハイライトの変更%bn^S%bt:ハイライトの保存%bnESC%bt:ハイライトモード終了"
ESC	, *mapkey delete,K_highlightmode %: *linemessage HIGHLIGHT MODE END
1	, *linemessage ハイライト1に変更しました %: *setcust K_highlightmode:SPACE,*markentry -highlight:1 %%R %%: %%K"@DOWN"
2	, *linemessage ハイライト2に変更しました %: *setcust K_highlightmode:SPACE,*markentry -highlight:2 %%R %%: %%K"@DOWN"
3	, *linemessage ハイライト3に変更しました %: *setcust K_highlightmode:SPACE,*markentry -highlight:3 %%R %%: %%K"@DOWN"
4	, *linemessage ハイライト4に変更しました %: *setcust K_highlightmode:SPACE,*markentry -highlight:4 %%R %%: %%K"@DOWN"
5	, *linemessage ハイライト5に変更しました %: *setcust K_highlightmode:SPACE,*markentry -highlight:5 %%R %%: %%K"@DOWN"
6	, *linemessage ハイライト6に変更しました %: *setcust K_highlightmode:SPACE,*markentry -highlight:6 %%R %%: %%K"@DOWN"
7	, *linemessage ハイライト7に変更しました %: *setcust K_highlightmode:SPACE,*markentry -highlight:7 %%R %%: %%K"@DOWN"
}

F1を押すとハイライトモードになり、一時的にキーバインドが


  • SPACE :ハイライト
  • \SPACE :ハイライト解除
  • 1~7 :指定ハイライトの数値変更
  • ^S :ハイライトの保存(フォルダ内に00_LISTFILE.txtを作成)
  • H :ヘルプ表示
  • ESC :ハイライトモード終了


となる。

Ctrl+Sで00_LISTFILE.txtに保存したハイライトを再現したい場合は

*markentry -set:00_LISTFILE.txt


とすればいい。

例えば特定のディレクトリで、00_LISTFILE.txtが存在すればハイライトを再現するようにしたいなら、次のようになる。

*diroption -thispath cmd:"*ifmatch ""o:e,a:d-"",""00_LISTFILE.txt"" %: *markentry -set:00_LISTFILE.txt"


2021年12月18日土曜日

PPvにPPcのマーク状態を表示

僕はPPv上からPPcのカーソルを動かして、表示ファイルを変更するようにしている。

今回は、PPcのマーク状態がPPvでもわかるようにする。

Paper Plane xUI Module Junk partsが必要。

E_cr	= {	; [Enter]用判別
TXT	,*one2oneview
:UTEXT	,*one2oneview
JPEG	,*one2oneview
:JPEG	,*one2oneview
}
_Command	= {	; ユーザコマンド・関数
one2oneview	= *ppv -popup:%N %*name(CD,"%R","%1") -k  *mapkey use,K_one2one
}

K_one2one	= {
UP	,%K-C"@UP" %: %K-C"N" %: *ifmatch 1,%*extract(C,%%*EntryMark) %: *linemessage marked
DOWN	,%K-C"@DOWN" %: %K-C"N"  %: *ifmatch 1,%*extract(C,%%*EntryMark) %: *linemessage marked
LEFT	,%K-C"@LEFT" %: %K-C"N" %: *ifmatch 1,%*extract(C,%%*EntryMark) %: *linemessage marked
RIGHT	,%K-C"@RIGHT" %: %K-C"N" %: *ifmatch 1,%*extract(C,%%*EntryMark) %: *linemessage marked
SPACE	,%K-C"@SPACE" %: %K-C"N" %: *ifmatch 1,%*extract(C,%%*EntryMark) %: *linemessage marked
\SPACE	,%K-C"[\SPACE" %: %K-C"N" %: *ifmatch 1,%*extract(C,%%*EntryMark) %: *linemessage marked
}

以下のように、*linemessageでマーク状態をステータス行に表示する。

2021年12月14日火曜日

PPeでhowmファイルを作成

僕はhowmファイルとPPxでメモ環境を構築している(参照:MoE)。

今まではhowmファイルの作成、編集にはxyzzyを用いていたが、これをPPeでできるようにする。これでPPx単体でMoEをできるようになり、導入のハードルが下がるかも?

*edit %*nowdatetime(Y-N-D-HMS).howm -new -k *editmode -modify:silent %%: *insert "= %%bn%%bn[%*nowdatetime(Y-N-D-HMS)]" %%: *cursor -3,3,0

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

template.howm

=  


=の後ろに空白があり、それに続けて改行を3つ入れている。*insertでは改行文字の入力ができないので(多分)必要になる。

以下のコマンドで、howmファイルを作成できる。

*edit %*nowdatetime(Y-N-D-HMS).howm -new -k *editmode -modify:silent %%: *insertfile %%0template.howm %%: *insert "[%*nowdatetime(Y-N-D-HMS)]" %%: *cursor -3,3,0

追記2021-12-25

最近の更新で*insertで改行を入れられるようになった!感謝!

2021年12月10日金曜日

PPeを前回閉じた際の位置と大きさで開く

 PPeは起動するたびに位置と大きさが変化するので、エディタ代わりにするには少し使いにくい。

そこで、PPeを前回と同じ位置と大きさで開くようにする。

まず、ユーザーコマンドを登録。

_Command	= {	; ユーザコマンド・関数
savepossize	= *setcust %*arg(1):l=%*windowrect(,l)
 *setcust %*arg(1):t=%*windowrect(,t)
 *setcust %*arg(1):w=%*windowrect(,w)
 *setcust %*arg(1):h=%*windowrect(,h)
loadpossize	= *string o,fuga=%*arg(1)
 *windowposition %N.,%*getcust(%so"fuga":l),%*getcust(%so"fuga":t)
 *windowsize %N.,%*getcust(%so"fuga":w),%*getcust(%so"fuga":h)
}

K_ppeで適当なキーに以下を登録。S_ppepossizeにサイズと位置を保存してからPPeを閉じるコマンドです。

*savepossize S_ppepossize %: %k"&F4"

以下のコマンドで、S_ppeposizeに保存したサイズと位置を再現してPPeが起動する。

*edit -new -k *loadpossize S_ppepossize

2021年7月16日金曜日

pptrayをFIRSTEVENTに登録

僕はホットキーを使用するためpptrayを常駐している。
PPxアップデート時に一時的に終了するので、うまいことpptrayを再起動する方法がないか考えてたが、FIRSTEVENTに登録すればいいだけだと気づいた。

KC_main = {
FIRSTEVENT , *ifmatch 0,0%NTRA %: *pptray
}

2021年6月14日月曜日

サブ窓中心の操作(mapkey編)

*mapkeyを使うことで、以前よりスマートにできるようになったので紹介。PPx 1.77+5以降とKey Module R5が必要。

操作は前と同じ。
処理元のファイルをマークしたあと、

  • 移動:Shift+M
  • コピー:Shift+C

でサブ窓PPC[X]が開くので、パス移動してShift+Enter。

KC_main    = {
\M ,*alias ppcx_cmd = *file !move ,%%*extract(%n"%%%%@*8FCDN"),%%1 %%: %%K"@Q" %: *ppc -r -bootid:x -single "%1" -k *mapkey use,K_subwin %%: *linemessage 移動先を選択してください
\C ,*alias ppcx_cmd = *file !copy ,%%*extract(%n"%%%%@*8FCDN"),%%1 %%: %%K"@Q" %: *ppc -r -bootid:x -single "%1" -k *mapkey use,K_subwin %%: *linemessage コピー先を選択してください
}

K_subwin    = {
\ENTER    ,*execute ,%'ppcx_cmd'
}

追記 2021-06-15

特殊環境変数の%si"name"を使えばエイリアスを使う必要がなくなることに気づいた。ただエスケープのせいで視認性が悪くなるので一長一短。

KC_main    = {
\M ,*ppc -r -bootid:x -single "%1" -k *mapkey use,K_subwin %%: *linemessage 移動先を選択してください %%: *string i,temp_exec=*file !move ,%%%%*extract(%n"%%%%%%%%@*8FCDN"),%%%%1 %%%%: %%%%K"@Q"
\C ,*ppc -r -bootid:x -single "%1" -k *mapkey use,K_subwin %%: *linemessage コピー先を選択してください %%: *string i,temp_exec=*file !copy ,%%%%*extract(%n"%%%%%%%%@*8FCDN"),%%%%1 %%%%: %%%%K"@Q"
}

K_subwin	= {
\ENTER    ,*execute ,%si"temp_exec"
}

追記 2022-01-30

1.83からマクロ文字展開抑制ができるようになったので、見やすく書き直し。

KC_main    = {
\M ,*setcust _User:sorce_id=%n %: *ppc -r -bootid:x -single "%1" -k %(*mapkey use,K_subwin %: *linemessage 移動先を選択してください %: *string i,temp_exec=%(*file !move ,%*extract(%su"sorce_id""%%@*8FCDN"),%1 %: %K"@Q"%)%)
\C ,*setcust _User:sorce_id=%n %: *ppc -r -bootid:x -single "%1" -k %(*mapkey use,K_subwin %: *linemessage コピー先を選択してください %: *string i,temp_exec=%(*file !copy ,%*extract(%su"sorce_id""%%@*8FCDN"),%1 %: %K"@Q"%)%)
}

K_subwin	= {
\ENTER    ,*execute ,%si"temp_exec"
}

2021年5月28日金曜日

ラズパイオーディオのすすめ

概要


去年のコロナ禍で暇なときに(今もそうだが)ラズパイオーディオを試してみた。

僕は00年代に買ったミニコンポをずっと使っている。ここ数年間ずっと思ってたのは、「
音楽データを直接再生したい」ということだった。今更CDドライブなんてパカパカ開けたり閉めたりしてられるか!
ミニコンポの後ろにはLINE接続が用意されているので、そこに何らかの機器をつなげばこれは実現できるはずだ。だがその良さげな何らかの機器が見つからない。ネットワークオーディオプレーヤーという名前でメーカーが市販していたりもするが、数万円もする。手頃な値段でいろいろな機種が出ていても良さそうなのになぜだ。ミニコンポで音楽を聴く、という文化自体が廃れてしまってるのだろうか?
そこでラズパイの出番になる。これを使うと、数千円で音楽データを再生する環境を整えられる。

Raspberry Pi

細かい話を抜きにすると、

  • Raspberry Pi4 Model B
  • Raspberry Pi Zero WH

のどちらかを選べばいい。Pi4は名刺大の大きさで、Zero WHはフリスクの容器に入るほどの大きさだ。スペックはPi4の方が高いが、音楽を再生する程度ならZero WHでも問題ない。
Amazonでも買えるが、いろんなところが出店しててよくわからない。電子パーツ屋の通販で買うのがわかりやすい。僕はZero WHをSwitch Scienceで購入した。近所に電子パーツ屋があればそこに行ってもいい。僕は Pi4 Model Bを京都寺町にあったマルツ(閉店してしまった…)で購入した。

I2S DAC

Raspberry Pi は、ピンに拡張ボードを刺すことで機能を拡張できる。本体のイヤホンジャック出力は音が悪すぎるので、音声出力用の拡張ボードを購入する必要がある。

有名なのは

  • HIFIBERRY
  • Allo

あたり。電子パーツ屋の通販や、メーカーサイトからの輸入で手に入れることができる。
また、amazonで中国製の安いI2S DACを入手できる。そこまで音質にこだわってるわけじゃないなら、こっちの方が手軽かもしれない。
僕はそっち派なのでamazonでinno makerのI2S DACを買った。比較してないのであれだけど、音質はいいと思う。

設定

OSを書き込んだmicroSDカードをラズパイ本体に差し込み、電源コードをコンセントに刺すと起動する。

オーディオ用のOSとしては

  • Volumio
  • moOde audio

の二つが有名。インストールや設定の手順はググれば出てくる。

音楽の再生

同一LAN内のPCやスマホからブラウザで操作する。

慣れたら適当なMPDクライアントを使ってもいい。

NAS

NASを使うと、音楽データを書き込んだドライブをラズパイにつなぐ手間が省けて便利。NASもラズパイで構築できる。


参考

2021年3月29日月曜日

PPeでコマンドテスト

PPeでコマンドを実行できるようにする。
複数行に渡るコマンドマクロ作成時のテスト用に。PPx: PPeで簡易コード編集 ・ GitHub を参考にした。

以下を編集して取込。

K_cmdtest = {
^\ENTER	,*execute C,%*edittext
}

PPC上から以下を実行する。

*edit -new -k *setcaption Ctrl+Shift+Enterでコマンド実行 %%: *editmode -modify:silent %%: *mapkey use,K_cmdtest %%: *fitwindow %%NC#,%%N.,20 %%: *focus Ctrl+Shift+Enterでコマンド実行

起動したPPeにコマンドを書き、Ctrl+Shift+Enterを押すと、PPC上で実行する。

2021年3月27日土曜日

ファイルを他のファイルと紐付け

僕はhowm形式でメモを取っている(参考:MOE)。
メモファイルを他のファイルと紐付けしたい時がある。

・関連するメモ
・画像ファイル
・PDFファイル
・etc

アウトラインプロセッサならこういう機能のやつもありそうだが、ファイラだと実装は無理かなとあまり追求してこなかった。
最近、リストファイルを利用すれば可能なことに気づいた。

やり方

Paper Plane xUI Module Junk parts が必要。

KC_main	= {	; PPcメイン窓
\ENTER    ,*ifmatch CX,%n %: *execute ,%'ppcx_cmd' %: *stop
    %K"@\ENTER"
CLOSEEVENT ,*ifmatch CX,%n %: *alias ppcx_cmd = %%K"@\ENTER" %: *stop
^\ENTER	,*ifmatch CX,%n %: *stop
	*ifmatch "o:e,a:d-",%0%Y.txt %: *execute C,*jumppath "%0%Y.txt" %: *stop
	*alias ppcx_cmd = *makelistfile %0%Y.txt -basic -comment -marked %%: %%K"@Q" %: *ppc -r -bootid:x -single %1 -k *linemessage 登録するファイルを選択してください
BS ,*ifmatch 4,%*DirectoryType %: %K"@^LEFT %: *stop
	%K"@BS
}

1.メモファイル上でCtrl+Shift+Enterを押すと、独立窓が開く。紐付けしたいファイルをマークして、Shift+Enter。これでPPxフォルダに、「メモファイルのファイル名.txt」というリストファイルが作成される。
2.次からはCtrl+Shift+Enterでそのリストファイルに潜れる。

解説

・ファイル名が同じリストファイルを作って開いているだけ。howm形式だとかぶることがないので機能する。
・この方法でリストファイルに潜ると、BackSpaceでListFileを保存したフォルダに移動してしまう。なのでPaper Plane xUI Module Junk partsを使い、リストファイルか否かを判別して「履歴を戻る」をしている。
・これだと一つのフォルダ内のファイルしか登録できない。あとで追加したい場合は*ppcfileを使うといい。

2021年3月24日水曜日

マークしたエントリのみをPPVで表示

PPcのマークの有無で、PPvのカーソル上下の挙動を変更する。

マークがある時は、このように次の、あるいは前のマークファイルを表示。

マークが無い時は通常の挙動をする。

やり方

Paper Plane xUI Module Junk partsが必要。

KV_main	= {	; PPvメイン窓
UP	,*ifmatch 1,%*extract(C"%%*EntryPrevMark") %: %KC"@N" %: *stop
	*ifmatch 1,%*extract(C"%%*EntryLastMark") %: %KC"@N" %: *stop
	%K"@UP"
DOWN	,*ifmatch 1,%*extract(C"%%*EntryNextMark") %: %KC"@N" %: *stop
	*ifmatch 1,%*extract(C"%%*EntryFirstMark") %: %KC"@N" %: *stop
	%K"@DOWN"
}

2021年3月8日月曜日

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

一行編集でランチャを前提にした記事です。

一行編集を用いたステップイン・ステップアウトについては前にもやったことがあるが、その時はパスを全て表示していた(参考:PPxをランチャとして使う⑦ステップイン・アウト)。

今回は、カレントフォルダをキャプションに。フォルダ名orファイル名を候補一覧に表示する形式にする。一行編集の入力欄にパスが入力されていた場合、カーソル左右でステップイン・ステップアウト。Enter時、フォルダならPPCで開き、EXEファイルなら実行する。

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

sublist.js

//!*script

// 受け取ったディレクトリのサブディレクトリ名やファイル名を、ファイルに出力
// 第一引数 : ディレクトリ
// 第二引数 : 出力するファイルパス

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

var pdir = PPx.Arguments(0);
var resultfile = PPx.Arguments(1);
var fso = PPx.CreateObject("Scripting.FileSystemObject");
var dir = fso.GetFolder(pdir);
var folders = new Enumerator(dir.SubFolders);
var files = new Enumerator(dir.Files);
var message = ""
for(; !folders.atEnd(); folders.moveNext()){ // サブフォルダを追加
  message += folders.item().Name + "\r\n";
}

for(; !files.atEnd(); files.moveNext()){ // ファイルを追加
  var fname = files.item().Name;
  if (fso.GetExtensionName(fname).toLowerCase()=="exe"){ // 拡張子がEXEのファイルのみ追加
    message += fname + "\r\n";
  }
}

fso.CreateTextFile(resultfile);
// 書き込み
objOutFile = fso.OpenTextFile(resultfile, 2);
objOutFile.Write(message);
objOutFile.Close();

PPxをランチャとして使う⑦ステップイン・アウトのsubdirlist.jsとだいたい同じ。出力するのがフルパスか、フォルダ名orファイル名かの違い。

以下を編集して取込。

K_edit = {
FIRSTEVENT , *setcust _User:pplcaption=
}

K_lied	= {
LEFT	,*ifmatch "o:e,a:d",%W %: *stepinout %*name(D,"%W") %: *stop
	*ifmatch "o:e,a:d","%*edittext" %: *stepinout %*name(D,"%*edittext") %: *stop
	%K"@LEFT"
RIGHT	,*ifmatch 0,0%*edittext %: *stop
	*ifmatch "o:e,a:d","%*edittext" %: *stepinout %*edittext %: *stop
	*ifmatch "/[a-zA-Z]:\\/",%W %: *stepinout %*name(DC,"%*edittext",%W) %: *stop
	%K"@RIGHT"
}

_Command = {
stepinout = *string o,dir=%*arg(1)
 *setcaption %so"dir"
 *setcust _User:pplcaption=%so"dir"
 *script %0\Script\sublist.js,"%so"dir"","%'temp'\list.txt"
 *replace ""
 *completelist -file:"%'temp'\list.txt"
ppl2 = *string o,exec_command=%*input("" -title:"PPlauncher" -mode:e -k:"*completelist /set /file:%%0l_cmd.txt")
 *ifmatch !0,0%*getcust(_User:pplcaption) %: *string o,exec_command=%*name(DC,%so"exec_command",%*getcust(_User:pplcaption))
 *ifmatch "o:e,a:d+",%so"exec_command" %: *focus C %: *execute C,*jumppath "%so"exec_command"" %: *stop
 *ifmatch "o:e,a:d-",%so"exec_command" %: *execute ,"%so"exec_command"" %: *stop
 *execute,%so"exec_command"
}

パスを含んだl_cmd.txtをPPxフォルダに用意し、*ppl2を実行すればいけるはず。

ユーザーコマンドは2つあるが、ppl2が本体。stepinoutはステップイン・ステップアウトを実現するコマンド。

ステップイン・ステップアウトをしたら、キャプションをかえると同時に、ユーザデータ"pplcaption"にそのパスを保存している。実行時にpplcaptionの中身を確認、中身があればそれを入力欄のパスとつなげて実行する仕組み。FIRSTEVENTはpplcaptionの初期化に使用。

追記 2021-03-14

PPx 1.77+5以降とKey Module R5を使うことで、キーバインドの一時変更ができるようになった。これを取り入れると次のようになる。

K_edit = {
FIRSTEVENT , *setcust _User:pplcaption=
}

K_stepio	= {
LEFT	,*ifmatch "o:e,a:d",%W %: *stepinout %*name(D,"%W") %: *stop
	*ifmatch "o:e,a:d","%*edittext" %: *stepinout %*name(D,"%*edittext") %: *stop
	%K"@LEFT"
RIGHT	,*ifmatch 0,0%*edittext %: *stop
	*ifmatch "o:e,a:d","%*edittext" %: *stepinout %*edittext %: *stop
	*ifmatch "/[a-zA-Z]:\\/",%W %: *stepinout %*name(DC,"%*edittext",%W) %: *stop
	%K"@RIGHT"
}

_Command = {
stepinout = *string o,dir=%*arg(1)
 *setcaption %so"dir"
 *setcust _User:pplcaption=%so"dir"
 *script %0\Script\sublist.js,"%so"dir"","%'temp'\list.txt"
 *replace ""
 *completelist -file:"%'temp'\list.txt"
ppl2 = *string o,exec_command=%*input("" -title:"PPlauncher" -mode:e -k:"*completelist /set /file:%%0l_cmd.txt %%: *mapkey use,K_stepio")
 *ifmatch !0,0%*getcust(_User:pplcaption) %: *string o,exec_command=%*name(DC,%so"exec_command",%*getcust(_User:pplcaption))
 *ifmatch "o:e,a:d+",%so"exec_command" %: *focus C %: *execute C,*jumppath "%so"exec_command"" %: *stop
 *ifmatch "o:e,a:d-",%so"exec_command" %: *execute ,"%so"exec_command"" %: *stop
 *execute,%so"exec_command"
}

2021年2月11日木曜日

PDFCPUのメニュー

PDFCPUでよく使うコマンドをメニューにしてまとめてみた。

-|M_pdfcpu =

M_pdfcpu	= {
抽出(&L)	=	pdfcpu trim -pages %*input("1|-2" -title:"抽出開始ページと終了ページ" -select:i -mode:n) %*name(CBD,"%R","%1") %*input("out|.pdf" -title:"アウトプットファイル名" -select:i -mode:c)
分割(&S)	 =	*makedir %Y %: pdfcpu split %*name(CBD,"%R","%1") %Y
ページ数を指定して分割	=	*makedir %Y %: pdfcpu extract -mode page -pages %*input("1|-2" -title:"開始ページと終了ページ" -select:i -mode:n) %*name(CBD,"%R","%1") %Y
削除(&D)	=	pdfcpu trim -pages %*input("1-,!2" -title:"削除したいページを !#-# !# で指定" -select:l -mode:n) %*name(CBD,"%R","%1") %*input("out|.pdf" -title:"アウトプットファイル名" -select:i -mode:c)
--	= 
マークした画像ファイルをPDFに	=	pdfcpu import %*input("out|.pdf" -title:"アウトプットファイル名" -select:i -mode:c) %#FC
マークしたPDFファイルを結合	=	pdfcpu merge %*input("out|.pdf" -title:"アウトプットファイル名" -select:i -mode:c) %#FC
--	= 
PDFファイルを複製	=	pdfcpu merge %*input("out|.pdf" -title:"アウトプットファイル名" -select:i -mode:c) %*name(CBD,"%R","%1") %*name(CBD,"%R","%1")
}

どうせなにかのキーに登録しても忘れるので、僕は一行編集でランチャから呼び出して利用している。

*focus C %:*execute C,%%M_pdfcpu,l

2021年2月6日土曜日

PDFやDOCの内容をプレビュー表示

doc2txtを使い、PDFやDOCの内容をプレビュー表示できるようにする。

E_TipView = {
pdf , %Obd doc2txt "%si"TipTarget"" | %0ppvw.exe -P%si"TipWnd"
doc , %Obd doc2txt "%si"TipTarget"" | %0ppvw.exe -P%si"TipWnd"
docx , %Obd doc2txt "%si"TipTarget"" | %0ppvw.exe -P%si"TipWnd"
jtd , %Obd doc2txt "%si"TipTarget"" | %0ppvw.exe -P%si"TipWnd"
}

エントリの右端のあたりをカーソルオーバーすると色が変わる。そこで左クリックするとプレビューが表示される。

2021年2月5日金曜日

xyzzyをタスクトレイに常駐

ttrayを使うとxyzzyをタスクトレイに常駐することができる。

これと、ホットキーによる表示/非表示を組み合わせると、調べ物をしながらのメモが楽になる。

PPtrayを利用する方法

.xyzzyに以下を追加し、タイトルバーに -xyzzy- が含まれるようにする。

(require "ttray")
(setq-default title-bar-format "-xyzzy- %f (%M) [%k:%l]")

PPtrayから表示/非表示を実現する。以下を編集して取込。

K_tray	= {
^\X	,*focus !"-xyzzy-"
}

これでCtrl+Shirt+Xで表示/非表示ができる。PPtrayはもちろん常駐させておく。

PPtrayを利用しない方法

利用しているのがPPxとxyzzyのみで、ブラウザその他のソフトを使わない、このOSではそんなもの起動することもない!という硬派な人の場合。

  • PPc側からxyzzy呼び出し
  • xyzzy側からxyzzy最小化

の二つで表示/非表示を実現する。
PPx Key Modeuleをインストールした上で、

.xyzzy

(require "ttray")
(global-set-key '(#\C-x #\C-x) 'kill-all-buffer)
;; すべてのバッファを削除する
;; http://www.nct9.ne.jp/m_hiroi/xyzzy_lisp/xyzzy01.htmlより
(global-set-key '(#\C-x #\C-c) 'ttray-hide-xyzzy)
(defun kill-all-buffer ()
  (interactive)
  (let ((scratch-buff (find-buffer "*scratch*")))
    (dolist (buffer (buffer-list))
      (if (and (not (eq scratch-buff buffer))
               (not (buffer-modified-p buffer)))
          (delete-buffer buffer)))))

以下を編集して取込。

KC_main	= {
^X	,*setnextkey K_launcher
}
KV_main	= {
^X	,*setnextkey K_launcher
}
K_launcher	= {
^C	,xyzzy
}

これで、C_x,C_c で表示/非表示が実現できる。xyzzyでバッファを全て消したくなったときは C_x,C_x 。

2021年1月17日日曜日

7-zip(7z.exe)で普通の圧縮

以前、7-zipを使って個別圧縮をできるようにした。
今回は、ファイルやフォルダをまとめて一つのアーカイブファイルにする、普通の圧縮を7-zipでできるようにする。

例えばマークファイルをカレントフォルダに圧縮したい場合は、以下のコマンドを実行する。

*script %0\Script\7z_unpack.js,%a*8FCDN,%1%*addchar(\)%{hoge%|.zip%} 

7z_unpack.js

//!*script
// 7-zipを実行してレスポンスファイルに記載されたファイルを圧縮する
// 第一引数: レスポンスファイル
// 第二引数: 出力ファイルのパス

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

//  7z.exeのパス
var Exec = "C:\\Program Files\\7-Zip\\7z.exe";
var responseFile = PPx.Arguments.Item(0);
var destFile = PPx.Arguments.Item(1);
var sorceFiles = "";
var fso = PPx.CreateObject("Scripting.FileSystemObject");

var archiveFiles = GetList(responseFile);
var parentFolder = fso.GetParentFolderName(archiveFiles[0]);

for (x in archiveFiles){
  if (archiveFiles[x] == ""){
    break;}
  sorceFiles += fso.GetFileName(archiveFiles[x]) + " "
}
//  作業ディレクトリを変更したあと7-zipで圧縮
PPx.Execute('*cd '+parentFolder+' %: \"'+Exec+'\" a \"'+destFile+'\" '+sorceFiles);

// レスポンスファイルからファイル名のリストを作成
function GetList(list)
{
  var f = CreateObject("ADODB.Stream");
  
  f.type = 2;
  f.charset = "UTF-8";
  f.open;
  f.LoadFromFile(list);
  text = f.readText(-1).split("\r\n");
  f.close;
  return text;
}

2021年1月16日土曜日

カスタマイズ内容を一行編集で検索、取得

以前の記事以降、

ppcust cd filename -mask:M_*

のようにしてカスタマイズ内容の一部を出力できるようになった。これを利用し、外部ソフトなしで、一行編集によるカスタマイズ内容の検索と取得をできるようにする。
PPX.CFGをPPxフォルダに置いて、以下を編集して取込。

_Command	= {	; ユーザコマンド・関数
getcfg	= %Os *string o,name=%*input("" -title:"カスタマイズ内容部分取得" -mode:e -k:"*completelist /set /file:""%%0PPX.CFG""") %:
 *ppcust cd %'temp'\cfg.txt -mask:%*regexp("%so"name"","s/^(.*)\s=.*/$1/") %:
 editor %'temp'\cfg.txt
}

*getcfgを実行すると、PPX.CFGを補完候補リストにした一行編集が表示される。選択すると、そのIDの現在の内容がテキストファイルに出力され、それをエディタで表示する。

僕は登録しているエディタではなく、PPeを使って表示している。その際は次のようになる。

_Command	= {	; ユーザコマンド・関数
getcfg	= %Os *string o,name=%*input("" -title:"カスタマイズ内容部分取得" -mode:e -k:"*completelist /set /file:""%%0PPX.CFG""") %:
 *ppcust cd %'temp'\cfg.txt -mask:%*regexp("%so"name"","s/^(.*)\s=.*/$1/") %:
 *edit %'temp'\cfg.txt
}

追記 2021-02-10

エディタではなくPPVで表示させた方が、編集した際に保存するか否かの確認されない分いいかもなと思った。その際は次のようになる

_Command	= {	; ユーザコマンド・関数
getcfg	= %Obdsq *string o,name=%*input("" -title:"カスタマイズ内容部分取得" -mode:e -k:"*completelist /set /file:""%%0PPX.CFG""") %:
 *ppcust cd %'temp'\cfg.txt -mask:%*regexp("%so"name"","s/^(.*)\s=.*/$1/") %:
 type %'temp'\cfg.txt | %0PPVW.EXE -bootid:C
}

追記 2021-03-29

最近の更新で、PPeで保存するか否かの確認を無くせるようになった。

_Command	= {	; ユーザコマンド・関数
getcfg	= %Os *string o,name=%*input("" -title:"カスタマイズ内容部分取得" -mode:e -k:"*completelist /set /file:""%%0PPX.CFG""") %:
 *ppcust cd %'temp'\cfg.txt -mask:%*regexp("%so"name"","s/^(.*)\s=.*/$1/") %:
 *edit %'temp'\cfg.txt -k *editmode -modify:silent
}

2021年1月10日日曜日

一行編集から設定ファイルを save & load

設定ファイルの保存と読込が容易にできるようにする。準備として、PPxフォルダ内にsavedataフォルダを作成しておこう。

保存は以下のコマンド

%"設定を保存します"%Ob *PPCUST CD %{%0savedata\PPX-%*nowdatetime(y-N-D)%|.CFG%}

読込は以下のコマンド。savedataフォルダ内のファイルを一行編集で表示する。

%Ob *PPCUST CS %*input("%0savedata" -title:"load cfg file" -mode:e -select:l -k:"%%K""@TAB")

使用例

僕はそれぞれ、saveとloadという名前でユーザコマンドに登録。それを「一行編集でランチャ」のl_cmd.txtに登録して呼び出している。

_Command	= {	; ユーザコマンド・関数
save	= %"設定を保存します"%Ob *PPCUST CD %{%0savedata\PPX-%*nowdatetime(y-N-D)%|.CFG%}
load	= %Ob *PPCUST CS %*input("%0savedata\" -title:"load cfg file" -mode:e -select:l -k:"%%K""@TAB")
initialize	= %Q"初期化します"%:%Ob *PPCUST CINIT
}

2021年1月8日金曜日

7-zip(7z.exe)で個別圧縮

ファイルやフォルダをまとめて一つに圧縮するのではなく、ファイルごと、フォルダごとに個別圧縮する。7zipを使用。

例えばマークファイルをカレントフォルダに個別圧縮したい場合は、以下のコマンドを実行する。

*script %0\Script\wrap_7z_a.js,%a*8FCDN,%1

wrap_7zip_a.js

//!*script
// 7-zipを実行して圧縮先フォルダにアーカイブファイルを圧縮する
// 第一引数: レスポンスファイル
// 第二引数: 圧縮先フォルダ

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

//  7z.exeのパス
var Exec = "C:\\Program Files\\7-Zip\\7z.exe";
var responseFile = PPx.Arguments.Item(0);
var extractFolder = PPx.Arguments.Item(1);
var fso = PPx.CreateObject("Scripting.FileSystemObject");

var archiveFiles = GetList(responseFile);
// 個々のファイルごとに7-Zipで圧縮
for (x in archiveFiles){
  if (archiveFiles[x] == ""){
    break;}
  PPx.Execute('\"'+Exec+'\" a \"'+extractFolder+'\\'+fso.GetBaseName(archiveFiles[x])+'.zip\" \"'+archiveFiles[x]+'\"');
}

// レスポンスファイルからファイル名のリストを作成
function GetList(list)
{
  var f = CreateObject("ADODB.Stream");
  
  f.type = 2;
  f.charset = "UTF-8";
  f.open;
  f.LoadFromFile(list);
  text = f.readText(-1).split("\r\n");
  f.close;
  return text;
}