2026年2月8日日曜日

PDFCPUでPDFを画像化

国立国会図書館デジタルコレクションにある電子化資料をPDFでダウンロード→画像化→タブレットで漫画ビューアを使って閲覧したい。 

PDFCPUを使って必要な処理ができるようにする。 

国立国会図書館デジタルコレクションって何?という人にはこの動画がおすすめ。

なぜかというと僕が作った動画だからなのだ!

チャンネル登録と高評価おねがいしますのだ!

merge

mergeオプションを使ってマークしたPDFを結合する。

pdfcpu merge %*input("out|.pdf" -title:"アウトプットファイル名" -select:i -mode:c) %#FC

extract

extractオプションを使ってカーソル下のPDFを画像化する。ファイル名をもとにフォルダを作成し、その内に画像を生成する。

%Os *makedir %Y %: pdfcpu extract -mode image %FCD %Y

2025年8月30日土曜日

アクセスが拒否されたファイルへの対処

概要

複数のファイルが「アクセスが拒否されました」といって開くことができなくなった。 マザーボード交換やらWin10からWin11へのアップデートやらをしてる内に、アクセス権限が変なことになったのだろうか。今回はその対処法のメモ。

問題の切り分け

右クリックからプロパティを選択し、セキュリティタブを開く。 「このオブジェクトのプロパティを表示するには、読み取りアクセス許可が必要です。」と表示される場合、まず所有者を変更する必要がある。

所有者を変更すると、セキュリティタブは以下のようになる。「グループ名またはユーザー名」に自分を追加し、アクセス許可を与えるとアクセス可能になる。

所有者の変更

1. 詳細設定をクリック→所有者欄の右にある変更をクリック。

2. 「ユーザまたはグループの選択」ウィンドウが表示される。左下の詳細設定をクリック。

3. 「ユーザまたはグループの選択(詳細設定)」ウィンドウが表示される。検索をクリックして、自分のユーザー名を選択し、OKを押す。

4. あとはOKを押し続けてプロパティを一旦閉じる。

アクセス許可

1. 編集をクリック。

2. 「アクセス許可」ウィンドウが出るので追加をクリック。

3. 「ユーザーまたはグループの選択」ウィンドウ表示される。左下の詳細設定をクリック。

4. 「ユーザまたはグループの選択(詳細設定)」ウィンドウが表示される。検索をクリックして、自分のユーザー名を選択し、OKを押す。

5. 「アクセス許可」に自分のユーザー名が登録されているはず。それを選択して、下の欄のアクセス許可からフルコントロールを選択し、OKを押す。

2025年7月22日火曜日

ImageMagickを使ってPPx上で画像処理(2025)

以前は

magick convert コマンド

だったが、いつの間にかconvertが不要になったらしいのでまとめ直し。

とりあえずエイリアスに登録しておく。

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

一つのファイルを処理

形式変換

%OB imagemagick %FCD output.%"拡張子を入力してください"%{png%}%

拡大縮小

パーセント指定

%OB imagemagick %FCD -resize %"数値を入力してください"%{50%}%%% output.jpg

幅指定

%OB imagemagick %FCD -resize %"数値を入力してください"%{800%}% output.jpg

高さ指定

%OB imagemagick %FCD -resize %"数値を入力してください"%{x600%}% output.jpg

幅と高さ指定(縦横比変更)

%OB imagemagick %FCD -resize %"数値を入力してください"%{800x600!%}% output.jpg

回転

角度指定

%OB imagemagick %FCD -auto-orient -rotate %"数値を入力してください"%{270%}% output.jpg

時計回りに90度回転

%OB imagemagick %FCD -auto-orient -rotate 90 output.jpg

反時計回りに90度回転

%OB imagemagick %FCD -auto-orient -rotate 270 output.jpg

180度回転

%OB imagemagick %FCD -auto-orient -rotate 180 output.jpg

分割

左右に分割

%OB imagemagick %FCD -crop 50%%x100%% output.jpg 

上下に分割

%OB imagemagick %FCD -crop 100%%x50%% output.jpg 

マークファイルを一括処理

複数のファイルを一括処理する方法はいくつかあるが、レスポンスファイルを使うのが簡単。%FCDを%@*8FCDBに変えるだけでいける。

windows - How to pass multiple filenames to ImageMagick? - Stack Overflow

形式変換

%OB imagemagick %@*8FCDB output.%"拡張子を入力してください"%{png%}%

拡大縮小

パーセント指定

%OB imagemagick %@*8FCDB -resize %"数値を入力してください"%{50%}%%% output.jpg

幅指定

%OB imagemagick %@*8FCDB -resize %"数値を入力してください"%{800%}% output.jpg

高さ指定

%OB imagemagick %@*8FCDB -resize %"数値を入力してください"%{x600%}% output.jpg

幅と高さ指定(縦横比変更)

%OB imagemagick %@*8FCDB -resize %"数値を入力してください"%{800x600!%}% output.jpg

回転

角度指定

%OB imagemagick %@*8FCDB -auto-orient -rotate %"数値を入力してください"%{270%}% output.jpg

時計回りに90度回転

%OB imagemagick %@*8FCDB -auto-orient -rotate 90 output.jpg

反時計回りに90度回転

%OB imagemagick %@*8FCDB -auto-orient -rotate 270 output.jpg

180度回転

%OB imagemagick %@*8FCDB -auto-orient -rotate 180 output.jpg

分割

左右に分割

%OB imagemagick %@*8FCDB -crop 50%%x100%% output.jpg

上下に分割

%OB imagemagick %@*8FCDB -crop 100%%x50%% output.jpg

2025年6月23日月曜日

PC自作した【9年ぶり三度目】

9年ぶりに自作PCのマザボとCPUを入れ替えたのでそのメモ。目的はwin10からwin11へのアップグレード。

about My Machine

  • 【CPU】Ryzen 5 5600XT
  • 【CPUクーラー】AK400
  • 【マザボ】MSI B550M PRO-VDH
  • 【メモリ】CORSAIR DDR4 8GB×2 CMK16GX4M2A2666C16
  • 【電源】ANTEC NE650C
  • 【光学ドライブ】GH24NSD5 BL BLH
  • 【HDD】WD HDD 3.5インチ 1TB Blue WD10EZEX/N
  • 【SSD】Crucial CT240BX200SSD1 ×2
  • 【ケース】Define R5
  • 【グラボ】PowerColor Red Devil Radeon RX 470 4GB
  • 【モニタ】LG 23.8インチ AH-IPS 24EA53VQ-P
  • 【サブモニタ】iiyama 19型ワイド液晶ディスプレイ ProLite E1902WS
  • 【キーボード】REALFORCE TKL SA / R2TLSA-JP4-IV
  • 【マウスその1】Kensington SlimBlade
  • 【マウスその2】ROCCAT Kone Pure Ultra
  • 【ヘッドホンアンプ】FIIO K11
  • 【OS】 Windows11 Home

Win11インストール後の設定

Win11にインストールしたソフト

  • KensingtonWorks
  • ExplorerPatcher(タスクバーを上にするため)
  • 7-Zip
  • Google日本語入力
  • Kindle for PC
  • calibre
  • Brave
  • FIrefox
  • Git for Windows
  • steam
  • TsubameViewer
  • Microsoft PowerToys
  • Scoop
  • zoxide

雑記

事前準備

  • マザボとCPUを新しくしたのは、CPUがWin11の要件を満たしてなかったから。Win10のサポートが切れるまでに対処する必要があった
  • 最初はミニPCの購入を考えていたが、マザボとCPUを交換する方が安くつきそうだったのでそっちに
  • 僕はあまりハードウェアに興味がないので、新しくハードウェアを購入する必要があれば、そのたびに情報を収集する。僕が以前PCを組んだときは、CPUはIntel一択だったが、今はAMDがいいらしい
  • DDR4はまだ現役。最近はDDR5が普及し始めているらしく、流石に次回マザボを交換するときには使い回しは無理だろう
  • CPUは以前よりも高いが、マザボは安い。僕が買ったRyzen5 5600XT BOXは15380円で、MSI B550M PRO-VDHは6884円。B550より下位のチップセットA520を搭載したマザボだと、5000円以下のものもある
  • 僕が使っているWin10はWin7からの無償アップグレード版。マザボを交換しても、Microsoftアカウントとデバイスの紐づけを事前に済ませていれば、ライセンスの引き継ぎができる。ただ、この紐づけがなかなかできなかった。僕の場合、使ってたMicrosoftアカウントが古いことが問題だったらしく(多分)、新しく作ったMicrosoftアカウントでサインインすると紐づけされた

マザーボード交換

  • CPUクーラーにCPUグリスがついていることを忘れてて、グリス部分を机の上に直に置いてしまい、グリスがだめになってしまった。そこで新しく、えくすとりーむぐりす 4G CWTP-EG4Gを購入。最初からついているグリスは性質がよくないという話もあるので、逆によかったのかもしれない
  • マザーボード交換に色々と手間取る。グラボがラッチでとまってることを忘れてて、古いマザーボードから無理やり引き抜いてしまい、ラッチ部分を壊してしまった
  • グラボのホコリを取ろうとエアダスターを当てた際、回転したファンで指先を切ってしまう。またコード類を取り付けようと、ケースに手を突っ込んで色々作業してるうちに、手の甲にいくつもかすり傷がつく
  • 端にあるコードの差し込みに手間取る。特にUSBのコネクタがマザーボードに横向きについてて指しにくく、ピンを曲げてしまった。マザーボードをネジで固定する前に、指しにくい箇所のコードは先に取り付けてしまった方がいいのかもしれない

Win11へ移行

  • ライセンス認証後、BIOSモードをレガシーからUEFIに変換。これでWin11へのアップグレード要件を満たした
  • Win11はUSBからクリーンインストール
  • win11でまずびっくりしたのはタスクバーの位置の切り替えができないこと。なんでそんなわけのわからないところを改悪するんだろうか

雑感

  • Google検索が劣化しすぎてて、知りたい答えに全然たどり着けない。俺がすることになる試行錯誤を先にしたはずの、どこかの誰かの個人ブログを俺は読みたいんだ!
  • グーグル先生もすっかり衰えてしまった。ggrksなんてもう死語になってるんだろう。とりあえず別の検索エンジンにかえてみる。グッバイGoogle検索…
  • バナー作って相互リンクを貼りあう時代に俺達は回帰すべきなのかもしれない

2025年5月7日水曜日

マークファイルでエントリマスク

やりたいこと

以下の操作ができるようにする。

  • マークしたファイルのみをエントリマスクで表示
  • 窓を閉じるとマスク解除

なぜこういう挙動にしてるかというと、マスクの解除をし忘れて「エントリが全然ない!」と大騒ぎすることがたまにあるからです。

やり方

表示したいファイルをマークする。

以下のコマンドを実行する。

*string o,cmd=o:d,%#, %: *string o,dir=%1 %: *maskentry -thispath "%so"cmd"" %: %K"@^END" %: *linecust delmask,KC_main:FIRSTEVENT,*ifmatch %n,%%n %%: *maskentry -"%so"dir"" %%: *linecust delmask,KC_main:FIRSTEVENT,

このように、マークエントリのみが表示される。マスク状態は現在窓を閉じると解除される。

2025年3月4日火曜日

何度も編集するファイルをユーザデータに登録

問題意識

僕はhowm形式でメモを取っているが(参考:moe | メモの方法論)、一日に何度も編集したり、閲覧したりするファイルがある。日記や、短期的なtodoだ。こういったファイルを一々フォルダから探し出して開くのは手間なので、簡単に開けるようにしたい。

ユーザデータの利用

ユーザデータを利用する。_User:diaryや_User_todoを用意し、ここにファイルパスを保存する。

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

settitle2.js

以下を一行編集の補完候補リスト(参考:コマンドの実行 | PPxMemo)に追記する。

;<diaryを開く>; editor %su"diary"
;<diaryをppvで閲覧>; *ppv %su"diary"
;<diaryを新規作成>; *setcust _User:diary=%*script(%0Script\settitle2.js) %: editor %su"diary"
;<カーソル下ファイルをdiaryに登録>; *setcust _User:diary=%FCD
;<todoを開く>; editor %su"todo"
;<todoをppvで閲覧>; *ppv %su"todo"
;<todoを新規作成>; *setcust _User:todo=%*script(%0Script\settitle2.js) %: editor %su"todo"
;<カーソル下ファイルをtodoに登録>; *setcust _User:todo=%FCD

2025年2月23日日曜日

Firefox+Sideberyでツリー型タブに

最近のツリー型タブ事情を調べたところ、sideberyが良さげだった。このアドオンを使うため、数年ぶりにFirefox使いに戻る。

ツリー上でマウススクロールでタブ切り替え

ツリー上でのマウススクロールでタブの切り替えができるよう、以下のように設定する。

  • 「設定→マウス→垂直スクロールでタブを切り替える」を「パネル内で」か「グローバルに」にする

タブバーを非表示に

ツリーを使う以上タブは不要なので、非表示にする。 アドレスバーにabout:configと入力。高度な設定が開くので、検索ボックスにtoolkit.legacyUserProfileCustomizations.stylesheetsと入力。値をtrueにする。 次に、プロファイルフォルダ(アドレスバーにabout:supportと入力すると場所がわかる)内にchromeフォルダを作成。そこにuserChrome.cssというファイルを作成し、以下をコピペ。既にこのファイルがある場合は追記すればいい。

#tabbrowser-tabs {    visibility: collapse !important;}

参考

2025年2月15日土曜日

2025年使用ソフト晒し

PVが200000を超えたので、ソフトウェアカスタマイズブログ界隈では定番の使用ソフト晒しをします!yeah!

ファイル関連

  • Paper Plane xUI
  • 7-zip (圧縮・解凍)
  • Everything (ファイル検索)
  • FastCopy (ファイルの移動・コピー)
  • WinMerge (ファイル比較)
  • WindowsTerminal (ターミナル)

エディタ

  • xyzzy

ブラウザ

  • vivaldi (メインブラウザ。縦タブにして使用)
    • Checker Plus For Gmail (メールチェッカー)
    • Format Link (urlコピー)
    • Sakura Check Linker (サクラチェッカー)
    • Calilay (図書館の蔵書検索)
    • Keepa (価格追跡ツール)
    • uBlock Origin (広告ブロッカー)
  • brave (サブブラウザ)

マルチメディア

  • Aimp5 (音楽プレイヤー)
  • MPC-HC (動画プレイヤー)
  • ImageMagick (画像変換)
  • NeeView (漫画ビューア)
  • sigil (電子書籍作成)
  • calibre (電子書籍管理)
  • TsubameViewer (漫画・小説ビューア)
  • Sumatora PDF (PDFビューア)
  • STEP_K (音楽タグ編集)

ユーティリティソフト

  • ScreenToGif (アニメGIF作成)
  • EasyShot (スクリーンショット)
  • FileSum (フォルダ容量表示)
  • Folder Size Portable (フォルダ容量表示)
  • Google日本語入力
  • Raspberry pi Imager (ラズパイのSDカード作成)
  • PowerToys (ツール集)
  • EarTrumpet (音量調節)
  • EBWin4 (EPWINGビューア)
  • pdfcpu (PDF操作)
  • poppler (PDF操作)
  • busybox (UNIXコマンド実行)
  • Chocolatey (パッケージ管理システム)
  • Scoop (パッケージ管理システム)
  • Display Changer 2 (ディスプレイの向きを変更)
  • ExifTool (EXIF情報抽出)
  • yt-dlp (動画ダウンロード)
  • zoxide (cdコマンド改良版)
  • Advanced IP Scanner (LAN内の端末を検出)
  • Git for Windows

andoroidに入れてるアプリ

  • ComittoNxA (漫画ビューア。共有フォルダにもアクセス可能)
  • Perfect Viewer (漫画・小説ビューア。共有フォルダにもアクセス可能)
  • X-plore (ファイラ。共有フォルダにもアクセス可能)
  • Squeezer (Logitech Media Serverの操作)
  • Reasily (小説ビューア。縦書き対応)
  • ReadEra (小説ビューア)
  • WiFiman (Wi-Fi環境チェックツール)
  • Rotation Control (画面の回転制御)
  • foobar2000 (音楽プレイヤー。DLNA再生が可能)
  • Omnia (音楽プレイヤー)

運用について

現在使っている端末は以下。

  • デスクトップPC (Windows10 64bit)
  • t90chi (Windows10 32bit)
  • Fireタブレット
  • Xperia SO-02J
  • Raspberry Pi Zero WH (piCorePlayer)
  • LIVA Z2 (ubuntu sever)

デスクトップPC

よく使用するのは、PPx、xyzzy、vivaldiの三つ。

PPxは独立窓二枚で運用している。現在使っているカスタマイズは「サブ窓を利用したファイル操作」「一行編集でランチャ」「zoxide+一行編集でフォルダジャンプ」「PPv中心の連動ビュー」「moe」。コマンドは補完候補ファイルにまとめ、それを一行編集で呼び出して使っている。

メインブラウザはvivaldi。僕はツリー型タブが好きで、長年ツリー型タブが使えるブラウザを探して彷徨っていたが、数年前にvivaldiの縦タブで妥協し、今に至っている。

ランチャもWinキーから起動できるものしか使っていない。かつてのように色々なソフトを頻繁に起動することがなくなり、ランチャの重要性が薄れたからだ。

LAN内サーバー

以前はデスクトップPC以外はt90chiくらいしか使ってなかったが、今はタブレット、スマホ、ラズパイも使っている。これだけ端末が増えると、LAN内サーバーを構築して、そこからデータを引き出した方が便利だ。 僕はLIVA Z2にUbuntu Serverを入れて運用している。gitでデータの同期をしたり、音楽ファイルを共有したり、nginxで外部に公開するまでもないサイトを表示したりしている。

t90chi

t90chiは2in1のWindowsタブレット。PPxとxyzzyの専用機として使っている。コンパクトで持ち歩くのには最適だが、流石にそろそろ後継機に切り替えたいところ。

バックアップ

容量が増えすぎたせいで、メディアに焼いてのバックアップはほとんど不可能になってしまった。今は、外付けHDDを使ってバックアップをしている。

2025年2月6日木曜日

ファイル振り分けモード

問題意識

未整理のまま放置されている大量のファイルを、別々のフォルダに振り分けたい場合がある。これを通常のファイル操作でやろうとすると、移動元フォルダと移動先フォルダを何度も行き来することになって面倒だ。 移動先フォルダのパスを、一時的にストックする仕組みを作ることで、この問題を解決する。

準備

以下を編集して取込。

-|K_furiwakemode =
-|K_furiwakemode2 =

K_furiwakemode    = {
C    ,*ppcfile copy,%su"mydesto"
M    ,*ppcfile move,%su"mydesto"
O    ,*ppc -r -bootid:x -single -k *mapkey use,K_furiwakemode2 %%: *linemessage Shift+Enterで操作先に指定
R    ,*RotateCustomize _User:mydesto %su"destonames" %: *linemessage 操作先を%su"mydesto"に変更
ESC    , *mapkey delete,K_furiwakemode %: *linemessage 振り分けモード終了
}

K_furiwakemode2    = {
\ENTER    ,*setcust _User:destonames=%su"destonames" , %FCD %: *linemessage %FCを登録しました
}

やり方

以下のコマンドを実行。

*mapkey use,K_furiwakemode %: *setcust _User:mydesto= %: *setcust _User:destonames= %: *linemessage 振り分けモード [O]操作先選択 [R]切り替え [ESC]QUIT

[O]を押すとサブ窓が開く。サブ窓上で[Shift+Enter]を押すと、カーソル下フォルダのパスが、操作先のパスとしてストックされる。必要なパスを登録したら、サブ窓を閉じよう。

メイン窓で[R]を押すと、操作先のパスを切り替えることができる。

[M]あるいは[C]でファイル操作ダイアログを表示すると、操作先パスが切り替わっていることが確認できる。

キーバインド

メイン窓

  • [C] コピー
  • [M] 移動
  • [O] 別窓を開いて操作先選択
  • [R] パスの切り替え
  • [ESC] モード終了

サブ窓

  • [Shift+Enter] 操作先に追加

2024年11月26日火曜日

PPx 2.00

PPxがメジャーバージョンアップをして、2.00になりました。おめでとうございます。1.00は2008年らしいので、私がPPxを使い始める前ですね。素晴らしいソフトとその作者さんに感謝を!

私とPPx

私は、2000年代初頭にPCを入手してすぐ、ソフトウェアカスタマイズに手を出し始めた。PPxの存在を知ったのは、覚えらんない人の「俺がランチャを捨てたわけ」という記事に、名前があがっていたからだと思う。

当時はソフトウェアカスタマイズブログがたくさんあったが、PPxの情報は比較的少なかった。2chでは、PPxは超高性能だがカスタマイズも超難解という評価で、ファイラースレには挫折した報告や、挫折せずに続ける方法を考察したレスなどがあった。専スレは内容が高度すぎて何を言ってるのかほとんどわからなかった。このような状況下で、ソフトウェアカスタマイズ界隈初心者の私は、PPxをただ仰ぎ見るだけだった。

2009年あたりになって、やっとPPxを使い始める。その時には、PPxについて解説したブログがいくつかあり、それを見ながら外部ソフトを起動する方法を調べたり、キーバインドをいじったりしていた。そのうち、自分でも記事を書くようになったみたいです。

2024年10月28日月曜日

書庫ファイル内の画像をサムネイルに

書庫ファイル内の画像ファイルをサムネイルにする。

準備

以下の二つのファイルをScriptフォルダに保存。

やり方

エントリ表示形式を、画像が含まれるものに変更する。とりあえずは、[;]で表示されるメニューから「サムネイル1」を選んでおけばいい。こうしないと、以下の過程で「no image mode」と言われてしまう。

カーソル下の書庫ファイルのサムネイルを変更したい場合は、以下のコマンドを実行する。

*setentryimage %*script(%0Script\getarchiveimage.js,%FCD) -save

複数の書庫ファイルのサムネイルを同時に変更したい場合は、ファイルをマークした後、以下のコマンドを実行する。

*script %0Script\setarchiveimage_marked.js

2024年10月26日土曜日

PPvでEPWING形式の辞書を引く(PPvを分割)

PPvを分割して別のPPvを開いたり閉じたりする動作が気に入ったので、PPv+EBWIN4もこの形式にしてみる。

必要なもの

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

準備

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

以下を編集して取込。

_Command    = {    ; ユーザコマンド・関数
splitppv    = *string i,height0=%*windowrect(,h)
    *string i,height1=%*calc("%*arg(2)*%*windowrect(,h)/100")
    *string i,height2=%*calc("%*windowrect(,h)-%si"height1"")
    *windowsize %N,%*windowrect(,w),%si"height1"
    *ppv -bootid:X -k %%J"%*arg(1)" %%: *fitwindow %N,%%N,4 %%: *windowsize %%N,%*windowrect(,w),%si"height2" %%: *selectppx %n
ebwin2ppv = *string i,ratio=%*arg(1)
    *string i,tempfile=%*temp(name,f)
    %Oi nyagos -f %0Script\dic.lua %*script(%0Script\selectword.js) %si"tempfile"
    *ifmatch 0,0%NVX %: *splitppv %si"tempfile",%si"ratio" %: *mapkey use,K_splitppv %: *stop
    *execute VX,%%J%si"tempfile"
}

K_splitppv    = {
Q    ,*ifmatch !0,0%NVX %: %Oi *windowsize %N,%*windowrect(,w),%si"height0"
    *mapkey delete,K_splitppv
    *closeppx "%n,VX"
ENTER    ,*ifmatch !0,0%NVX %: %Oi *windowsize %N,%*windowrect(,w),%si"height0" %: *closeppx VX %: *stop
    *splitppv %si"tempfile",%si"ratio"
}

やり方

[I]でキャレットモードにしてから、辞書を引きたい単語を範囲選択して、以下のコマンドを実行する。

*ebwin2ppv 50

引数で分割の割合を変更できる。単位は百分率。半分にしたかったら50、四分の一なら75、とすればいい。 僕はマウス中クリックでこのコマンドを起動するようにしている。

MV_click    = {    ; PPv メイン窓
M_SPC    ,*ebwin2ppv 50
}

参考

つかさのほえほえ日記: PPvでEPWING形式の辞書を引く

2024年10月23日水曜日

コメントを検索してマーク

僕はhowm形式でメモを取り、タイトルをコメントで表示している(参考:moe | メモの方法論)。

「TODO」「借りたい本」「日付」みたいに、特定の文字列がタイトルに含まれるエントリをまとめて処理するため、コメントの文字列を検索してマークするスクリプトを作った。

コメント行頭が「TODO 」のエントリをマークしたい場合は以下。

*script %0Script\commentmark.js,"^TODO "

コメントが「2024-10-23」といった形式のエントリをマークしたい場合は以下。

*script %0Script\commentmark.js,"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"

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にするといいだろう。

参考