2020年9月8日火曜日

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

僕は、移動やコピーや解凍をする際は、サブ窓で処理先を指定している(参考:コピー/移動/解凍先フォルダ選択を別窓で)。

サブ窓の起動パスを、フォルダごとにリストファイルで指定できるようにする。


準備

以下を編集して取り込み。ちなみに展開に使ってるwrap_7z.jsについては、一つ前の記事を参照のこと。

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 %*getfileto()
\C ,*ifmatch !CX,%n %: *alias ppcx_cmd = *file !copy ,%%*extract(%n"%%%%@*8FCDN"),%%1 %%: %%K"@Q" %: *ppc -r -bootid:x -single %*getfileto()
\U ,*ifmatch !CX,%n %: *alias ppcx_cmd = *script %0Script\wrap_7z.js,%%*extract(%n"%%%%a8FDC"),%%1 %%: %%K"@Q" %: *ppc -r -bootid:x -single %*getfileto()
}

_Command = {
getfileto = *ifmatch "o:e,a:d-","fileto.txt" %: *return "fileto.txt"
  %1
}

次に、起動パスを指定したいフォルダに、リストファイルのfileto.txtを用意する。例えばdownloadフォルダから、binフォルダやTempフォルダを処理先に選ぶことが多い場合は、downloadフォルダにfileto.txtをおいて、その中身を以下のようにする。

D:\bin
D:\Temp

カレントフォルダにfileto.txtがあればそれを、なければカレントフォルダパスを返すユーザーコマンドgetfiletoを使い、サブ窓のパスを変更するという仕組みになっている。

やり方

コピーの例で説明する。コピーしたいファイルにマークしてShift+C。するとサブ窓が開く。サブ窓の起動フォルダは、カレントフォルダにfileto.txtがあればそれを参照したものに、なければカレントディレクトリになる。

サブ窓で処理先のフォルダ内に移動し、Shift+Enterを押すと、先にマークしたファイルはそこにコピーされ、サブ窓は消える。


移動したい場合はShift+M、書庫を展開したい場合はShift+Uで同じようにする。

2020年9月7日月曜日

7-zip(7z.exe)で書庫の展開

以前作ったwrap_7zG.jsが機能しなくなってたのでスクリプトを見直してみた。

7-Zipを使い、複数の書庫ファイルを特定のフォルダに展開したい場合に使う。

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

*script %0\Script\wrap_7z.js,%a8FCDN,%1

wrap_7z.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 archiveFiles = GetList(responseFile);
// 個々のファイルごとに7-Zipで展開
for (x in archiveFiles){
  if (archiveFiles[x] == ""){
    break;}
  PPx.Execute('\"'+Exec+'\" x -o\"'+extractFolder+'\\*\" '+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;
}


2020年5月19日火曜日

PPb+pecoで英和辞書

英和辞典を一行編集で引く方法を以前紹介したが、連続的に辞書を引く必要があるとき、一行編集をその度に表示しないといけないのが煩わしいなと思っていた。
なので別の方法を考案。

chcp 65001 %: type %0ejdic-hand-utf8.txt | %0peco.exe

これでPPbを辞書代わりにできる。


辞書ファイルは以下。

2020年5月5日火曜日

PPx+pecoで柔軟にフォルダ階層移動


pecoで柔軟に階層移動できるようにする。以前は一階層しか移動できなかったが、今回は複数階層の移動が可能。
Script Module以外にText Moduleが必要。Releases · peco/peco · GitHubからWindows版のバイナリ(peco_windows_amd64.zip)をダウンロードし、peco.exeをPPxフォルダに置いておく。



以下を編集して取込。

_Command = {
folder2peco = chcp 65001
 %Oi (echo ---thispath & echo .. & dir /a:d-s /b)  | %0peco.exe | %0ppbw.exe -c *alias selectedpath=%%*stdin(-utf8)
 *return %'selectedpath'
root2peco = chcp 65001
 %Oi (echo ---thispath & dir /a:d-s /b)  | %0peco.exe | %0ppbw.exe -c *alias selectedpath=%%*stdin(-utf8)
 *return %'selectedpath'
move2folder = *ifmatch 0,0%*substring("%1",3) %: *string o,hoge=%*root2peco()
 *ifmatch !0,0%*substring("%1",3) %: *string o,hoge=%*folder2peco()
 *ifmatch ---thispath,%so"hoge" %: *return
 *jumppath %*name(DC,%so"hoge") %: *execute,*%*arg(0)
}

PPcで

*move2folder %: *focus "PPB[" %: %k"ESC"

を実行する。

ポイントとか


  • 試行錯誤してる間、二度くらいカスタマイザーが起動しなくなって再インスコすることになった(再現性はよくわからない)。試す方は注意を
  • move2folderが本体
  • folder2pecoとroot2pecoは、カレントフォルダのサブフォルダ一覧をpecoに投げ、結果を返すユーザコマンド。2つの違いは「..」を表示するか否か
  • chcp 65001 で文字コードをUTF-8に
  • ユーザコマンドは*test以外に%*test()の形でも使える
  • linuxだと標準出力は簡単に取り出せるようだが、Windowsだと難しい(多分)。そこで、「エイリアスに格納して、returnで返す」という手続きを踏んでいる。_User:nameではなくエイリアスを使ってるのは、_User:nameだと処理速度が落ちるから(おま環かも)
  • ユーザコマンド中の*%arg(0)で再帰呼び出しができる。以下はもっと単純な例


_Command = {
test = *ifmatch 0,0%"何も入力しないでくだしあ><"%E %: *return
 *execute,*%*arg(0)
}


2020年5月3日日曜日

ウィンドウの位置とサイズを引数で変更

xyzzyの位置がずれたとき、いちいちマウスでつまんだりドラッグしたりして直すのが面倒なので、コマンドで戻せるようにする。

;; ウィンドウの位置とサイズを引数で変更
;; 「X座標 Y座標 ウィンドウ幅 ウインドウの高さ」の4つの引数を取る
;; > xyzzy の音 - バッファ/ウィンドウ/フレーム
;; > http://hie.s64.xrea.com/xyzzy/note/buffer.html#xyzzy-resize
;; を参考にした

(require "wip/winapi")
(unless (fboundp 'SetWindowPos)
  (c:*define-dll-entry winapi:BOOL SetWindowPos
    (winapi:HWND winapi:HWND winapi:INT winapi:INT winapi:INT winapi:INT winapi:UINT)
    "user32"))
;サイズを変更
(defun xyzzy-resize ()
  (interactive)
  (if si:*command-line-args* (setq x (pop si:*command-line-args*))(setq x "1280"))
  (if si:*command-line-args* (setq y (pop si:*command-line-args*))(setq y "43"))
  (if si:*command-line-args* (setq w (pop si:*command-line-args*))(setq w "608"))
  (if si:*command-line-args* (setq h (pop si:*command-line-args*))(setq h "1023"))
  ;位置/サイズを指定
  (SetWindowPos (get-window-handle) 0
  (parse-integer x)  ;X座標
  (parse-integer y) ;Y座標
  (parse-integer w) ;ウィンドウ幅
  (parse-integer h) ;ウィンドウ高さ
  0))


xyzzy -e (xyzzy-resize) 1280 43 608 1023

のように「X座標 Y座標 幅 高さ」の数値を与えて外部から変更する。

参考


2020年4月25日土曜日

DialogHandler+PPc



画像とかをtwitterにうpするとき、PPcから選べるようにする。DialogHandlerを利用。以前はPPvから起動できるようにしてたが、使い勝手が悪く使わなくなっていた。

以下を編集して取込。

KC_main = { ; PPcメイン窓
\ENTER ,*ifmatch CX,%n %: *execute ,%'ppcx_cmd' %: *stop
 %K"@\ENTER"
}
_Command = { ; ユーザコマンド・関数
changedialog = *ifmatch !CX,%n %: *alias ppcx_cmd = %%Ob D:\bin\DialogHandler\DialogHandler.x86-64.exe %%#FCD %%: %%K"@Q" %: *ppc -r -bootid:x -single
}

一行編集から*changedialogを実行すると、PPC[X]が起動する。目的のファイルにカーソルを合わせてShift+Enterで、ダイアログが切り替わる。
ちなみにエイリアスをかませたりとややこしいことをしてるのは、PPC[X]を別の用途でも使いたいから

2020年4月24日金曜日

複数の窓の位置と大きさを一度に変更

窓を複数枚運用していると、大きさや位置をそれぞれ手動で調整するのが面倒になる。
そこで、一度に変更するスクリプトを作った。
PPx Window Moduleが必要。またScript Moduleは最新のものを。

SetDimensions.js

//!*script

// 要Window Module
// 引数として
// C_A 5 5 600 600 ,C_B 5 605 600 600 ,V_A 605 5 600 600
// のように「窓ID 左端の座標 上端の座標 幅 高さ」を,で区切って取得
// それを再現する

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

var ary;
var win_id;
for(i = 0; i < PPx.Arguments.Length; i++) {
  ary = PPx.Arguments.Item(i).split(/\s+/);
  win_id = ary[0].slice(-1);
  if (ary[0].slice(0,1)=="C"){
    PPx.Execute("%Oi *ppc -r -bootid:"+win_id);
    PPx.Execute("*windowposition %NC"+win_id+","+ary[1]+","+ary[2]);
    PPx.Execute("*windowsize %NC"+win_id+","+ary[3]+","+ary[4]);
  } else {
    PPx.Execute("%Oi *ppv -bootid:"+win_id);
    PPx.Execute("*windowposition %NV"+win_id+","+ary[1]+","+ary[2]);
    PPx.Execute("*windowsize %NV"+win_id+","+ary[3]+","+ary[4]);
  }
}

使い方


*script %0Script\SetDimensions.js,C_A 5 5 600 600 ,C_B 5 605 600 600 ,V_A 605 5 600 600

と、引数に「窓ID 左端の座標 上端の座標 幅 高さ」を与えると、それぞれのIDのPPCあるいはPPVを起動。窓の位置や大きさを変更する。

*script %0Script\SetDimensions.js, %*getcust(S_dimensions:normal)

のように、与える情報をユーザ変数に登録して使うとかするとスマート。
ちなみに以下は、現在開いている窓の情報をこの形式で取得するためのスクリプト。僕は

echo %*script(%0Script\GetDimensions.js)

で情報を吐き出させて使っている。

GetDimensions.js

//!*script

// 要Window Module
// 実行すると
// C_A 5 5 600 600 ,C_B 5 605 600 600 ,V_A 605 5 600 600
// のように「窓ID 左端の座標 上端の座標 幅 高さ」を,で区切った
// 返り値を返す

var ppclist = PPx.Extract('%*ppxlist(-C)').split( "," );
ppclist.pop();
var ppvlist = PPx.Extract('%*ppxlist(-V)').split( "," );
ppvlist.pop();
var winlist = ppclist.concat(ppvlist);
var str = "";
var l,t,w,h;
for(i = 0; i < winlist.length; i++) {
  l = PPx.Extract("%*windowrect(%N"+winlist[i]+",l)");
  t = PPx.Extract("%*windowrect(%N"+winlist[i]+",t)");
  w = PPx.Extract("%*windowrect(%N"+winlist[i]+",w)");
  h = PPx.Extract("%*windowrect(%N"+winlist[i]+",h)");
  str = str + winlist[i]+" "+l+" "+t+" "+w+" "+h+" ,";
}

PPx.Result = str;