2013年12月31日火曜日

ドライブを順次変更する

あいさつ


つかさです。PPxでスクリプトを使わないとできなさそうなあふっぽいキーバインドを実現してみる編その4です。今回はドライブ順次変更。あふではCtrl+カーソル左右に割り当てられてます。

割りとよくありそうな機能だからヘルプをよく読めばもしかしたらスクリプトとか使わなくても普通にできる簡単なやり方がある気もしなくなくもない。

やりかた


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

NextVol.js

//!*script

var fs = PPx.CreateObject("Scripting.FileSystemObject");
var fn = PPx.Extract("%1");
var i;

var e = new Enumerator(fs.Drives);
var flds = new Array(); 
for (; !e.atEnd(); e.moveNext()) {
  if (e.item().DriveLetter == "A"){
  } else if (e.item().IsReady) {
    flds.push(e.item().DriveLetter);
  }
}
flds.sort(function(a, b){return a.toLowerCase() > b.toLowerCase()?1:-1;}); 
for(i = 0; i < flds.length; i++) {
  if( flds[i] == fn.slice(0,1) ) break;
}

if ( i == flds.length-1) i = -1;
var nextVol = flds[i + 1].charCodeAt(0) - 64;

PPx.Execute("%K\"@" + nextVol  + "\"");

PrevVol.js

//!*script

var fs = PPx.CreateObject("Scripting.FileSystemObject");
var fn = PPx.Extract("%1");
var i;

var e = new Enumerator(fs.Drives);
var flds = new Array(); 
for (; !e.atEnd(); e.moveNext()) {
  if (e.item().DriveLetter == "A"){
  } else if (e.item().IsReady) {
    flds.push(e.item().DriveLetter);
  }
}
flds.sort(function(a, b){return a.toLowerCase()>b.toLowerCase()?1:-1;}); 
for(i = 0; i < flds.length; i++) {
  if( flds[i] == fn.slice(0,1) ) break;
}

if ( i == 0 ) i = flds.length;
var nextVol = flds[i - 1].charCodeAt(0) - 64;

PPx.Execute("%K\"@" + nextVol  + "\"");

以下を編集して取込。あふと同じようにCtrl+カーソル左右でドライブ変更ができるようになる

KC_main = { ; PPcメイン窓
^LEFT ,*script %0\Script\PrevVol.js
^RIGHT ,*script %0\Script\NextVol.js
}

思ったこととか


あふと同じように、ディスクが入ってないドライブは無視するようにしている。あと、ドライブAは僕の環境だと読み込みに行くと時間食うので除外している。
Dなら4、Cなら3とドライブ文字を数値に変換して、%K"@4"の要領で移動しているのだが、力技っぽくてあまり気に入ってない。これってドライブの数が増えて10以上になったら都合が悪くなりそうな。さすがに試せないけど。だけど、%J"D:\"の要領で移動するとルートフォルダに移動してしまい、やりたい動作と少しずれる。
もっとうまいやり方あれば誰か教えてくだしあ


追記 14/01/07


作者さんからコメントいただきました

orz

2013年12月29日日曜日

最初のエントリにカーソル移動 + α

以前作ったcursormove.jsを作り直す。(参考:カーソル移動を素早くする(改)

cursormove.jsは、最初のエントリにカーソル移動するためのスクリプト。ただそれだけだと寂しいので、

  • 最初のエントリで実行 → 最初のファイルへ
  • 最初のファイルで実行 → 番最後のエントリへ

とカーソル位置を移動するようにしている。


たとえばこのようなフォルダ構成だったら、①→②→③→①…という動きをする。

汎用性があるかどうかというと多分微妙なのだろうが、僕の中では使用頻度が高い。フォルダ構成その他で思うように機能しないことが多々あり、そのたびに少しずつ修正をしてきたが、元々のスクリプトがこんがらがってたので一新。

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

CursorMove2.js

//!*script


// 最初のエントリ位置取得
var fn;
for (var i = 0; i < 3; i++) {
  if (PPx.Entry(i).Name != "." && (PPx.Entry(i).Name != "..") ) {
    fn = i
    break;
  }
}

// 最初のファイル位置取得
var ff;
for (var i = fn; i < PPx.EntryAllCount; i++) {
  if (PPx.GetFileInformation(PPx.Entry(i).Name) != ":DIR") {
    ff = i;
    break;
  }
}

// エントリが一つ以下なら終了
if (PPx.EntryDisplayDirectories + PPx.EntryDisplayFiles <= 1) PPx.Quit();

// ファイルのみの場合
if (PPx.EntryDisplayDirectories == 0) {  // 最初のエントリなら最後に
  if (fn == PPx.EntryIndex){
    PPx.EntryIndex = PPx.EntryAllCount - 1;
    PPx.Quit();
  } else {  // それ以外なら最初に
    PPx.EntryIndex = fn;
    PPx.Quit();
  }
}

// ディレクトリのみの場合
if (PPx.EntryDisplayFiles == 0) {  // 最初のエントリなら最後に
  if (fn == PPx.EntryIndex){
    PPx.EntryIndex = PPx.EntryAllCount - 1;
    PPx.Quit();
  } else {  // それ以外なら最初に
    PPx.EntryIndex = fn;
    PPx.Quit();
  }
}

// ファイルとディレクトリがともにある場合

if (PPx.EntryIndex == fn){  // 最初のエントリなら最初のファイルに
  PPx.EntryIndex = ff;
} else if (PPx.EntryIndex == PPx.EntryAllCount - 1) {  // 最後のエントリなら最初のエントリに
  PPx.EntryIndex = fn;
} else if (PPx.EntryIndex == ff) {  // 最初のファイルなら最後のエントリに
  PPx.EntryIndex = PPx.EntryAllCount - 1;
} else {  // それ以外なら最初のエントリに
  PPx.EntryIndex = fn;
}

以下を編集して取込。 Ctrl+Eに割り振る。

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

2013年12月25日水曜日

PPxをだいなっぽくする(二画面)

あいさつ


以前、一画面でなんちゃってだいなファイラー風の表示にしてみたが、今回は二画面でだいなっぽくしてみる。




上がPPxで下がだいなです。

やりかた



以下の文字列をクリップボードにコピーしましょう。

XC_stat = _AUTO,_AUTO,0,0,O"_GRE" R60 C / i"Marked" mn i"/" E0 S1 ms8 S1 i"Bytes" Df8 S1 i"Free" ; ステータス行
X_win = { ; 表示形式全般 *layout
CA = B001001001
CB = B001001001
}
F_mes = -16,0,0,0,400,0,0,0,128,3,2,1,17,MS 明朝 ; 汎用
C_entry = _WHI,_WHI,_CYA,_RED,_CYA, _MAG,_BLU,_GRE,_DWHI, _SBLU,_DBRO,_GRE,_RED,_MAG 
C_eInfo = _AUTO,_DRED,_AUTO,_DBLA,_DBLU,_DCYA,_DBLA,_BRO,_WHI,_WHI,_AUTO,_BLU,_AUTO, H404000,_BRO,_CYA,_GRE 
XC_celD = _AUTO,_AUTO,4,7 ; エントリ表示 文字,背景,カーソル,マーク 
X_inag = 0 ; 現在窓以外はグレー調に 0:しない 1:する
X_combo = 1 ; 複数 PPc を一体化 0:しない 1:する
X_combos = B0000000000001000010010000000000,B000 ; 一体化時の表示形式CC_log = _WHI,_BLA ; 共用ログ、アドレスバー(文字,背景)_AUTO可
XC_mvLR = 4,1,6,B0100,6,B100 ; [←][→]

ついで、PPxフォルダーにあるPPCUSTW.EXE(PPCUST.EXE)を実行するか、メニューバーのツールから選択するかなどしてカスタマイザーを起動。起動したら


  • ファイルタブ - 編集して取込


をクリック。



すると、クリップボードにコピーした文字列が貼り付けられた状態で、編集して取込ダイアログが出ます。そこでOKボタンをクリック。




PPcを再起動。すると、だいなっぽくなる。


壁紙の透過をしてみる



だいなの特徴に、壁紙の透過というのがある。それをする方法。

カスタマイザーの全般タブからおまけをクリックし、

  • 「画面のちらつき対策」にチェック
  • 「窓全体を透けるようにする」で半透明を選択

してから適用ボタンを押す。



このようになる。



壁紙を表示したいなら、

  • 「画面のちらつき対策」にチェック 
  • 「背景に使用する画像」で適当な壁紙を選択
  • 「PPc,PPvの背景に画像を表示」で「しない」以外のどれかを選択
  • 「背景画像の明るさ」を適当な数値に設定

してから適用ボタンを押す。



するとこのようになる。



だいなっぽく画像表示


2画面PPxでいろんな仕方で画像表示のall_view.jsを使えばいい。一応ここでも簡単に説明。

TORO’s Libraryから

  • Paper Plane xUI Script Module
  • Paper Plane xUI Message Module
  • Paper Plane xUI Window Module

をダウンロード。その中にある

  • PPXSCR.DLL(OSが64bit版ならPPXSCR64.DLL)
  • PPXMES.DLL(OSが64bit版ならPPXMES64.DLL)
  • PPXWIN.DLL(OSが64bit版ならPPXWIN64.DLL)

をPPxフォルダにコピーしておく。

以下をall_view.jsという名前でScriptフォルダに保存。

all_view.js

//!*script 

var ppcid = PPx.Extract('%n').slice(1); // PPc ID

if (PPx.GetComboItemCount == 0){
  PPx.Execute('%Oi %0\\PPVW.EXE -bootid:' +ppcid+ ' "%1\\%R"');
} else {
  PPx.Execute('%Oi %0\\PPVW.EXE -bootid:' +ppcid+ ' "%1\\%R"');
  PPx.Execute('*fitwindow %*findwindowclass("PaperPlaneCombo"),%NV' +ppcid);
}

以下を編集して取込。

E_cr = { ; [Enter]用判別
:JPEG ,
:BMP ,
:XJS ,
:XVBS ,
PNG ,*script %0\Script\all_view.js
JPG ,*script %0\Script\all_view.js
JPEG ,*script %0\Script\all_view.js
BMP ,*script %0\Script\all_view.js
GIF ,*script %0\Script\all_view.js
TXT ,*script %0\Script\all_view.js
CPP ,*script %0\Script\all_view.js
H ,*script %0\Script\all_view.js
C ,*script %0\Script\all_view.js
L ,*script %0\Script\all_view.js
SCM ,*script %0\Script\all_view.js
INI ,*script %0\Script\all_view.js
VBS ,*script %0\Script\all_view.js
JS ,*script %0\Script\all_view.js
PY ,*script %0\Script\all_view.js
HOWM ,*script %0\Script\all_view.js
CFG ,*script %0\Script\all_view.js
}

KV_main = { ; PPvメイン窓
ENTER = @Q
UP ,%KC%*regexp(%n,"/.(.)/$1/") "@UP @N"
DOWN ,%KC%*regexp(%n,"/.(.)/$1/") "@DOWN @N"
SPACE ,%KC"@SPACE@N"
\SPACE ,%KC"@\SPACE@N"
&ENTER ,*togglewinsize
}

XV_imgD = { ; 拡大縮小設定([=],*zoom,*reducemode) PPvID = 倍率、縮小方法
;倍率: -1:窓枠に合わせる -2:窓より小→等倍、大→縮小 0:100% 1-10000:%倍率
;縮小方法: 1:白地に黒文字 2:黒地に白文字 3:カラー高速 4:混合
VA = -2,4
VB = -2,4
}


追記 2013/12/27


all_view.jsを独立窓の時に使っても表示がおかしくならないようにした

2013年12月19日木曜日

PPvでマークファイルを閲覧

僕はPPcとPPvをIDで一対一対応させて用いている(参考:PPcとPPvのIDを一対一対応させる - つかさのほえほえ日記)。

これまで作った

  • go_mark.js
  • go_markR.js
  • go_next_mark.js
  • go_prev_mark.js

を利用して、「対応するIDのPPcのカーソルを動かしてPPvで閲覧」をマークファイルのみで行います。こっちのほうが利用する機会ありそうかな?



上下方向


  • go_mark.js
  • go_markR.js

の二つをScriptフォルダに入れておこう。マークファイルにカーソルを合わせるにあります。

KV_main    = {    ; PPvメイン窓
^V_HBA    ,*execute C%*regexp(%n,"/.(.)/$1/"),*script %0\Script\go_mark.js %: %KC%*regexp(%n,"/.(.)/$1/")"N"
^\V_HBA    ,*execute C%*regexp(%n,"/.(.)/$1/"),*script %0\Script\go_markR.js %: %KC%*regexp(%n,"/.(.)/$1/")"N"
}

これを編集して取込。
これで、PPvでファイルを閲覧しているとき、Ctrl+:で下方向のマークファイルを表示。Ctrl+Shift+:で上方向のマークファイルを表示する。

マーク順


  • go_next_mark.js
  • go_prev_mark.js

の二つをScriptフォルダに入れておこう。マークファイルにカーソルを合わせる(マーク順)にあります。

KV_main    = {    ; PPvメイン窓
^V_HBA    ,*execute C%*regexp(%n,"/.(.)/$1/"),*script %0\Script\go_next_mark.js %: %KC%*regexp(%n,"/.(.)/$1/")"N"
^\V_HBA    ,*execute C%*regexp(%n,"/.(.)/$1/"),*script %0\Script\go_prev_mark.js %: %KC%*regexp(%n,"/.(.)/$1/")"N"
}

これを編集して取込。
これで、PPvでファイルを閲覧しているとき、Ctrl+:で次のマークファイルを表示。Ctrl+Shift+:で前のマークファイルを表示する。

マークファイルにカーソルを合わせる(マーク順)

前回とは違い、今回はマーク順。上方向下方向は関係なく、マークした順番にマークエントリにカーソルを合わせていく。Ctrl+:で次のマークファイル。Ctrl+Shift+:で前のマークファイルです。

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

go_next_mark.js
//!*script

i = PPx.EntryIndex;

if (PPx.EntryMark == 0){
  PPx.EntryFirstMark;
} else {
  PPx.EntryNextMark;
}

if (i == PPx.EntryIndex) PPx.EntryFirstMark;

go_prev_mark.js
//!*script

i = PPx.EntryIndex

if (PPx.EntryMark == 0){
  PPx.EntryLastMark;
} else {
  PPx.EntryPrevMark;
}

if (i == PPx.EntryIndex) PPx.EntryLastMark;

go_next_mark.jsがマーク順でgo_prev_mark.jsがその逆順です。

以下を編集して取込
KC_main = { ; PPcメイン窓
^\V_HBA ,*script %0\Script\go_next_prev.js
^V_HBA ,*script %0\Script\go_next_mark.js
}

2013年12月18日水曜日

PPxの設定ファイルを管理する

設定ファイルの個別化


つかさです。PPxの設定をどうやって管理するかという話。
僕はCFGフォルダというのを作って、そこに設定ファイルをテキストファイルで保存、適宜取り込むというやり方をしている。



このように

  • PPcとPPvのキーバインド
  • 個々のメニュー
  • 拡張子判別実行メニュー
  • 基本的な設定
  • ディレクトリごとの表示形式やソート状態
  • その他

と設定を個別に適当なファイル名で保存している。ファイル名から内容がすぐわかるよう、メニューにははじめにM_をつけるなどして工夫している。僕は拡張子をCFGにしているが、中身がテキストファイルであればtxtでも何でも関係ない。

メニューの設定ファイルを追加取込できるように


メニューの設定ファイルは次のようにしている。これはマスクメニューの例。

M_Mask.CFG
-|M_Mask =

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

KC_main = { ; PPcメイン窓
I ,%M_Mask,1
}

  1. メニューの削除
  2. メニュー
  3. メニューのキーを登録

という構成。メニューの削除を最初に入れているのは、この設定を「テキストの取込」ではなく「追加取込」で取り込みたいから。

また、メニューを表示するためのキーバインドも一緒に取り込むようにしている。別々の設定に書くよりも、このほうがわかりやすい。ただ、これだとこの設定ファイルを「テキストの取込」で取り込んでしまうと、登録してある他のキーバインドが上書きされ、吹っ飛んでしまうのでそれだけ注意する。取り込むときには追加取込を使うように。

最初から設定をやり直したいとき


色々と設定をいじっていて、ごちゃごちゃになったから最初からやり直したい、という場合がある。
そのときは、 カスタマイザーで初期化をしてから、取り込みたい設定ファイルにマーク。

Hを押し、

*customize @%FCD

をコピペして実行する。



すると、マークした複数の設定ファイルを、追加取込で取り込むことができる。このやり方なら一分もかかりませんね。

2013年12月16日月曜日

xyzzyでPPvの表示ファイルを同じ表示箇所で開く

PPvで自分のメモファイルを読んでいる時、文章を付け足したり誤字を訂正したいと思うことがある。そのときは、PPvと同じ表示箇所をxyzzyを開きたい。


PPv閲覧中にEを押せば


こんなふうにPPvの表示箇所と同じとこが開けたらいいな、と。

以下を編集して取込。
KV_main = {
E ,%Ob %'xyzzy' %FDC -g %L -e "(recenter 0)"
}

Eで表示ファイルが同じ表示箇所で開くはず。
今までは行数のみを送っていたが、半ページ分ほどずれて表示され、一々スクロールし直さなければならなかった。recenterというのでスクロール位置を調節すればよかったようだ。