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
}