2013年5月31日金曜日

マークファイルでマスク

マスクメニューに「マークファイルでマスク」を追加してみる。
KC_main = { ; PPcメイン窓
':' ,%M_Mask,E
}

M_Mask = { ** comment **
&EXEでマスク = *maskentry *.exe
&TXTでマスク = *maskentry *.txt,*.howm,*.ini
画像マスク(&I) = *maskentry *.jpg,*.jpeg,*.png,*.gif,*.bmp
-- = 
ディレクトリマスク(&D) = *maskentry attribute:d
マークファイルでマスク(&M) = *maskentry %#;C %: %K"HOME"
-- = 
マスク解除(&U) = *maskentry
}

複数のテキストファイルのメモを閲覧している時


特定の関係しているファイルだけを選んで、一時的にそれだけ表示できたら便利じゃないかなーっと。

2013年5月22日水曜日

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

あいさつ


今まではLhaForge+fenrirで書庫の展開をしていた。

書庫にカーソルをあわせ、展開先のフォルダをfenrirで選択、コマンドで展開してLhaforgeの機能で展開先のフォルダを別窓で開くという仕方です。 ただこれだと現在窓に展開だとか複数の書庫の展開だとか細かいところで調整がきかないので、7-Zipとスクリプトでの展開に変えてみる。

解凍したい書庫にマークしてから、Shift+Uで解凍メニューを表示。展開先を選びます。

KC_main = { ; PPcメイン窓
\U ,%M_MyUnpack,1
}
M_MyUnpack = { ** comment **
現在窓に展開(&1) = *script %0\Script\wrap_7zG.js,"%a8FCDN","%1"
反対窓に展開(&2) = *script %0\Script\wrap_7zG.js,"%a8FCDN","%2"
反対窓のマークファイルを現在窓に展開(&3) = *script %0\Script\wrap_7zG.js,%*extract(~"%%a8FCDN"),"%1"
}

wrap_7zG.js
//!*script
// 7zG を実行して展開先フォルダにアーカイブファイルを展開する
// 第一引数: レスポンスファイル
// 第二引数: 展開先フォルダ

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

var fs = PPx.CreateObject("Scripting.FileSystemObject");
//  7-Zipのパス
var exec = 'C:\\Program Files\\7-Zip\\7zG.exe';
var archiveFiles = GetArchiveFiles(fs, PPx.Arguments.Item(0));
var extractFolder = PPx.Arguments.Item(1);

// 個々のファイルごとに7-Zipで展開
for (x in archiveFiles){
  if (archiveFiles[x] == ""){
    break;}
  fn = archiveFiles[x];
  ExtractArchive(fs, fn, extractFolder);
}

// レスポンスファイルからファイル名のリストを作成
function GetArchiveFiles(fs, 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;
}

// フォルダを作成して展開
function ExtractArchive(fs, archiveFile, extractFolder)
{
  var foldername = extractFolder + '\\' + PPx.Extract('%*name(X,' + archiveFile + ')');
  var command = '%Obsq \"' + exec + '\"' + ' x ' + archiveFile + ' -o\"' + foldername + '\"';
  
  // フォルダを作成
  PPx.Execute('*makedir ' + foldername);
  // 7-Zipで解凍
  PPx.Execute(command);
  // 二重フォルダの場合は解消する
  PPx.Execute('*chopdir ' + foldername);
}

参考

2013年5月21日火曜日

反対窓でマークしたファイルを現在窓に移動/コピー

あいさつ


つかさです。
反対窓でマークしたファイルを現在窓に移動あるいはコピーできるようにする。レスポンスファイルを使ってます。
Shift+Mで移動、Shift+Cでコピー。

KC_main = { ; PPcメイン窓
\M ,*file move,%*extract(~"%%@*8FCDN"),%1
\C ,*file copy,%*extract(~"%%@*8FCDN"),%1
}


やりたいこととか


どこかのフォルダにいてそのフォルダ内のファイルを移動したいというとき、通常の操作では

  1. 移動させたいファイルをマーク
  2. 移動先のフォルダをもう一枚の窓で開く
  3. Tabで最初の窓に戻り、Mキーを押して反対窓にファイル移動
  4. もう一度Tabを押して、そこで作業をするなり窓を閉じるなりする
といったように何度も二つの窓を往復しなければならない。PPxとfenrirの連携 - つかさのほえほえ日記の「ファイル操作での操作先の指定」で書いたやり方をすれば窓を開かずにこの操作はできるのだが、よく使っているフォルダで無ければあまり有効ではない。「どこにあったっけ」というフォルダを移動先に指定したいならランチャでそのフォルダを選択するのは難しく、結局はもう一枚の窓を 開いて階層構造をたどって移動先のフォルダを見つけて、ということをせざるを得ないのだ。

だが、「反対窓で選択したパスを、現在窓に移動」することができれば

  1. 移動させたいファイルをマーク
  2. 移動先のフォルダをもう一枚の窓で開く
  3. Shift + Mキーを押してファイル移動
  4. 作業をするなりなんなりする

といったように窓の行き来を減らすことができるのだ。

SETZERでタスクトレイアイコンを変更する

SETZERではタスクトレイアイコンを5種類使用していて、それぞれdataフォルダ内のアイコンファイルに対応している。

通常モード   →   tray.ico
フックオフモード   →  tray2.ico
AAフックモード   →  aa.ico
Fifoモード   →  fifo.ico
Lifoモード   →  lifo.ico

だからアイコンを変えたい場合は名前を対応させて元ファイルと差し替えるだけでいい。
あと本体、オプション、Aboutで左上に表示されるアイコンはtray.icoに対応している。


2013年5月20日月曜日

TabでPPc-PPv間切り替え

通常Tabキーでの窓の切り替えはPPc間でしかできないが、それをPPvも含めて切り替えられるようにする。
 PPc[A]→PPc[B]→PPc[C]→PPv[A]→PPv[B]→PPc[A]… ということです。

PPcTab.js
//!*script

// 実行元のPPcIDを文字コードに変換
var useppc = PPx.Extract('%n').slice(1).charCodeAt(0) + 1;

// 実行元PPcよりアルファベット順で後のPPcがあればフォーカスを移す
for (var i = useppc; i < 91; i++) {
  ppcid = String.fromCharCode(i);
  if (PPx.Extract('%NC' + ppcid).match(/.+/)) {
    PPx.Execute("*focus C" + ppcid);
    PPx.Quit(-1);
  }
}

// 無ければPPvにフォーカス
for (var i = 65; i < 91; i++) {
  ppvid = String.fromCharCode(i);
  if (PPx.Extract('%NV' + ppvid).match(/.+/)) {
    PPx.Execute("*focus V" + ppvid);
    PPx.Quit(-1);
  }
}

// PPvが無ければ通常のTabの動作
PPx.Execute("%K\"@F6\"");

PPvTab.js
//!*script

// 実行元のPPvIDを文字コードに変換
var useppv = PPx.Extract('%n').slice(1).charCodeAt(0) + 1;

// 実行元PPvよりアルファベット順で後のPPvがあればフォーカスを移す
for (var i = useppv; i < 91; i++) {
  ppvid = String.fromCharCode(i);
  if (PPx.Extract('%NV' + ppvid).match(/.+/)) {
    PPx.Execute("*focus V" + ppvid);
    PPx.Quit(-1);
  }
}

// 無ければPPcにフォーカス
for (var i = 65; i < 91; i++) {
  ppcid = String.fromCharCode(i);
  if (PPx.Extract('%NC' + ppcid).match(/.+/)) {
    PPx.Execute("*focus C" + ppcid);
    PPx.Quit(-1);
  }
}

// PPcが無ければPPcを起動
PPx.Execute("*ppc -bootid:A -r");

次を編集して取込
KC_main = { ; PPcメイン窓
TAB ,*script %0\Script\PPcTab.js
}

KV_main = { ; PPvメイン窓
TAB ,*script %0\Script\PPvTab.js
}

2013年5月18日土曜日

カーソル移動を素早くする

カーソルを

一番目のフォルダ→一番目のファイル→ラスト→一番目のフォルダ

と移動させるスクリプト。


cursormove.js

//!*script
// 最初のディレクトリ→最初のファイル→最後のファイルとカーソルを移す

// カーソルが最後なら最初に移す
if (PPx.EntryIndex == PPx.EntryAllCount - 1) {
  PPx.EntryIndex = 2;}

// カーソルがディレクトリ上の場合
else if (PPx.EntrySize == 0) {
  for (var i = 0; i < PPx.EntryAllCount; i++) {
    // ファイルがあれば最初のファイルへ移す
    if (PPx.Entry(i).Size != 0) {
      PPx.EntryIndex = i;
      break;
      }
    // ディレクトリのみなら最後へ移す
    else {PPx.EntryIndex = PPx.EntryAllCount;}
  }}
// カーソルがファイル上の場合は最後へ移す
else {PPx.EntryIndex = PPx.EntryAllCount;}

これをCtrl+Eに登録

KC_main = { ; PPcメイン窓
^E ,*script %0\Script\cursormove.js
}

2013年5月5日日曜日

MakeComment.jsを書き直す

このブログのコメントで、Windows7だとMakeComment.jsで.txt拡張子の一行目を取得できないという報告をいただいたので書き直してみた。
ちなみにMakeComment.jsはMoEで使用する、一行目とファイルパスを対応させたコメントファイルを作成するPPxスクリプトです。

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

var strLine = "\n";
var currentDir = PPx.Extract('%1');

for (var i = 0; i < PPx.EntryAllCount; i++) {
  // サイズが0のファイルとディレクトリは読み込まない
  if (PPx.Entry(i).Size == 0) {
  }
  // 拡張子がtxtとhowmのファイルを読み込む
  else if (PPx.Entry(i).Name.match(/.txt$|.howm$/i)) {
    var entryName = PPx.Entry(i).Name;
    var objItem = currentDir + "\\" + entryName;
    var objFileSys = new ActiveXObject("Scripting.FileSystemObject");
    // ファイルの内容を取得
    objInFile = objFileSys.OpenTextFile(objItem, 1);
    // ファイル名+Tab+一行目の最初二文字~100字を切り取ったもの+改行をstrに代入
    str = entryName + "\t" + objInFile.ReadLine().slice( 2,100 ) + "\n";
    strLine =  strLine + str;
    objInFile.Close();
  }
}

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

// 00_INDEX.txtに書き込み
objOutFile = objFileSys.OpenTextFile(strCreateFile, 2);
objOutFile.Write(strLine);
objOutFile.Close();
// F5で更新
PPx.Execute("%K\"@[F5]\"")

Windows7で実際に動くか試したからこれでいけるはず。 だめなら連絡ください。
一行が長いときのため、100字の文字数制限を追加してみました。あとtxtやhowmが大文字(TXTやHOWM)になってたら読み込まなかったみたいなのでそれも直しておいた。たぶんこっちのほうが処理早いので今まで問題なく使えてたひとも差し替えたほうがいいかもです。
けど以前のコードでVistaまでは問題なかったのに、7からは.txtファイルを読み取らなくなるってどういう理屈なんだろう。私、気になります!

2013年5月2日木曜日

実行ファイル用アイコンの作成

あいさつ


アイコンを作成し、それをpy2exeで埋め込むまでの過程のメモです。
今までSETZERを作る時は適当にアイコンエディタでアイコンを作って埋め込んでいたが、Win2kとかだとそれでよくてもVistaでは表示されないようなので、対応するようにしました。そのときに調べたことの記録です。

画像の作成


AzPainterで作成する。キャンバスは320x320で作りました。あとで調整するのでこの大きさは別にどうでもよさげ


アイコンの作成



今まで仕組みをよく知らなかったのだが、アイコンは複数の画像ファイルを束ねたものらしい。大きいアイコンとか小さいアイコンとかで表示分けがされるのは、同じ一つの画像を拡大したり縮小したりしているわけではなく、

Xpまでは
  • 大アイコン 48 × 48
  • 中アイコン 32 × 32
  • 小アイコン 16 × 16
Vistaからは
  • 特大アイコン 256 x 256
  • 中アイコン 48 x 48
  • 中アイコン 32 x 32
  • 小アイコン 16 x 16

と、それぞれに対応した画像がアイコンの中にあらかじめ含まれていて、時と場合に応じて違う画像を表示しているらしいです。ちなみに数値についてはちゃんと確かめたわけではないです。


そこで、画像ファイルからそのようなアイコンファイルを調整して作成するソフトが必要になる。いくつか試して一番よかったのがアイコン ウィザード

ライトタブと縁タブとで設定をし、画像を整形。ライトは40、縁の面取りを30にしました。



そしてアイコンファイルに含めるサイズを選択する。



Vistaに完全に対応するには特大アイコンを入れる必要があるのだろうが、ファイルサイズが数倍になってしまうので割愛。そこで32bitの48 32 16にチェックする…ことでいいはずなのだが、そうするとなぜかVistaでの中サイズアイコンの表示が荒くなってしまう。理由は不明。ただ、これは48よりも大きいアイコンを一つ追加しておけばとりあえずは起こらないようなので、64を追加しチェックを入れる。
あとは完了を押せばiconが作成される。



アイコンの埋め込み


py2exeを使って実行ファイルを作る際、ここで作ったアイコンを埋め込むだけです。

setup.py
import sys
import os

from distutils.core import setup
import py2exe
import setzer_resource

py2exe_options = {
  "compressed": 1,
  "optimize": 2,
  "bundle_files": 3}

setup(
  options = {"py2exe": py2exe_options},
  windows = [{
            "script" : "SETZER.py", "icon_resources": [(1,"py.ico")],

            "name" : setzer_resource.appname,
            "version" : setzer_resource.version,
            "description" : "",
            "company_name" : setzer_resource.copyright,
            "url" : setzer_resource.homepage,
            
            }],
  zipfile = "lib/library.zip")

PPxなら次のようなコマンドを打つ。
CD %1 %: C:\Python27\python.exe setup.py py2exe

を実行する。