【2画面ファイラ】 内骨格 Part1 【Python拡張】
/\___/ヽ /'''''' \ i´`Y´`Y`ヽ(⌒) / (●), ''''''\ ヽ_人_.人_ノ `~ヽ ./ ノ(、_, )ヽ (●) .| \___ \ |. / ̄〉 .| \_ 〉 \ /ー-〈 (⌒) ./ . `ニニ´ ノ Y`Y´`Yヽ あふと間違えた (´ ̄ .i__人_人_ノ ` ̄ヽ / ` ̄ ̄
バージョンまだぁー?
これちょっと弄ったけど、カスタマイズしてーんなら、ソース展開して 自分のPythonインタプリタから pythonw -m cfiler_main で実行したほうが便利 でも、config.pyからのカスタマイズには限界あると感じた Emacs風に言うとフックが十分に用意されてないという感じ 特にイベントハンドラまわりはCの実装にコンストラクタで渡したらそれっきりで、 外から/後から弄りようが無いんだよな
フックが足りないっていうのは同感。 例えばテキストビューアをQでも終了するように改造するためには、 command_Viewのコードを持ってきてonKeyDown関数を書き換えた command_View2みたいな関数を定義するか、 ↓みたいなことをやってTextViewerのonKeyDownメソッドを書き換えないといけないし。 from cfiler_textviewer import * tvKeyDown = getattr(TextViewer, 'onKeyDown') def tvKeyDown2(self, vk, mod): if tvKeyDown(self, vk,mod): return if vk==ord('Q') and mod==0: self.destroy() setattr(TextViewer, 'onKeyDown', tvKeyDown2)
235 :
名無しさん@お腹いっぱい。 :2008/07/14(月) 12:39:11 ID:94v6sBk40
またpythonか…
それなりに期待して起動してみたんだが・・・無茶苦茶重いのな。 ソース見たら殆んどPython・・・そりゃ更新も早かろうよ。 上の方でなぜかC++製ってことになってるけど騙されないよう注意な。
【2画面ファイラ】 内骨格 Part1 【Python拡張】
>>237 内骨格より軽くて高機能かつ拡張性が高い2画面ファイラをあげてくれ。
ま、あふで十分だな
軽さで比較すると、ウチではあふも内骨格も変わらんが。 まあ基本あふ使いだけどさ。
1 .47 - 2008/07/22 - Ctrl + ↑↓キーの際、ファイルが選択されていないときは、ブックマークにカーソル移動するようにした。 - テキストビューアのカスタマイズ機能を追加 (実験的) config.py の configure_TextViewer() を呼び出す。 - ホットキー設定ウインドウで、キーコード入力部品にフォーカスを持っていった際に、エラーが発生するのを修正 - Grep機能でアクセス権のエラーが発生したときに、Grepが続行しなくなっていたのを修正。ファイルをスキップして続行するようにした。 - デフォルトの設定ファイルで フィルタクラスに与えるパターン文字列をユニコード形式にした。(ユニコード形式ではないまま日本語を使用したときにエラーが発生するため) - 存在しないパスにジャンプしようとしたときに、適切なエラーメッセージを表示するようにした。 - ジャンプリスト中のファイルパスがUNICODE形式でなかった場合はエラー処理するようにした。
わしょーい
ソースパッケージにはpythonの標準配布物とpy2exe以外は全部含めておいて、 python setup.py py2exeできちんとcfiler.exeが出来る構成にしておいて欲しいなぁ。
1 .48 - 2008/07/22 - config.py のなかに、configure_TextViewer() が定義されていないと、テキストビューアを開いたときに、エラーメッセージが表示されるのを修正。 - Bookmarkの順序が、起動のたびに逆転しているのを修正 - diffviewerでCtrl-Upしたとき、マイナスの行番号として、ファイルの末尾が見えてしまうのを修正
1 .49 - 2008/07/27 - 補完候補ウインドウが、画面の下にはみ出る場合は、画面の上方向に配置するようにした。
削除が出来ない なにこれ
だがそれがいい
1 .50 - 2008/07/29 - Filter、Select、Search、の履歴を残すようにした。 - 露骨なエラーメッセージが出ていた箇所を調整。
1 .51 - 2008/08/05
- 補完候補ウインドウの右と下のフレーム部分が、再描画されずにゴミが残ることがあったのを修正
- 再描画をすこし高速化
- WindowsXPでクラシックテーマを使用したときに、ウインドウの一部が再描画されないまま残ってしまう、WindowsXPの問題 (
http://support.microsoft.com/kb/436093/ja ) を回避するオプションを設定メニュー2に追加
1 .52 - 2008/08/07 - GREPの検索パターンを履歴に残すようにした。 - ファイルのコピー時に、上書き対象のファイルがオープンできなかった場合の動作がおかしかったのを修正。 (上書き対象が削除されようとして、削除も失敗していた。) - 今後の品質向上のため、Pythonのインタプリタが1秒間以上ロックしたままになったことを検出するデバッグ機能を追加。 内骨格が長時間操作を受け付けなくなる現象を排除していくための技術的な情報を収集するため。 ( ini ファイルの [DEBUG] セクションの detect_block を 1 に設定すると有効になる。)
w2k ショートカットで実行時の大きさに最大化を選んで起動して内骨格を終了すると Errors occurred See the logfile 'X:\tools\cfiler\cfiler.exe.log'for details とダイアログがでる。 logファイルは Traceback (most recent call last): File "cfiler_mainwindow.pyo", line 553, in _onSize AttributeError: 'MainWindow' object has no attribute 'left_window_width'
1 .53 - 2008/08/09 - テキストビューアに検索機能を追加。Fキーを使って検索ダイアログを表示し、スペースキーで次の検索を実行する。 - テキストビューアにステータスバーを追加。ステータスバーに、行数、スクロール位置、文字エンコーディングを表示するようにした。 - 画像ビューアにステータスバーを追加。ステータスバーに、画像サイズ、画像フォーマット、画像モードなどを表示するようにした。 - 画像ビューアのカスタマイズ機能を追加 (実験的) config.py の configure_ImageViewer() を呼び出す。
1 .54 - 2008/08/10 - インクリメンタルサーチにMigemoを使用できるようにした。(設定メニュー2) - 画像ビューアのステータスバーにズームポリシーと倍率を表示するようにした。 - 画像ビューアのデコード処理が多数キューイングされたときに、すこし挙動がおかしいのを修正。ひとつずつデコードするようにした。 - 画像ビューアでズームインしたとき、画像がステータスバーの上に重なってしまうのを修正。(1.53で混入した問題) - 画像ビューアのリサイズ時に、ステータスバーの文字が上方に残ってしまうのを修正。(1.53で混入した問題) - 画像ビューアのズームポリシーがオリジナルモードのとき、ウインドウのリサイズ時にステータスバーが追従しないのを修正。(1.53で混入した問題)
キーバインドをあふ互換に出来るようにして欲しいな
早くメジャーなソフトになって欲しい
1 .55 - 2008/08/18 - ファイルリストのタイムスタンプとファイルサイズの表示On/Off機能を追加 (設定メニュー) - ヒストリとブックマークを、DEL キーで削除できるようにした。 - 補完候補ウインドウで DEL キーを押したときに候補を削除するようにした。 - ログペインのサイズ変更時、ログの可視領域の下端を基準にスクロール位置の調整をするようにした。これまでは上端を基準にしていた。 - 垂直セパレータの太さと色を調整。 - クリップボードにコピーしたテキストの改行コードが LF になっていたので、CR+LF になるように修正。 - コマンドラインのファイル名補完の動きがおかしいのを修正 - メディアの入っていないドライブを選択したときのエラーメッセージが変だったのを修正。 - Migemo の辞書ファイルのパスが相対パスだったので、絶対パスに変更。 - 仮想ディレクトリなどに対して、ディレクトリ比較を適用しようとしたときに、露骨なエラーが発生していたのを修正。無理な場合は、その旨を表示するようにした。 - コンテキストメニューを出すときの Python インタプリタのブロックを解消 - テキストビューアと画像ビューアのタイトルバーのアプリケーション名部分が、[ 内骨格 ] のままカスタマイズが効いていなかったのを修正。
毎回ウゼェ
まじレスすんな、ボケ
これから内骨格を使っていこうと思っているのですが、キーコンフィグのやり方がわかりません 複雑なことをするつもりはありませんので、誰か親切な方、config.pyにどう書けばキーの機能を入れ替えられるか教えて頂けませんか?
pythonの基本的な文法は自分で勉強してくれ。
それを前提の上で説明する。
_config.pyの57行目のようにconfigure関数の中で
window.keymap[ KeyEvent(ord('X'), MODKEY_SHIFT) ] = command_ProgramMenu
みたいにすると、シフトキーを押しながらXキーを押した場合にcommand_ProgramMenuという関数を呼ぶ動作が設定される。
標準で用意されている主な関数は
>>232 の1個めのサイトにまとまってる。
それ以外の関数については内骨格のソースを見ないと駄目。
cfiler_main.pyの1360行目あたりから標準のキー割り当てが並んでる。
素早いお返事ありがとうございます 見よう見まねでconfig.pyに書き込んでみたところ関数が見つからないと表示されたので、先ほどの質問をさせて頂きました くだらない質問に答えて頂いてありがとうございます
上記の例ではcommand_ProgramMenuはconfigure関数の中で定義されてるから
= command_ProgramMenuとそのまま代入してるけど、
>>232 に載ってる関数は = window.command_JumpList みたいに window. を付けてやらないと参照できない。
関数が見つからないって理由はこれかもね。
他PCのフォルダを開く方法を教えてください Shift+Jで\\IPアドレスだと無理でした
\\IPアドレス \\pc名 は移動失敗する。 \\IPアドレス\フォルダ名 \\pc名\フォルダ名 みたいにしないと駄目。
おお、出来ました ありがとう でも、この辺りは自動表示してくれるあふの方がいいですね
>>265 返事が遅くなりました
その通りの理由で、無事キー割り当てができるようになりました
ありがとうございます
大したことをするつもりがなくても、このファイラを扱うためには少しpythonを勉強する必要があるみたいですね
少しずつ進化してくのが楽しいね
誰か内骨格の起動パスの変数知りません? あふで言うところの$V"afx"とか%afx%とかなんですが
cfiler.exeのフルパスはsys.argv[0] cfiler.exeのあるフォルダが欲しければos.path.split(sys.argv[0])[0] ↓みたいな関数を用意しておくと便利かも。 cfiler_path("hoge")で (cfiler.exeのあるパス)\hoge が得られる。 def cfiler_path(rpath): os.path.join( os.path.split(sys.argv[0])[0], rpath )
273 :
272 :2008/08/26(火) 11:41:09 ID:8BQO+7//0
returnが抜けてた。 def cfiler_path(rpath): return os.path.join( os.path.split(sys.argv[0])[0], rpath )
まとめwikiってないの?
気に入ったけど,, アーカイブ展開したての初回起動なのにメモリ17MB消費とかww 作者さん、もう少し消費メモリ抑えてください
全体的な動作が速ければ、いくらメモリ食ってもいいわ。と言っても1GBくらいまでなら。
内部でPythonエンジン使ってるからしゃーない
http://sites.google.com/site/craftware/cfiler 1 .56 - 2008/09/12
- 設定メニュー2に、[ config.py をリロード ] を追加。
- 設定メニューのサブメニューを閉じたとき、上位階層のメニューに戻るようにした。
- Grepダイアログと、テキストビューアの検索ダイアログの状態を、ダイアログをキャンセルで閉じたときも保存するようにした。
- ほとんど使われない .ogg ファイルのサポートをやめて、Audiere を使用しないようにした。
- ファイルリストの取得をするNative関数が、PythonインタプリタをのGILを長時間ロックすることがあったのを修正。
- ファイルリストの取得時にメモリリークしていたのを修正。
- Alt+↑↓でログペインのサイズを変えようとして、それ以上大きく/小さく出来なかったときでも、必ずスクロールしてしまうのを修正。(1.55で混入した問題)
ええええーー ogg演奏できるのが便利だなーって思ってたのに
単に外すだけじゃなくてextensionにしてconfig.pyにちょっと追加すれば使えるような状態にしてあればよいのに。
だいぶ使いやすくなってきたよねー intypeと内骨格の組み合わせがかなり気に入ってる(intypeにソースツリーがないから) sconsとgitの操作を内骨格からできるようにちまちま拡張していけば結構シンプルな開発環境になりそうだ
作者さん 要望を聞いてください ・画像表示はSuise-Pluginを利用してください ・メディアの再生機能は省いてください ・CraftLaunch/EXを一緒に(統合)しないでください ・Jamp/Findなどの機能はCraftLaunch/EXでやっているんで削ってください ・付加的な機能(GmailFS等)はプラグイン形式にしてください ・'あふこまんど'みたいなのを作ってください ・軽くしてください 以上おねがいです 上記の点でなかなかあふから乗り換えられません。
と、書いたあとに更新発見!! 1 .57 - 2008/09/15 - Grep / Search 機能を使って列挙した、ディレクトリ名付のファイルリストを使ってコピーや移動を行う際、平たくコピー/移動する機能を追加。コピー直前に確認ダイアログを表示するようにした。 - Grep / Search 結果 から ディレクトリアイテムを移動する際に、移動元のディレクトリの削除に失敗するのを修正。 - 起動直後に開かれるディレクトリの読み込みをサブスレッドで行うように変更し、起動時のウインドウが出るまでの時間をを若干短縮した。 - フォントのリストアップ処理でメモリリークしていたのを修正。 - ファイルのコピー、移動、削除で、処理が終わったアイテムは、選択を解除する。 - バックグラウンドでファイルの削除をしている間に、フィルタを変更すると、削除処理に使われるフィルタも変化してしまっていたのを修正。 - バックグラウンドでディレクトリ比較をしている間に、違うディレクトリに移動すると、エラーになってしまうのを修正。 - バックグラウンドでアーカイブを作成中に、違うディレクトリに移動すると、正しくアーカイブが作成されていなかったのを修正。 - バックグラウンドでアーカイブを展開中に、違うディレクトリに移動すると、正しくアーカイブが展開されていなかったのを修正。
ところで、作者ってここを見てるんだろうか。
>>285 どうせでかいインタプリタが乗ってるので削っても限界あります。
動作が軽快にして欲しいというのはありますが、機能は削らなくても結構です。
柔らかい要望ってことで、透過ウィンドウおよび背景画像の半透明表示が欲しいなー ところでpopen4経由でscons呼べるようにしてみたんだけど(shellexecuteは子画面開けちゃうから)、 soconsから呼んでるbuilderが吐いたエラーがログペインに乗ってこないなー 内骨格はたぶん悪くないけどなんでだろ cmd.exe上でscons呼び出すとちゃんとメッセージ出てるんだけどな
>>289 shellExecuteじゃなくて、window.subProcessCall()を使えば、
ログウインドウにリダイレクトできるよ。
config.pyのcommand_Substで使われてるから、
見てみるといいかも。
>>290 それは知らなかったありがとう
popen4で標準出力とエラー出力を読んで、一行ずつprintしてログペインに書いてってやってたんだけど、
>>289 の問題がなかったとしても、処理が終了してから一度にログペインに反映されるって動きになっちゃう問題があったんだった
window.subProcessCall()ならそのへんうまいこと処理してくれるかな
試してみる
292 :
「手段を選んでいるいとまはない。」 ◆8RHckg48Fc :2008/09/16(火) 18:43:35 ID:wuaghSqoO
あふとは違うのだよ、あふとは
293 :
名無しさん@お腹いっぱい。 :2008/09/17(水) 02:52:48 ID:GyH9dT990
あふとは違うのだよ、あふとは
あふとは違うのだよ、あふとは
http://sites.google.com/site/craftware/cfiler 1.58 - 2008/09/16
- ブックマークのリストを出す際に、現在のディレクトリ以下のブックマークのみに絞り込んで表示する機能を追加。
- pysvn をインストールしなくても、Subversionフィルタが使えるように、デフォルト設定ファイルを変更した。
- デフォルト設定ファイルに、イメージビューアのカスタマイズ例を追加。
- 内骨格が、最大化オプションつきで起動されたときに、エラーログが出力されていたのを修正。
- オープンに失敗する壊れた画像をビューアで開こうとしたとき、露骨なエラーが出力されていたのを修正。画像ビューアのステータスバーに、エラーメッセージを表示するようにした。
- ReadOnly属性付のファイルのタイムスタンプを更新するときにエラーになってしまうので、ReadOnly属性をいったん解除するようにした。
- 選択されているファイルアイテムの配列を、簡単に取得する関数を追加。
MainWindow.leftSelectedItems()
MainWindow.rightSelectedItems()
MainWindow.activeSelectedItems()
MainWindow.inactiveSelectedItems()
- カーソル位置のファイルアイテムを、簡単に取得する関数を追加。
MainWindow.leftCursorItem()
MainWindow.rightCursorItem()
MainWindow.activeCursorItem()
MainWindow.inactiveCursorItem()
ディレクトリの内容を降順でソートしたいときってどうやるの?
>>287 こんな感じ
class sorter_ByNameRev:
def __call__( self, left, right ):
if left.isdir() and not right.isdir() :
return -1
elif not left.isdir() and right.isdir() :
return 1
return -cmp( left.name.lower(), right.name.lower() )
class sorter_ByExtRev:
def __call__( self, left, right ):
if left.isdir() and not right.isdir() :
return -1
elif not left.isdir() and right.isdir() :
return 1
cmp_result_ext = cmp( os.path.splitext(left.name)[1].lower(), os.path.splitext(right.name)[1].lower() )
if cmp_result_ext : return cmp_result_ext
return -cmp( left.name.lower(), right.name.lower() )
>>298 続き
class sorter_BySizeRev:
def __call__( self, left, right ):
if left.isdir() and not right.isdir() :
return -1
elif not left.isdir() and right.isdir() :
return 1
return -cmp( left.size(), right.size() )
class sorter_ByTimeStampRev:
def __call__( self, left, right ):
if left.isdir() and not right.isdir() :
return -1
elif not left.isdir() and right.isdir() :
return 1
return -cmp( left.time(), right.time() )
window.sorter_list += [
( u"G : ファイル名(逆順)", sorter_ByNameRev() ),
( u"R : 拡張子(逆順)", sorter_ByExtRev() ),
( u"D : サイズ(逆順)", sorter_BySizeRev() ),
( u"Y : タイムスタンプ(逆順)", sorter_ByTimeStampRev() ),
]
インデントは適宜推察して。 というか基本的にcfiler_filelist.pyの1290行目あたりからのsorter_By*をコピーして クラス名の後ろにRevをつけて、__call__関数の最後のreturnの符号を変えただけ。
どうもありがとう 手に馴染み始めてきたなー
http://sites.google.com/site/craftware/cfiler 1.59 - 2008/09/21
- Migemoでのインクリメンタルサーチ時に、ステータスバーには正規表現ではなく、一致したファイル名の一部を表示するようにした。
- Migemoでのインクリメンタルサーチ時に、英単語のカタカナ表記が正しく検索できていなかったのを修正。
( 例 : SaisinSoftware -> 最新ソフトウェア、など )
- ネットワークアップデートのためのバージョン情報の取得時に、プロキシのキャッシュを使って誤判定することがあったのを修正。プロキシのキャッシュを使わないようにした。
- ファイルのコピー、移動、削除で、処理を中断したときに、処理中のアイテムの選択を解除していたのを修正。処理が中断されたアイテムは選択を解除しないようにした。
- [平たくコピーしますか?]のダイアログをキャンセルしたとき、コピー処理自体をキャンセルするべきだったので、そのように修正した。
- ログを大量に出力している間に、ログペインのサイズを変更すると、エラーが発生することがあるのを修正。
- コマンドラインのコマンドとして、メモリの統計情報を出力する "MemoryStat" を追加。(デバッグ目的)
- Subversionフィルタの改良。svnで管理されていないディレクトリは、その親ディレクトリがsvnで管理されているときは非表示にし、そうでない場合は表示する。
イメージビューアがメインウィンドウの上にかぶるのがうざいので少し調べてみたら cfiler_imageviewer.ImageViewerの生成オプションで親ウィンドウを0にしてやれば 独立したウィンドウになることがわかった。 あとは表示中の画像サイズにウィンドウをフィットさせる処理を書きたいんだけど、うまくいかない。 生のウィンドウサイズはgetWindowRectで得られるけど、 setPosSizeで指定するサイズは生のサイズじゃない。 getCharSizeで得られる文字サイズが絡んでるのはわかるんだけど、 生サイズ/文字サイズってわけではなくてよくわからん。
うまくいかないってのはフィットさせるたびにサイズが小さくなっていくことだったんだけど、 よくわからんけどwindow.fit = Falseとしておけば大丈夫だということがわかった。 とりあえずこんな感じのをconfigure_ImageViewerの中で定義してやれば現在表示中の画像サイズにウィンドウサイズを調整出来る。 def command_WindowFit(): x, y, w, h = window.getWindowRect() iw, ih = window.img.getSize() cw, ch = window.getCharSize() iw *= window._zoom ih *= window._zoom w = int(round(iw/cw)) h = int(round(ih/ch))+1 window.fit = False window.setPosSize(x,y,w,h,0)
cfiler_imageviewer.ImageViewerの生成オプションを弄らなくても configure_ImageViewerでwindow.main_window = 0ってしてやれば独立ウィンドウになるみたい。 TextViewerのほうも同様。
↑勘違いだったorz
MainWindow.image_file_ext_listに".psd"もあるから一応psdに対応したつもりなんだろうけど、 exeの中にはPsdImagePlugin.pyoが入ってないからデコードに失敗する。 PILのPsdImagePlugin.pyをextensionフォルダに入れてやれば再起動後に表示できるようになる。
http://sites.google.com/site/craftware/cfiler 1.60 - 2008/09/24
- Grep / Search / Compare などで作られたファイルリストのディレクトリ名部分には、それぞれ [grep] [search] [compare] というプレフィックスを付けるようにした。
- Subversion フィルタの修正。grep 結果など、アイテムの名前にディレクトリ名が含まれる場合に、Subversionフィルタで除外されてしまっていた。
- アップデート後の再起動で、前回の起動時の状態で起動してしまうのを修正。前回の終了時の状態で起動するようにした。
- ウインドウを最大化した状態で終了させた後、次回起動時のウインドウサイズを通常のサイズになるようにした。
- ウインドウを最小化した状態で終了させたとき、次回起動時にウインドウが見えなくなっていたのを修正。
- ウインドウを最大化したときに、ウインドウの右端と下端の隙間が、左端と上端に比べて太ってしまうのを修正。上下と左右を均等に太らせるようにした。
- APIリファレンスのために、ソースコードにdoxygen用のコメントを埋め込んだ。
ctermcore.cppのWindow::_createFont()でクラッシュするんだが…… 典型的な1個外れのエラーっぽい ---------------------------------------- - int * char_width_table = (int*)malloc(0xffff*sizeof(int)); + int * char_width_table = (int*)malloc(0x10000*sizeof(int)); GetCharWidth32( hDC, 0, 0xffff, char_width_table ); :
ああそれと、ctermcore.cppでvfw.hを#includeするまえにwindows.hを インクルードしてほしい #include <algorithm>も必要 これらを直さないと、標準環境であるVC++7.1でビルドできない
1.61 - 2008/09/26
- フォントの初期化処理で、メモリが破壊されて、場合によっては落ちてしまうのを修正。
- API リファレンスのためのコメントを拡充した。
>>310 の修正みたいですね。
313 :
309 :2008/09/27(土) 23:32:46 ID:bj+5ZIrZ0
SusieプラグインはSPI処理するpyd作って imageviewerのソース勝手に弄って使ってる。 Pythonから直でDLLやC互換の構造体使えるのは知らなかったんで >313 のソースは勉強になりました。
315 :
313 :2008/09/28(日) 19:30:29 ID:2AcXB2o90
ちなみに、パレットとかの扱いがわからなかったので、
インデックスカラーとかグレースケール画像には対応してません。
16, 24, 32bitカラーのものに対応してます。
>>314 作ってるんだったら公開してくれ。w
316 :
314 :2008/09/29(月) 06:40:16 ID:ErwyCzJq0
317 :
314 :2008/09/29(月) 06:53:43 ID:ErwyCzJq0
319 :
315 :2008/09/30(火) 02:08:06 ID:86k80yJd0
内骨格で開いてるフォルダの中身をエクスプローラで弄っても更新されないし、 両方に同じフォルダ開いて新規フォルダを作っても逆側には作ったフォルダが表示されない。 内骨格って定期的に読み込み直すとかしないの?
DirectShow版のミュージックプレイヤー書いてみた
http://codepad.org/texvdWLA DirectShowなんで、DirectShow用のコーデック入れれば
何でも再生できると思う
config.pyのconfigure()の中で
window.musicplayer = MyMusicPlayer(window)
とかやるとこっちが使われる
再生したい拡張子は、同じくconfigure()の中で
MainWindow.music_file_ext_list = (
'.wav', '.mid', '.mp3', '.ogg', '.m4a')
とか(お好みで)設定するとよさげ
超怪しいんで、使う場合は自己責任でおながい
WMPでは再生できるのにDirectShowでは再生できないmp3ファイルがあるなぁ。 GraphEditで開いてみたら適切なフィルタが見つからないって事みたいだけど、なんでだろう? mp3ファイルが全部駄目ってんならわからないでもないけど、再生できる物もあるんだよね。
>>322 それはちょっとわからんね
俺の環境でDirectShow Filter Toolで見てみると
MPEG-1 Audio Decoderではffdshow Audio Decoderが一番優先度高くなってるけど
デコーダは同じくffdshowのが優先度が高くなってる。 問題はスプリッタの方みたい。といってもMPEG-1 Splitterには標準のMPEG-I Stream Splitterしかないわけだが。 GraphEditで再生できるmp3とできないのを両方ともFile Source(Async)でフィルタ追加して、 MPEG-I Stream Splitterと接続してみると、再生できる奴はきちんと繋がるんだけど、 駄目な方はこの時点で繋がらない。 mp3ファイルの構造に何か特徴があるのかもしれんけど、良く解らん。 まぁ、外部プレイヤーで再生すれば良いだけだから特に困るわけではないけど。
どうもID3タグが原因っぽい。 ID3 v2.4形式だとほぼ全滅。v2.2はOKっぽいけど駄目な物もある。 本来スプリッターが解釈できない形式だけど、 うまい具合にスルーされるようなデータの並びだった場合は再生されるってことなのかも。
DirectShow ID3v2でぐぐると
>>326 の他にも色々出てきますね。
適当なスプリッタを入れてDirectShow Filter Toolで優先度を弄ればよいって事なんでしょうけど、
外部プレイヤーで再生するほうが面倒が無くて良いですね。
軽 く し て く れ
どの辺が重いと感じてる?
メモリ消費量の話だよ ノートに2GBしか積んでないから約20MBも消費してもらったら困るのだよ(・ω・`)o エクスプローラが30MB消費してて嫌っているのに内骨格まで,,,
>>330 2GB積んでて20MB程度の消費を気にするって、どんな使い方してんの?
ウチは2.5GB積んでるけど、Web、FTP、SMTP、RDBMS2種、各種チャット鯖等動かしていて、
さらにチャットツール10プロセスくらい、セキュリティ系数種、ランチャー等ユーティリティをいくつか常駐してても
メモリ消費が1GB超える事は滅多に無いんだが。
フォトショップとかメモリ喰いまくるツールを常用してるって事か?
cfiler_main.pyを弄らないとどうにもならないような変更をしたい場合は
ソースを弄ってpy2exeでビルドしないといけないけどビルド環境を整えるのが面倒。
py2exeはメインスクリプトだけをexeに入れてあとはzipファイルに入れることができて、
cfiler.exeはzipファイルとしても読み込めるようなので、
extension/cfiler_main.py(のmain関数)を呼び出すような構成のexeファイルを作ってみた。
http://www-2ch.net:8080/up/download/1223624618976031.QBXxNZ cfilerx.exeとextensionフォルダを内骨格のフォルダにコピーしてcfiler.exeの代わりに
cfilerx.exeを実行すればOK。
cfiler.exe内蔵のモジュールよりもextensionフォルダのが優先してインポートされるので
cfiler_*.pyの改造には便利だと思います。
333 :
330 :2008/10/12(日) 02:59:29 ID:jgl5K68fO
>331 Adobe CreativeSuite CS3, Visual Stadio 2005 Professional,同2008 Professional, Office2003 Professional,同2007 Professional だいたい重そうなのはこれら 入れすぎたせいかOS起動時間が17秒→35秒と倍以上になった メモリ使用率は起動直後使用0.64GB 空き1.22GBとなってるけど 上記5つ起動すると使用1.79GB空き0.09GBとなる 90MBしかないメモリーで20MB使われたらたまらん
ヤツあたりだなそりゃ 全然内骨格のせいじゃないじゃん だいたい90MBも70MBも大して変んねえだろ PCの使い方が間違ってる
90MBでAdobe CreativeSuiteとかVisualStudioとかアホかw
336 :
335 :2008/10/12(日) 08:45:11 ID:vZGKmrF00
よく読んでなかったすまん
>>333 他のファイラに比べて、あからさまにメモリ喰うとかだったらまだしも、
この場合、どう考えても、金出して買った商品のほうに依頼だすべきだろ。
しかも、挙げたツールを全部一度に起動して常用するなんて事がありえない。
作者さんも、こんなレス見たら不愉快になるわ。
>>333 ニーズにあってないなら、他のファイラー使いなよ。
もっと使用量少ないファイラーなんていくらでもあるんだからさ。
>>333 それらを「同時に」使わなければならない理由が俺には全く分からないのだが
何でバージョン違いのVSやOfficeを同時に起動しておく必要があるんだよ
VS入れてるってことは開発すんのか?
開発者とは思えないほどアホだな
まあまあ皆さん落ち着いて 内骨格がいろんな考え方の人に使われるようになって来ているということですよ ユーザーが増えることが最も重要
http://sites.google.com/site/craftware/cfiler 1.64 - 2008/10/12
- 履歴ジャンプウインドウ、ブックマーク選択ウインドウ、音楽プレイリストウインドウで、インクリメンタルサーチを使えるようにした。
- ソート方法を選択するとき、Shiftを押しながら決定すると、降順になるようにした。
- UNC形式パスの共有名部分 ( \\servername\share\dirname の share の部分 ) を補完する処理を追加。
- リストウインドウをカスタマイズ出来るようにするため、config.py の configure_ListWindow() を呼び出すようにした。
- MainWindow.editor に 呼び出し可能オブジェクトを設定しているとき、設定メニューから [ config.py を編集 ] がエラーになっていたのを修正。
- cfiler.exe に バージョン情報を埋め込むようにした。
- 画像ビューアで .psd と .tga がデコードできていなかったのを修正。
- cfiler.ini ファイルの読み書きが、プロセス間で同時に起こってしまう可能性があったのを修正。
- 各種リストウインドウの最大サイズが、メインウインドウより少し小さくなるように調整。
- インクリメンタルサーチの背景のグラデーション模様の上端が目立つように少し調整
勝った!(何が? あふスレに自慢しにいこー
1 .66 - 2008/10/13 - 1.65でiniファイルをutf8にした影響で、フォントがカスタマイズされなくなってしまっていたのを修正。 - 拡張子に非ASCII文字が含まれているときは、分離表示しない。 1 .65 - 2008/10/13 - 音楽再生中、ステータスバーの右端に、再生位置を表示するようにした。 - Musicプレイヤウインドウの Ctrl + ←/→ で、再生位置をシークするようにした。 - 音楽プレイヤの最後の状態(プレイリストと再生位置)を記憶し、再起動後に復活させるようにした。 - 比較選択ツールに、もう片方のペインで選択されているアイテムを選択する機能を追加 - テキスト差分ウインドウに、ステータスバーを追加 - テキスト差分ウインドウをカスタマイズ出来るようにするため、config.py の configure_DiffViewer() を呼び出すようにした。 - 指定したパスにジャンプする関数を追加。 MainWindow.leftJump() MainWindow.rightJump() MainWindow.activeJump() MainWindow.inactiveJump() - いくつかの処理の間のプログレスバーを、2段表示にした。 - 1.64 の変更で、初めての起動で ini ファイルが存在しないときに、起動できなくなっていた問題を修正。 - ini ファイルの文字エンコーディングを S-JIS から utf8 に変更。UNICODEでしか表現できない文字を含むパスが、履歴やブックマークに残らない問題あったのを修正。
乙
俺しか使ってねーと思うけどDirectShowメディアプレイヤーを1.65仕様に追従した
http://codepad.org/7R9idMQS 使う場合はconfigure()ん中で
cfiler_musicplayer.MusicPlayer = DSMusicPlayer
とかやって、クラス自体を置き換えるしかなさげ
1.67 - 2008/10/14 - UNC形式のパスで、必要に応じてネットワーク接続のユーザー名とパスワードの入力ダイアログを表示するようにした。 - 比較選択ツールのウインドウは、先頭文字の入力で即時決定するようにした。 - ディレクトリ比較ツールのウインドウは、先頭文字の入力で即時決定するようにした。 - ディレクトリ比較で、アクセスできないファイルなどがあったときに、露骨なエラーが表示されてしまうのを修正。
>>345 クラスの置き換えだったらSongMCIをSongDirectShowで置き換えても良いんじゃない?
>>347 ああ、確かにそうだなあ
そっちのが手っ取りはやいね
>>1 からこのスレ見てきたら成長具合がすさまじくて正直惚れた・・・///
ちょっとあふから浮気しちゃいそうな・・・・あぁっ!!ダメっ!!わたしったら・・・
あふに比べると画面のチラツキが少ないところがいいね
ジャンプリストで頭文字がUのフォルダを登録すると呼び出した時にリストが空白になってしまう。 例) D:\User E:\U E:\hogehoge\U これってどうすれば登録出来るかなぁ?
\を、\\か/にしないといけない
もしくはrを頭に付ける。 r"D:\User" 全角文字がある場合はur。 ur"E:\ドキュメント"
http://sites.google.com/site/craftware/cfiler 1.68 - 2008/10/15
- デフォルト設定ファイルのコマンドラインの設定に "SelectEmpty" コマンドを追加。このコマンドを実行すると、アクティブなペインのディレクトリのうち、空のものを選択する。
- UNC形式のパスをつかったコピーや移動処理のあとの再読み込みで、操作不能になっていたのを修正
- ディレクトリ区切り文字をスラッシュに設定していると、UNC形式のファイルに対して Ctrl-Enter を使うことが出来なかったのを修正。
355 :
351 :2008/10/15(水) 16:48:31 ID:Hp9xrBxM0
なんか過疎ってる? とりあえずイメージビューワでデフォルトのfitモードでも 画面サイズより小さい画像は拡大しないようにするコード (config.pyに記述) def configure_ImageViewer(window): original_reset = window.reset def reset(): if window.zoom_policy == "fit": img_size = window.img.getSize() client_rect = window.getClientRect() offset_x, offset_y = window.charToClient(0, 0) char_w, char_h = window.getCharSize() area_size = (client_rect[2] - client_rect[0], (window.height()-1)*char_h + offset_y) if img_size[0] < area_size[0] \ and img_size[1] < area_size[1]: window._zoom = 1.0 window.fit = False window.pos = [0,0] else: original_reset() window.reset = reset zoom_policy=originalでもちょっと使ってみたが、 スクロールがかなりガタガタ言って、ぶっちゃけ遅くて使い物にならんな スクロールするだけでpane一から作り直し&全再描画は、さすがに重いんだと思う
357 :
356 :2008/10/29(水) 16:46:37 ID:CXNA6QvP0
ごめん インデント多分ガタガタになってるよな おまけにちょっとミス original_reset = window.reset def reset(): if window.zoom_policy == "fit": img_size = window.img.getSize() client_rect = window.getClientRect() offset_x, offset_y = window.charToClient(0, 0) char_w, char_h = window.getCharSize() area_size = (client_rect[2] - client_rect[0], (window.height()-1)*char_h + offset_y) if img_size[0] < area_size[0] \ and img_size[1] < area_size[1]: window._zoom = 1.0 window.fit = False window.pos = [0,0] return original_reset() window.reset = reset
内骨格のリスト上のディレクトリでエディタ(や他のアプリ)をshift-xで実行して内骨格に戻ったとき、 リストを自動でリフレッシュしてくれるって機能は難しいのかな 新しくできたファイルがリストに載らないからいっぺん上のディレクトリに上がって、戻るって手順を踏んでるんだけど、 いまいちだなと思ってる
>>359 完全に自動でやりたければディレクトリ監視が必要だが、手動でいいんなら
config.pyの中で
window.keymap[VK_F5] = window.command_Refresh
とかやればいいよ
これだと(explorer風に)F5でリフレッシュするようになるが、
割り当てるキーはお好みで
どうもありがとう とりあえず手動でしのごう 内骨格のwindowにフォーカスが戻ったときのイベントでリフレッシュしてくれればいいんだと思うんだけど、config.pyじゃできないよねこれ そういえばhotokey設定して内骨格呼び出したとき、全画面表示してたのがウィンドウ表示になってしまうってのも困って(ってほどじゃないけど)る 800*600くらいで全画面表示だととすごく使いやすいんだよなー内骨格
>>361 多分cfiler_mainwindow.pyのMainWindow._onActivate()を書き換えるしかねえかな
config.pyのconfigure()が呼ばれる時点で
_onActivate()はcterm側にコールバックとして渡されてしまっているので
configure()の中で_onActivate()を再定義しても手遅れなんだよな
まあ配布物の中身を書き換えるってのもなるべくしたくないだろうし、
もっといい手があるかもしれんがな
config.pyのconfigure()の中にこんな感じのを書いて 一定時間ごとにファイルリスト更新させるというのはどうだろう。 def command_RefreshBoth(self): self.refreshFileList( self.activePane(), True, False ) self.refreshFileList( self.inactivePane(), True, False ) self.paint(PAINT_ALL) window.setTimer(command_RefreshBoth, 1000) # 1000ms ごとに第1引数を実行
365 :
364 :2008/11/03(月) 00:21:01 ID:mVyLBJ2y0
書いたけどこれはやっぱりダメだな、使わないでくれ 裏スレッドから無理やりリフレッシュさせてるんで、 場合によってはあっさりクラッシュしたりするようだ 表にメッセージをPOSTして再描画させられればいいんだが、ウィンドウプロシジャを 自由に弄れないから仕方が無いな
>>363 うーんそれはちょっと好みと外れる...
たしかAPIにディレクトリの変更通知があったよな、と思ったら
>>364 すご
と思ったけどこれ内骨格本体モロとも落ちてしまうw
最初一回ちゃんと動いた
おおと思ってもう一回やってみたら内骨格固まった
再起動したら新ファイルできる度に落ちるような
368 :
364 :2008/11/03(月) 12:54:34 ID:mVyLBJ2y0
昨日のコードだけど、内骨格が落ちてしまう原因は(何となくだが)分かった
MainWindow.subThreadCall()が再入不可で、別スレッドから並列で呼ばれると、
subThreadCall()内部で待ちに使っているメッセージループを終わらせるための
window.quit()で本当に終了してしまうようだ
cfiler_threadutilのJobQueueを使って、もう少し穏当に再描画させるコードを
書いた。これで上の問題は起きなくなるはず
それと、内骨格が実際に終了するときのフックがうまく取れない(window.quit()は
上記のように、subThreadCall()の中でも呼ばれる)ようなので、
1秒タイムアウトで監視して、IsWindow()でウィンドウが有効かチェックするようにした
ttp://codepad.org/t80s7vnv
>>368 window.command_Refresh()だとカーソルのあるほうしか更新されないから
両方とも同じフォルダを表示しておいて外部プログラムでそのフォルダにファイルを作っても
片側しか更新されない。
370 :
369 :2008/11/03(月) 15:15:18 ID:CBP0T9O30
371 :
364 :2008/11/03(月) 15:16:44 ID:mVyLBJ2y0
372 :
364 :2008/11/04(火) 19:39:16 ID:y4scTvX50
使ってみていたが、ファイルリネーム後にキーを受け付けなくなったりするな。
やはりsubThreadCall()がネックのようだ。
キーイベントはsubThreadCall()内でハンドラを摩り替えているが、
タイマは動いたままなので、UIスレッドからでもタイマ経由で
subThreadCall()実行中にsubThreadCall()に再入する可能性があり、
その場合は余裕で問題が発生する。
とりあえずsubThreadCall()前後でonTimerJob()とonTimerSyncCall()が走らないように
摩り替えるようにしてみた。
http://codepad.org/t2j940nG 今回のはextensionに入れることを念頭に書いた。
foo.pyとかいう名前で保存してextensionに入れた場合は、
configure()の中で、
import hoge
foo.start_directory_watch(window)
とかやればおk。
import hogeじゃ駄目だろw import fooだな。
374 :
364 :2008/11/04(火) 19:44:01 ID:y4scTvX50
375 :
364 :2008/11/05(水) 00:00:56 ID:y4scTvX50
ウザくてすまん
あげなおし
http://codepad.org/Df2LOmLF WaitForMultipleObjectsの最後の引数を1から500に変えた
1ミリ秒タイムアウトは無いわ……デフォの分解能だと10ミリは寝るだろうから
CPU負荷全然かかってなくて気づかんかった
手抜きPythonコンソール作ってみた
http://codepad.org/rsdkWANY 補完とか自動インデントとかカッコイイ機能はない
新たにPythonインタプリタを立ち上げるわけではないので
起動だけは爆速、ただし簡単に内骨格を道連れにできるので危険
>>358 のzipの中にあるvensterと、
http://www.scintilla.org/ で配布してるScintilla(のSciLexer.dll)に依存してるんで
まとめてextensionの中に放り込んでもらえればおk
console.pyとかいう名前で保存したら
config.pyに↓のような感じで
def command_Console():
import console
con = console.ConsoleWindow()
con.start_interp({'window': window, 'console': con})
window.keymap[VK_F3] = command_Console
start_interp()の引数は無くてもいいけど、
こんな感じでwindowインスタンスを与えてやると
コンソールから内骨格のwindowインスタンスが可視になる
なんかよさそうな拡張だねえ これipython組み込める?
>>378 すまんが、かなり弄らんと無理だと思う
ipythonは端末とコネクトされている&readline前提のはずだし
380 :
377 :2008/11/10(月) 16:12:32 ID:ryZKA2JN0
ちょっと直した
http://codepad.org/1FMoSxfh ・コピペで複数行一度に入力した場合にまともに動いてなかったんで直した
・↑↓でヒストリを行き来できるようにした
なんつうかEmacs風キーバインドに慣れてる人はごめんなさいなんだが
ScintillaのキーバインドはデフォでWin風なので
カーソルキー、Home、Endなどを使うかコードを書き換えてください
381 :
364 :2008/11/11(火) 20:40:38 ID:Mg6hT/QX0
作者さん別のもの作りだしちゃった? 倉EXと同様に内骨格も放置されちゃうのかな?
384 :
383 :2008/11/13(木) 22:45:47 ID:qnH+rrmF0
http://sites.google.com/site/craftware/cfiler 1.72 - 2008/11/15
- ファイルリストを自動的にリロードする処理を追加
- デフォルト設定ファイルに、左右のペインから重複ファイルを探すコマンド CheckDuplicate を追加。
- デフォルト設定ファイルに含まれている SelectEmpty コマンドを CheckEmpty コマンドに変更。
(バックグラウンドで処理している関係で、アイテムを選択することができない場合があるので、ログに出力するだけにした。)
- 左右のペインに含まれる全てのアイテムを返す関数を追加。
MainWindow.leftItems()
MainWindow.rightItems()
MainWindow.activeItems()
MainWindow.inactiveItems()
- 一括変名機能で正規表現のパターンの記述が間違っていたときに、エラーが発生して操作不能になってしまうのを修正。
- ウインドウのクラス名を、CtermWindowClass から CfilerWindowClassに変更。
- iniファイル中のバージョン番号が更新されていなかったのを修正。
- ディレクトリの変更のためにサブスレッド中でアイテムリストを作成している間に、ほかのスレッドがアイテムリストにアクセスしてエラーになる場合が稀にあったのを修正。
おお、作者さんがディレクトリ監視機能作ってくれたのか これで俺の怪しいコードは安心して削除できるな
cfiler_nativeに監視用の機能が追加されてるみたいです。
>>386 短い間だったけどつかってたよー
サンキュー
作者さんもサンキュー
新バージョン1.72での現象(
>>364 の拡張は外してある)
内骨格で表示してるディレクトリを他のプログラムからまるっと削除したら
[Error 32] プロセスはファイルにアクセスできません。別のプロセスが使用中です。
[Error 5] アクセスが拒否されました。
とコンソールペインに表示されて、その後キー、マウス入力を受け付けなくなった。
完全にフリーズしているわけではなくて、最小化はできるし再描画もされる。
どーも
>>372 と同じ現象っぽい。
1.73 - 2008/11/16 - ログペインのテキストを、マウスで選択してクリップボードにコピーできるようにした。 (選択するだけで、自動的にクリップボードにコピーされます。) - ログペインをマウスのホイールでスクロールできるようにした。 - Ctrl + Alt + ↑↓←→ で、すばやくセパレータを移動するようにした。 - 1.72で入れた自動リロードが原因で、操作不能になってしまうことがあったのを修正。 - 大きなサイズのバイナリファイル比較のときに、メモリ不足で失敗しないようにした。 - tgzファイルを作成するとき、日本語文字が含まれているパスに作成できなかったのを修正。
相変わらず作者さん対応速いなあ
まだ怪しい感じだな。 最小化して放置してたら、いつの間にか固まって復帰しなくなってた。 以下は作者さん宛だが。 やはりsubThreadCall()の問題だと思いますよ。 1. 現在のマウス、キーフックをセーブし、書き換える(ESCしか効かなくなる) 2. ワーカースレッドを起動し、メッセージループを回す 3. ワーカースレッドが終了すると、window.quit()を呼び、メッセージループを止める 4. 1.でバックアップを取ったマウス、キーフックに戻す といった流れですが、タイマーを止めていないので、2.のメッセージループを 回して待っている間にファイル変更が発生すると、2.の間にsubThreadCall()が 再び呼ばれてしまう。 この二番目のsubThreadCall()の流れでは、 Step1.で、無効になっているキーフックやマウスフラグを「保存」してしまう。 一番目のsubThreadCall()の後に二番目のが終了すると、4.では、 無効になっているものに「戻す」ことになってしまうわけだ。
修正来た。 1 .74 - 2008/11/18 - MainWindow.subThreadCall() のサブスレッドの中で、MainWindow.quit() を使っていたのを修正。 subThreadCall() をネストして呼び出すケースで、外側のループを抜けるつもりの quit() が、内側のループを抜けるつもりの quit() よりも先に呼ばれてしまって、(さらにSyncCallなどの合わせ技により)、メインスレッドがデッドロックしてしまう危険があった。
394のテキストビューアとか 本家に取り込んでもらうには どうしたらいいんだろう?
>>396 いや取り込んで貰っても全然構わないというか、有難い話なんだが
・2004年以降止まったプロジェクトであるvensterに対する俺俺パッチに依存
・Scintillaに対する俺俺パッチに依存
・extensionであることをいいことに、カスタマイズ機能なし(スクリプトの中
直接弄ってねの世界)
という怪しい代物なので、どうなのか
正式配布物に含めるんなら、色々作者さん手直しいると思うわ
作者さんには是非取り込んで貰いたいなー 拡張が細かく大量に増えてしまったり現時点で派生版が出来てしまったりするとちょっとね・・・
>>399 これ使うとあふみたく倉から使えるようになるの?
拡張ってアップデート毎にconfig.pyを修正していくのでしょうか? 簡単なものでいいからconfig.py configure末尾辺りに ユーザ設定呼び出しのSTUBが欲しいです。 try: import user_config except ImportError: pass else: user_config.congigure(window)
>>403 ちょっち意味わからん。
俺は内骨格がバージョンアップしても、
config.pyをいちいち入れ替えずに同じものを使い続けてるよ。
>>404 readme.txtに記述見つけました。
バージョンアップでconfig.pyが更新(上書き)される事があるのだったら、
ユーザ設定とわけた方がいいのではないかなと思ったのだけど、
初回起動時にのみconfig.pyが作られるようなので、杞憂だったみたいです。
よく見ると組み込みの設定はEXE内で、
config.py自体がユーザ設定ファイルだったんですね。
あれ、でも _config.py が更新されているような気がする。 diff 取ってみると config.py に変更した覚えのないコードが _config.py にありました。
そりゃ_config.pyは何回か更新されてるし。
>>407 ということは、_config.py の更新をconfig.pyへ反映するのはユーザの手作業?
>>408 差分を反映する必要は全く無いよ
config.pyはあくまでユーザのカスタマイズ用のスクリプトで、
_config.pyはただのサンプルでしかないんだから
>_config.pyはただのサンプル config.py/_config.pyのファイルの運用のされ方について もし、config.pyが標準で何もしないのならそれでもいいのだけど、 _config.py に機能追加の更新があり、尚且つそれが初回起動時のconfig.pyになるようなので 自動更新と、後のバージョンからインストールした場合で デフォルトのconfig.pyの状態が変わってしまわないか、という懸念があります。 自動更新した人は、_config.pyの追加設定を手作業でconfig.pyに反映しないといけないのに対して、 後のバージョンからインストールした人は、標準で機能追加後の状態から開始することになります。 config.pyはユーザ・カスタマイズ設定なので、環境によって違うのは勿論当然ですが、 それでもデフォルトの、ユーザが設定を弄っていない状態での差異が出るのは、 同じバージョンなのに、標準で あれが出来た・出来ないという状態が出来るので、 ソフトを保守していく上では好ましくないんじゃないかなと思います。 インストール時のバージョン/現在のバージョンで機能/動作が異なる可能性が出てくるため バグ報告等にはインストール時のバージョンと現在のバージョンが必要になる。-> メンテナンス・コスト増に繋がります。 ↑はワースト・ケースのシナリオなので、実際には…少なくとも現時点では、それ程影響はありませんが、 運用で簡単にカバーできる事なので、検討をお願いしたいです。 具体的な対策としては、ユーザ設定とアプリの更新範囲の完全な切り分けで、二つ程方法を挙げると。 a. デフォルトのconfig.pyは、何もしない。ただ呼び出されるだけに留める。 b. config.py から別のユーザ設定を呼び出す。 ユーザとして利用してる分には、 - config.pyは更新時に上書きされないので、ユーザ側で編集しても問題ない - _config.py更新時の差分は、必要ならconfig.pyに持ってくきて編集 で、とりあえずは問題ないようなので。返答を下さった方、ありがとうございました。
411 :
名無しさん@お腹いっぱい。 :2008/12/18(木) 17:27:50 ID:ttqEKvgp0
あふとは違うのだよ、あふとは
>>410 それはその通りだと思う
内骨格のコンセプトがあんな感じである以上作者さんも煮詰め切れてない部分があるんだろうね
作者視点で言うと、 ・いままで使ってるユーザーを、設定をいきなり変えることでびっくりさせたくない(←あたりまえ) ・でも新規ユーザーには推奨の設定で使ってほしい(←そういうときもあるよね) ってのは、アプリケーション作ってるとよく出会う場面だよ。 自分も経験あるけど、どんな新機能がつくかなんて作者でも予測できないもんだよ
半月ぐらいレスついてなかったのに急にレスが増えたな 何かあったんかw
今北産業 あふとの違いなんだ? あふから乗り換える意義はあるのか?
>>415 そんなことを聞く奴には向いてない。
おまえはあふを使い続けた方が良い。
>>415 違いは色々あるが、Pythonというインタプリタ言語で拡張可能なのが最大の違い
というか、内骨格自身がPythonインタプリタ上で走っている
シャレで内骨格をPython2.6で動かしてみた。 pydとか全部自分でビルドしないとダメなのであまりお勧めは出来ない。 気づいた点。 1) md5モジュールの代わりにhashlib使えと文句を言われる。 2) 俺の環境だけかもしらんが、tar.gzの閲覧に失敗する。 cfiler_filelist.pyの lister_Tar.__call__()の中で、 if names[-1]: # print "name[%d]=%s" % (-1,names[-1]) child = ArchiveNode( ( names[-1], info.size, time.localtime(info.mtime)[:6], info.isdir() and cfiler_misc.FILE_ATTRIBUTE_DIRECTORY or 0) ) current_node.children[ names[-1] ] = child こんな感じに変えてやると上手くいった。要は、パス名の最後の部分の ノードを作るときに、0決め打ちだったのを、ディレクトリかどうか見るようにした。 正直なんでこれが2.5/2.6で関係あるのか分からんが、こうしないと2.6では 動かなかった。 3) これは2.6関係ないけど、cfiler_mainwindowの leftJump()の中でself._jump()に渡してる引数足りてないですね。
あっふでーとこけた
ランタイム入れたら起動しました
作者さんは3.0にはどれくらいに対応する予定なんだろうか。
3.0になったらconfig.py他ユーザが書いたコードも書き直しだから ちょっとな
423 :
名無しさん@お腹いっぱい。 :2009/01/16(金) 13:12:42 ID:9nurCy3E0
いつの間にか Python2.6対応? python26.dll が入ってた。
>>418 追っかけてみた。
原因は、tarfileのバージョン、info.name の文字列の扱いで。
以前は、ディレクトリは foo/ と区切り文字が末尾に付いていたのが、
2.6のtarfileでは付かなくなった為。info.name をsplitした後の値が異なる。
(変数 names が 2.5 で ['foo',''] だったのが 2.6 では ['foo'] となる)
tarfileのバージョン
python2.5 - tarfile 0.8.0
python2.6 - tarfile 0.9.0 (will backport to 2.5) らしいので、将来の 2.5.x でも問題になりそう。
おお、乙 以前は作者さんこのスレ見てたっぽいけど 今は見てねーのかね 過疎ってるからなぁ
>python3.0対応 ユーザ数やコード量が増えるにつれて、移植コストは増大するので、 バージョンアップには積極的になるべきだと思う。 今すぐ対応のは(周辺ライブラリの対応状況があるので)無理だろうけど。 2.6 -> 3.0 への移行は2to3ってツールがあるので、 config.pyの書き直しは*思ったほど*多くはない。(経験上) python使いでないユーザの人達には、混乱を強いる時期が来るかもしれないが、 その辺はサポートでカバーするしかないんじゃない?
>>233 ,
>>362 辺りの興味ありそうな話題を振ってみる。
元コードを変更しないで、config.py内で出来る方法。簡単そうなのを。
_original_on_activate = window._onActivate.im_func
def _on_activate(self, active):
_original_on_activate(self, active)
......
window._onActivate.im_func.__code__ = _on_activate.__code__
C のコンストラクタに渡っているのは、入れ物(instancemethodオブジェクト)なので
その中身(関数オブジェクト内のコード・オブジェクト)だけ入れ替えるアプローチ。
注意点は、_on_activateが呼び出されるときのコンテキストは MainWindow._onActivateが定義されてる場所になるので、
登録する関数のスコープでのグローバル変数やclosure等、外側のスコープのオブジェクトの利用は出来ない。
※ 出来るけど、更に面倒な手続きが必要な上、MainWindowへの副作用が心配。関数内で新たにimportする方が無難。
429 :
428 :2009/01/18(日) 07:24:17 ID:PWZ+MY420
自分で注意書いて忘れてた。 この_original_on_activateの呼び出しは無理なので、 グローバル変数の利用法も兼ねて修正。 from types import FunctionType _onActivate = window._onActivate.im_func _original_on_activate = FunctionType(_onActivate.__code__, _onActivate.__globals__) def _on_activate(self, active): _original_on_activate(self, active) # your code _onActivate.__code__ = _on_activate.__code__ _onActivate.__globals__['_original_on_activate'] = _original_on_activate
430 :
428 :2009/01/18(日) 08:27:38 ID:PWZ+MY420
透過window import ctypes def make_transparent(hwnd, alpha): GWL_EXSTYLE = 0xffffffec WS_EX_LAYERED = 0x00080000 LWA_ALPHA = 2 user32 = ctypes.windll.user32 style = user32.GetWindowLongA(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED user32.SetWindowLongA(hwnd, GWL_EXSTYLE, style) user32.SetLayeredWindowAttributes(hwnd, 0, alpha, LWA_ALPHA) make_transparent(window.getHWND(), 200)
431 :
428 :2009/01/18(日) 21:23:08 ID:3UbrRIpC0
壁紙 ※ リサイズ未対応。planeの開放のタイミング自信なし(コメント行) def set_wallpaper(target, filepath): import Image import cterm image = Image.open(filepath).convert('RGBA') image = cterm.Image.fromString(image.size, image.tostring()) rect = target.getClientRect() plane = cterm.Plane(target, rect[:2], rect[2:], 4) plane.setImage(image) # import atexit;atexit.register(plane.destroy) set_wallpaper(window, r'foo.jpg')
おお透過がきたー 試してみる ところで内骨格ってwineでもすかっと動きそうだよね? 内骨格とxyzzyがlinuxに持ち込めたら俺もう快適過ぎて死ぬかも
>>432 screen,vimやemacs内で普通に2画面ファイラー出来ますよ。
快適にするには自分で設定や環境を育てないといけないけど。
linuxで使える物、検索してみるとmfiler2というファイラーがあった。
こっちは逆にwinで動かす時cygwinが必要みたい。
>>428-429 うほ、これはいいモンキーパッチ
だが、なるべく避けて通りたい黒魔術ですねぇ
>>431 リサイズに対応するには、WM_SIZE系のフックがいるんでしょうな
触媒作ってみました。 import sys from types import FunctionType, ModuleType, CodeType def hide_closure(func): to_s = lambda xs:''.join(map(chr,xs)) code = func.func_code names = () flags = 79 # OPTIMIZED|NEWLOCALS|VARARGS|VARKEYWORDS|NOFREE consts = tuple([func]) varnames = tuple(['argv', 'kwargv']) bytecode = [0x64,0,0, 0x7c,0,0, 0x7c,1,0, 0x8e,0,0, 0x53] funcname = code.co_name filename = code.co_filename return CodeType(0, 2, 1, flags, to_s(bytecode), consts, names, varnames, filename, funcname, 0, '\x00\x01') class FunctionHook(object): def __init__(self, module_name): self.module = sys.modules[module_name] = ModuleType(module_name) def hook(self, srcfunc): def _hook(newfunc): func_name = newfunc.__name__ oldfunc = FunctionType(srcfunc.func_code, srcfunc.func_globals) setattr(self.module, "prev_"+func_name, oldfunc) srcfunc.func_code = hide_closure(newfunc) return newfunc return _hook
使い方。_onSizeをフックする例。 hook = FunctionHook('hook_handler').hook value = 10 @hook(window._onSize.im_func) def window_on_size(self, width, height): # import hook_handler # hook_handler.prev_window_on_size(self, width, height) print value pass コンストラクタでは、前のハンドラを保存する為に 'hook_handler' モジュールを生成します。 "prev_"+関数名で前のハンドラを保存するので、モジュール名と関数名は他と衝突しないように注意。
※ 注意 ※
動的コード生成でスコープの問題を解消。…出来てるはずだけど、
怪しい事してるので、何かあったら真っ先に疑ってください。
# 十分な動作検証をしていないので副作用が心配。
尚、このFunctionHookクラスでは、window._onXXX のフックしか出来ません。
>>434 メッセージのフックで出来るものは、そちらでやる方が良いですね。
デバッグの事とか考えると、自分でも避けたいと思います(苦笑
メッセージ・プロシージャ・フックのサンプル。 # TODO: 例外処理。フックする関数を呼んだ後の戻り値の扱い。 import ctypes from ctypes import windll, c_long, c_int, cast, POINTER, WINFUNCTYPE from ctypes.wintypes import RECT user32 = windll.user32 WNDPROC = WINFUNCTYPE(c_long, c_int, c_int, c_int, c_int) GWL_WNDPROC = -4 CallWindowProc = user32.CallWindowProcA lparam_to_rect = lambda x: cast(x, POINTER(RECT)).contents rect_to_size = lambda x: ((x.right-x.left), (x.bottom-x.top)) lparam_to_size = lambda x: rect_to_size(lparam_to_rect(x)) class MessageHook(dict): def __init__(self, hwnd): self.hwnd = hwnd self.newWndProc = WNDPROC(self._wndproc) self.prevWndProc = user32.SetWindowLongA(self.hwnd, GWL_WNDPROC, self.newWndProc) def __call__(self, msg): return lambda func: (self.__setitem__(msg,func), func)[-1] def _wndproc(self, hwnd, msg, wparam, lparam): if msg in self: self[msg](hwnd, msg, wparam, lparam) return CallWindowProc(self.prevWndProc, hwnd, msg, wparam, lparam)
# 〜続き WM_SIZING = 0x214 msghook = MessageHook(window.getHWND()) @msghook(WM_SIZING) def on_sizing(hwnd, msg, wparam, lparam): size = lparam_to_size(lparam) print "SIZE", size return 0
>>435-439 GJ。
戻り値に関しては、処理済かどうかをフックプロシジャに示してもらう
(ATL/WTL方式)のほうがよさげですね。
それと、ctermはunicode windowなので、W版APIを使うほうがよいのでは
ないでしょうか。
http://pastie.org/369970 ユーザのフックプロシジャは、引数としてhwnd, nmsg, ...のかわりに
Eventクラスのインスタンスを受け取ります。
元のウィンドウプロシジャに回したい場合は、Eventの
handledをFalseに、そうでなければTrueにセットするようにします。
handledがTrueの場合は、ユーザのプロシジャの戻り値をそのままウィンドウ
プロシジャの戻り値として返却します。
>>440 パッと見た感じでは、handledの書き換えが気になるかな。
# ATL/WTL方式の慣習には慣れ親しみが無いからかもしれない。
StopIterationの様な感覚で、こんなのはどうだろう。
例外を使って中断/継続を制御する方法。(アイデアのみの擬似コード。命名も適当なので要リファクタリング)
http://pastie.org/370021 ところで、WTLと言えば、vensterのメンテナンスってどうなるんだろう。
3.0対応を見据えると、これから拡張を作る場合 win32guiベース の方が良かったりするのかな?
>>431 を試してみたら尋常でなく描画が遅くなるのでちょっと調べてみました。
ctermでは、WM_WINDOWPOSCHANGINGを捕まえて、WINDOWPOS構造体の
flagsメンバのSWP_NOSIZEビットなどを見てサイズ変更かどうかを判断し、
サイズ変更の場合は、フル再描画を行っています。
残念ながら、自分の環境(XP SP3)では、ウィンドウの移動(サイズ変更ではない)
において、移動中(マウスドラッグ中)に飛んでくるメッセージでは、
NOZORDER, NOACTIVATE, NOOWNERZORDERのビットが立っていますが、NOSIZEビットは
立っていません。
移動完了時(マウスを放した瞬間)だけ、NOSIZEビットの立ったメッセージが
飛んできます。
結果として、不必要な再描画が大量に発生してしまっているようですね。
>>441 ATLでは、bHandledのような参照渡し引数を用います。
が、Pythonではそのようなものが使えないので……
>>441 コードを見てみましたが、
そういえば2.6になったからnamedtuple使えるんだな、と気づきましたw
vensterの中の人はctypes/comtypesの人なのですが
venster自体はここ4,5年ぐらい絶賛放置中なので……
気が向いたら3.0で動くか試そうと思っていますが、マンドクセという感じですね。
pywin32の方が堅いことは堅いでしょう。
448 :
441 :2009/01/25(日) 23:13:02 ID:1X3A6Eq20
うーん。自分にとってはwin32が黒魔術。詳細とか突っ込んだ所は解らないけど、
うちの環境(Vista 多分無印)ではなんとも無かった様です。対策感謝。
>>442 ,446
>>445 ベンチ取って見ると、インスタンス生成は大体同じくらいで
属性の参照ではクラスの方が2倍程早いみたい。(namedtuple使ったのは手抜)
wndprocは頻繁に呼ばれる事になるので、使うとしたら少しでも早いクラスの方がよさそーですね。
>vensterの中の人
同じ人だったんだ。comtypesは、もう3.0対応してるのになぁ。
最近のコミットを追いかけてみると、面白そうなもの発見…もしかして、コレ
ttp://svn.python.org/view/ctypes/branches/ctypeslib-cpp/ (Branch for ctypes C++ bindings)
で、ATL/WTLが使えるようになったりしないかな。(密かに期待
>>448 えーと、説明不足だったかもしれませんので、念のため。
>>442 の問題は、
>>431 のコードの問題というわけではありません。
背景画像の再描画はそれなりに重いので、不要な再描画が発生することによる負担が
顕在化しやすくなるだけです。
多分XPのGDIまわりのバグか何かでは?と思いますが、
自分も詳しいわけじゃないので、何とも……
vensterは、中の人を考えれば、大本命なんですけどねぇ。
まあ、忙しいんだろうな、とは思います。
>>449 ユーザ拡張側で出来る対策としては、
リサイズ終了時のみを捕まえて、画像を描画するようにした方がいいのだろうけど、
コード量が増えそうなので敬遠して…
壁紙のリサイズ対応(最大化には未対応)
追加する場所は431のset_wrappper関数の末尾。
差分のみなので、
>>431 ,
>>438 ,
>>439 ,
>>440 ,
>>444 ,
>>446 ,
>>447 を追従して
って長いな。最大化対応した頃にでもまとめます。(TODO)
@msg_hook(WM_SIZING)
def on_sizing(hwnd, msg, wparam, lparam):
plane.setSize(target.getClientRect()[2:4])
# 注意点:set_wallpaperを2回以上呼ぶ場合、前のウィンドウに対してのリサイズ対応が無効になる。
>>450 好みの問題ですが、↓のようにすると等倍表示になりますね。
十分大きい壁紙を指定すれば、ウィンドウリサイズへの対応が不要です。
def set_wallpaper(target, filepath):
import Image
import cterm
image = Image.open(filepath).convert('RGBA')
ctimage = cterm.Image.fromString(image.size, image.tostring())
plane = cterm.Plane(target, (0,0), image.size, 4)
plane.setImage(ctimage)
それと、これもXP onlyの話かもしれませんが、
>>446 の対応をしても、
カーソル移動などがかなりモタつきます。
ctermcore.cppのWindow::_drawBitmapLayer()で
SetStretchBltMode( hDC, STRETCH_HALFTONE );
をコメントアウトしてしまえば、描画速度は大幅に改善されます。
言うまでも無くC++のコード変更とctermcore.pydのリビルドを必要としますので
推奨できない方法ですが。
内骨格は、dirty rect管理+クリッピングリージョンを用いて再描画を
最小に抑える作りになっているようです。
が、上記のHALFTONEが指定されいると、クリッピングされていようが
StretchBlt()はまずビットマップ全体の再レンダリング計算を行ってから
ブリットしてるんじゃないのかなあ……というぐらいに負荷のかかりかたが
大きいです。
452 :
450 :2009/01/29(木) 00:45:14 ID:GNR3Z4Dp0
>>451 デバイスの描画速度に依存する問題だとしたら、環境によってはまだ問題が残ってそうですね。
全然試してないので、ソース見ての推測ですが、
Plane::SetImage -> Window::appendDirtyRectと追っていくと、
Window::_onTimerでdirty_rectの描画が発生してるのが原因だと思われます。
cterm_mainwindow.WindowでPlane.setImageを使うこと自体が問題になるみたいです。
別のアプローチでの壁紙を考えよう。
ところで、この問題ってImageViewerの方では起こってないのでしょうか?
>>452 えーと、dirty rectが再描画されることは必要ですから、それ自体が
問題なのではありません。
内骨格が描画領域を必要最低限に限定している(=クリッピングしている)にも
関わらず、私の環境では
背景ビットマップをHALFTONE指定でのStretchBlt()で描画すると、
背景画像なしの場合に比べて、目に見えて描画速度が落ちる、ということです。
カーソルを動かした時に、ファイルのリストのスクロールが発生するのであれば
ペイン全体が再描画されるので仕方が無いのですが、スクロールしない場合
(カーソル位置を示す横線だけが動く場合)も、相当遅くなります。
まあ、HALFTONEはパフォーマンスを犠牲にして拡大縮小を綺麗にするという
オプションですので、ある程度は当たり前の話なんですが。
速度の低下が許容範囲かどうかは、OS/CPU/グラフィックボード等に依存するところが
大でしょうね。
ImageViewerに関しては、 ・デフォでは等倍表示なので拡大縮小は発生しない ・フルスクリーンモードではロード時に画面サイズに合わせた縮小を 必要に応じて行ってしまう ので、リアルタイムでの拡大縮小は行いません。再描画時には 単なるblitが実行されます。 縮小アルゴリズムはBILINEARですが、これが重い人は、スクリプトを書き換えて NEARESTに変更すると、フルスクリーンモードでの大きい画像のロードが軽くなります (そのかわり、画面はやや荒くなります)。 まあ、私の環境はPentium M1.7GHz程度の、最新のデスクトップPCに比べると 随分貧弱なノートPCですが……。
455 :
452 :2009/01/30(金) 04:21:58 ID:0PLOaP9w0
>>453-454 詳細解説 Thanks。突っ込んだ所までは理解していないので、
原因と言っていいかどうかは解りませんが、問題点は把握できました。
Plane.setImageを避けて別の方法で画像を描画すればいいんだろうけど、
描画イベントやバッファの管理を、ユーザ拡張の範囲内で自分で行うのも面倒なので、
壁紙の描画問題の改善については、簡単に出来そうな方法を思いつくまで中断しようと思います。
小ネタで、左右ペインの入替。(Ctrl-X) コメント行は、ペインのサイズも変更する場合。 def command_SwapPane(): win = window win.left_pane, win.right_pane = win.right_pane, win.left_pane #win.left_window_width = win.window_normal_width - win.left_window_width #win.skinUpdate() win.paint() window.keymap[KeyEvent(ord('X'), MODKEY_CTRL)] = command_SwapPane
keymapを設定ファイルで管理
hg clone
http://freehg.org/u/nix/cfiler_user_keymap/ ---- 利用方法 sample
# configure.py
import user_map
register_command = user_map.set_command_decorator(window)
@register_command
def command_ForceQuit():
import sys;sys.exit()
user_map.install(window, u'./extension/user.keymap')
# ./extension/user.keymap
ForceQuit = Ctrl+Alt+Q
458 :
457 :2009/01/31(土) 08:46:31 ID:EtdStOQU0
モジュール名typo: s/user_map/user_keymap/
nice hack. 落とさせて貰いました。
ペインの先頭・最後尾にカーソル移動したいってキー一発でできない?
# ディレクトリを隣のPaneで開く @bind_key('Shift + Return') def command_ReturnOnInactivePane(): import os pane = window.activePane() item = pane.file_list.getItem(pane.cursor) if item.isdir(): window.inactiveJump(os.path.join(item.location, item.name)) # 再起動 @bind_key('Ctrl + Alt + F5') def command_Reboot(): import os import sys import cfiler_misc from cfiler_msgbox import popMessageBox, MSGBOX_TYPE_YESNO, RESULT_YES caption,message = u'確認',u'再起動します' result = popMessageBox(window, MSGBOX_TYPE_YESNO, caption, message) if result == RESULT_YES: cfiler_path = os.path.abspath(sys.argv[0]) window.saveState() cfiler_misc.shellExecute(None,None,cfiler_path,u"",u"") window.quit() sys.exit(0)
↑@bind_keyデコレータはuser_keymap.py利用です。キー割り当ての所は適当に。
日本語が何か変な気がするので訂正。 ↑@bind_keyデコレータは>457のuser_keymap.pyを利用したキー割り当てです。
diff for >464 - pane = window.activePane() - item = pane.file_list.getItem(pane.cursor) + item = window.activeCursorItem()
キーのアサインは「あふ互換モード」以外に自由にカスタマイズできないでしょうか?
469 :
cap005-096.kcn.ne.jp cap005-096.kcn.ne.jp :2009/02/06(金) 23:41:21 ID:+RLDH+dA0
>468 configで出来ますよ。
質問なのですが 多重起動を抑止して, 起動しているcfilerがあったらアクティブにする ようなことはできませんか? あと, コマンドラインでディレクトリを渡してアクティブにするには どうすればいいですか? この二つができたらdynaから乗り換えを考えています.
# ログのクリア def command_ClearLogPane(): window.log_pane.log.log = [u''] window.paint() window.launcher.command_list.append((u'clear', command_ClearLogPane))
474 :
471 :2009/02/08(日) 12:54:39 ID:+xfdrR+Q0
>>472 cfiler_launcher試してみました.
引数がふたつとれて左右同時にディレクトリ変更できるとベスト
なのですが, cppソースもあるので自力でなんとかできそうです.
ありがとうございました.
475 :
471 :2009/02/08(日) 12:58:04 ID:+xfdrR+Q0
extensionディレクトリのモジュールを先に読み込んでくれる cfilerx.exeが以前どこかにあったともうのですが, もうないですかね? CraftLaunchのソースでは多重起動防止ロジックが組み込まれているみたい なので, そちらからの対応も考えてみたいので, cfilerx あると便利かと 考えているのですが...
>>474 えーと、すみません。
今の版ではパイプに書き込む時にlocaleをimbue()し忘れていたので、日本語入りの
ディレクトリを表示させようとするとエラーになると思います。
修正版を上げておきました。
左右のディレクトリを変更したい場合は、window.inactiveJump()のかわりに
window.leftJump()とwindow.rightJump()で良いはずなのですが、
今のバージョンのwindow.leftJump()は
>>418 にあるとおり
ちょっとバグっているので、
直接window._jump()を呼ぶとよいでしょう。cfiler_mainwindow.pyの中を見て
参考にしてください。
477 :
332 :2009/02/08(日) 13:43:34 ID:teU/EffN0
>>475 >>332 のは既に消えてるのか、だとするともう無い。まぁ、あったとしてもPythonのバージョンが違うからだめだと思う。
cfilerx.exeのソースなら↓
boot.py:
http://codepad.org/cc8SYCfK setup.py:
http://codepad.org/9fT9Sd30 python setup.py py2exeでcfilerx.exeが出来る。
こいつはexeと同じ場所にあるcfilerx.zipをライブラリパスに追加してcfilerx.pyを実行する。
cfilerx.pyはcfilerのソースのcfiler.pyをコピーして来ればよい。
cfilerx.zipは元々のcfiler.exeを名前を変えてやるか
cfilerx.pyの中でcfiler.exeをライブラリパスに追加してやればよい。
478 :
471 :2009/02/08(日) 18:29:22 ID:+xfdrR+Q0
>>476 cfiler_launcherの新版いただきました. 試してみます.
>>477 cfilerx.exeのソースいただきました. こちらも試してみます.
5年以上使ってきたdynaのカスタマイズをほぼ内骨格に移行できる
めどが立ちました. みなさんありがとう.
Pythonスクリプトの実行。(要インストールPython)
Pythonのバージョンを選択して実行。でも、引数は取らない。
hg clone -r 0.0.1
http://freehg.org/u/nix/cfiler_runpy/ cfiler_runpy.setup(window) で、windowのクラスに以下のコマンドを追加。
* command_RunPy ... cfiler_misc.shellExecuteで実行。
* command_RunPyWithWindow ... window.subProcessCallで実行。出力/エラーは内骨格のログPaneへ。
キー割当はその後適当に。※注意点※ subProcessCallを使う方では、ServerやGUIアプリの実行は出来ない。
>>476 pipeserverとxconsole使わせてもらってます。
leftJumpは何処からも使われていないようなので、拡張向けのAPIなのかな。
うちでは、とりあえずはこんなので凌いでます。
from cfiler_mainwindow import PAINT_LEFT
def leftJump(self, path):
self._jump(self.left_pane, path)
self.paint(PAINT_LEFT)
window.__class__.leftJump = leftJump
# こんなとこでついでに言うのも恐縮ですが typo報告 tipsのメニューのとこ s/popupMenu/popMenu
>>480 ありゃ。指摘ありがとうございます。
記述を修正しときました。
ちと質問。
>>483 はミス。途中で送信しちまった。
この内骨格で気になってる部分が二つあるんだ。
1.ファイルサイズの単位が勝手に変わるんだけど、それを固定できるのか。
2.起動すると、毎回隠しファイルの表示がOFFになるっぽいけど、ONで固定できるのか。
これって、スクリプトを書き換えれば対応出来たりするんかな。
>>484 1.は常にKB単位とかで表示したいってことかな
cfiler_filelist.pyのitemformat_Name_Ext_Size_YYMMDD_HHMMSS()
のような関数が表示するときのフォーマッティングをやっているので、
それを真似してconfig.pyに適当な関数(myformatterとする)を作って
window.setItemFormat(myformatter)
のようにすれば出来るはず
逆に言うと、自分で関数を書かないとできない
2.は、なんかiniファイルに保存してないっぽいね
config.pyに
window.showHiddenFile(True)
とか書いておけばいいよ
486 :
484 :2009/02/20(金) 00:21:54 ID:PWKoirGd0
487 :
484 :2009/02/20(金) 03:32:46 ID:PWKoirGd0
>>487 >>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'Japanese_Japan.932'
>>> locale.format_string("%d", 10000, True)
'10,000'
489 :
484 :2009/02/20(金) 16:26:39 ID:PWKoirGd0
>>488 サンクス!
やっつけで作った関数が消せて、スッキリしました。
Python使えば、かなり色々といじれるんですね。
いろいろと勉強になりました。
ALTを使用したショートカットキーを押すとパンって警告音がなるのを 消したいんだけど、やり方がわからない。 pythonでできるのだろうか。
内骨格に限らず無効にしたければ、デバイスマネージャでBeepを無効にするのが簡単みたい。 内骨格内だけで無効にしたいなら、何らかの方法でキー入力をフックする必要があると思う、 python/config.py内で…となると、とりあえず思いついたのは、 すべてのAlt付きショートカットに、何もしない関数を割り当てる方法。 (※ 除く Alt+F, Alt+Space, Alt+Tab 等の標準のショートカット)
492 :
490 :2009/03/01(日) 12:17:07 ID:ABXltIoX0
>>491 レスサンクス。
説明不足でスマン。
ALT+○に関数割り当てて実際に関数が割り当たってて想定どおりの動作を
するんだけど、その動作と一緒に警告音がなるのを消したいってことなんだよね。
cfiler_mainwindowの_OnKeyDownでreturn True必ずするとか
いろいろ試してみたけどわかんない。
493 :
名無しさん@お腹いっぱい。 :2009/04/08(水) 22:28:55 ID:PVrh0dQuO
lzhファイル内の仮想ディレクトリからファイルのコピーを行おうとした場合、 タイムスタンプの比較が正しく機能してない様子です。 # 「新しければ上書き」してくれない zip、tgz形式で確認したところ正しく動作したので、これはアーカイバ側の問題なのでしょうか? ご存知の方おられましたらご教授ください。 内骨格 Ver.1.79 XP Pro. SP3
最近内骨格使い始めて、とりあえず使いやすいようにキーマップをしてみたんだけど、 / や : がマップできない。 VK_A みたいにどこかに書いてありますか?
495 :
494 :2009/04/10(金) 16:02:29 ID:VBdtzHSQ0
すみません。 ググったら、解決しました。
インクリメンタルサーチでは、CTRL-H で前の文字を削除できるけど、リネームやコマンドラインではできません。 これってどこか変更すれば実現可能ですか? 他にも、CTRL-M で決定 (Enter と同じ動作) にしたりしたいんですが、できますか?
Portable Python登場、移動可能な開発スタック 2009/04/06 後藤大地 実験的な位置づけが強いが、Pythonプロジェクトから新しい開発環境スタック Portable Python 1.1が公開された。Portable Pythonはポータブルデバイスで 持ち運びができるようにまとめられたPython開発スタック。 Windows XP、2000、98がサポートされ、Python 2.5.4、Python 2.6.1、Python 3.0.1のバージョンがサポートされている。スタックに含まれている成果物は次のとおり。 * Python 2.5.4版スタック(Django-1.0.2-final、IPython-0.9.1、Matplotlib-0.98.5.2、 Numpy- 1.2.1、PIL-1.1.6、Py2exe-0.6.9、PyGame-1.8.1、PyReadline-1.5、 PyScripter v1.9.9.6、PyWin32-212、Rpyc-2.60、Scipy-0.7.0b1、SPE-0.8.4.c、 VPython-3.2.11、 wxPython-unicode-2.8.9.1) * Python 2.6.1版スタック(Django-1.0.2-final、IPython-0.9.1、PIL-1.1.6、Py2exe-0.6.9、 PyGame-1.8.1、PyReadline-1.5、PyScripter v1.9.9.6、PyWin32-212、Rpyc-2.60、 SPE-0.8.4.c、wxPython-unicode-2.8.9.1) * Python 3.0.1版スタック(PyScripter v1.9.9.6、Rpyc-2.60)
Portable Python登場、移動可能な開発スタック 2009/04/06 後藤大地 実験的な位置づけが強いが、Pythonプロジェクトから新しい開発環境スタック Portable Python 1.1が公開された。Portable Pythonはポータブルデバイスで 持ち運びができるようにまとめられたPython開発スタック。 Windows XP、2000、98がサポートされ、Python 2.5.4、Python 2.6.1、Python 3.0.1のバージョンがサポートされている。スタックに含まれている成果物は次のとおり。 * Python 2.5.4版スタック(Django-1.0.2-final、IPython-0.9.1、Matplotlib-0.98.5.2、Numpy- 1.2.1、PIL-1.1.6、Py2exe-0.6.9、PyGame-1.8.1、PyReadline-1.5、 PyScripter v1.9.9.6、PyWin32-212、Rpyc-2.60、Scipy-0.7.0b1、SPE-0.8.4.c、VPython-3.2.11、 wxPython-unicode-2.8.9.1) * Python 2.6.1版スタック(Django-1.0.2-final、IPython-0.9.1、PIL-1.1.6、Py2exe-0.6.9、 PyGame-1.8.1、PyReadline-1.5、PyScripter v1.9.9.6、PyWin32-212、Rpyc-2.60、SPE-0.8.4.c、wxPython-unicode-2.8.9.1) * Python 3.0.1版スタック(PyScripter v1.9.9.6、Rpyc-2.60)
Portable Python登場、移動可能な開発スタック 2009/04/06 後藤大地 実験的な位置づけが強いが、Pythonプロジェクトから新しい開発環境スタックPortable Python 1.1が公開された。 Portable Pythonはポータブルデバイスで持ち運びができるようにまとめられたPython開発スタック。 Windows XP、2000、98がサポートされ、Python 2.5.4、Python 2.6.1、Python3.0.1のバージョンがサポートされている。 スタックに含まれている成果物は次のとおり。 * Python 2.5.4版スタック(Django-1.0.2-final、IPython-0.9.1、Matplotlib-0.98.5.2、Numpy- 1.2.1、PIL-1.1.6、Py2exe-0.6.9、PyGame-1.8.1、PyReadline-1.5、 PyScripter v1.9.9.6、PyWin32-212、Rpyc-2.60、Scipy-0.7.0b1、SPE-0.8.4.c、VPython-3.2.11、 wxPython-unicode-2.8.9.1) * Python 2.6.1版スタック(Django-1.0.2-final、IPython-0.9.1、PIL-1.1.6、Py2exe-0.6.9、 PyGame-1.8.1、PyReadline-1.5、PyScripter v1.9.9.6、PyWin32-212、Rpyc-2.60、SPE-0.8.4.c、wxPython-unicode-2.8.9.1) * Python 3.0.1版スタック(PyScripter v1.9.9.6、Rpyc-2.60)
内骨格で.lnkのリンク先を開くにはどうしたらいいの?
自力でEnterをhookして、win32使ってやってたが 今見直したらちゃんと動かないやwいつの間に・・・
cfiler_mainwindow.pyに下記がある。 if 0: # TEST if ext in (".lnk",".pif"): linkinfo = cfiler_native.getShellLinkInfo(item.getFullpath()) print linkinfo elif ext in (".url",): urlinfo = cfiler_native.getInternetShortcutInfo(item.getFullpath()) print urlinfo
503 :
500 :2009/04/20(月) 20:39:45 ID:1lQ6YCRy0
>>501 >>502 とりあえずEnterのフックで拡張子を判別してできそうですね。
本体を直接改造できればいいんですが、ビルドがうまくできなかったんですよね・・・
誰かビルドの環境と手順を解説してくれないかなぁ。
ジャンプリストをテンキーに割り当てようと思ったんだが、 これだとどの数字を押しても最後のフォルダに飛んでしまう lambdaの部分が駄目だと思うんだけど、どう書けばいい? window.keymap[ KeyEvent(ord(str(0))+48, 0) ] = lambda: window.activeJump(window.jump_list[3][1]) # OK for index, item in enumerate(window.jump_list): if index < 9: window.keymap[ KeyEvent(ord(str(index+1))+48, 0) ] = lambda: window.activeJump(item[1]) # NG print str(index+1), ord(str(index+1))+48, item[1] # 確認
>>504 繰り返しで廻す変数(index,item)をクロージャ内で使った時の落とし穴。
lambda内の変数itemは遅延評価される為、常に最後の値が入る事になる。
forの外で関数定義する。lambda使うなら下の様なのをforの事前に準備。
jump = lambda x: lambda: window.activeJump(x)
506 :
◆Nana...Z5Q :2009/05/03(日) 22:16:55 ID:BtTfz9LK0 BE:1253988566-2BP(200)
あふみたいな擬似D&Dはないでつか?
507 :
◆Nana...Z5Q :2009/05/07(木) 10:45:35 ID:HaZ7qVp00 BE:835992746-2BP(200)
あふみたいな画像のサムネ表示ってないでつか?
508 :
名無しさん@お腹いっぱい。 :2009/05/09(土) 13:54:46 ID:i+CnQzeS0
version 1.81にしてからGmailDriveにアクセス出来なくなったんだけどさ。 自分のところだけかな・・・。
わりぃsage忘れた。
>>508 GmailDriveエクスプローラではちゃんと見れてる?
みれないのは内骨格だけ?
>>510 GmailDriveエクスプローラからはちゃんと見られますね。
>>510 すみません
>>511 は途中で送ってしまいました。
それで、GmailDriveエクスプローラからはちゃんと見られます。
ファイルを持ってきたりすることも出来ました。
でも、内骨格で閲覧しようとすると、Gmailアクセス中のダイアログが出た後に、
以下のようなエラーが出てアクセスできませんでした。。
移動失敗 : \
list.remove(x): x not in list
>>512 更に調査結果追加。
新しく来た1.82でも同じエラーがでているので、直っておりません。
試しに、1.82を新しくダウンロードしてきて、
デスクトップに展開して起動させても無理でした。
1.80をダウンロードしてきて、同じくデスクトップで展開した場合は問題なく使えました。
よって、自分の環境ではバージョンを1.80まで落とさないと
GmailDrive使えなくなったようです。
>>513 GmailDriveの件ですが、新しく来たバージョン1.83にて対応されたみたいです。
1 .83 - 2009/05/10
- 1.81 から、GmailDrive と FTP が使えなくなっていたのを修正
- CheckSimilar コマンドの結果に、同じファイルが複数リストアップされてしまうのを修正
- ファイルの比較処理をキャンセルできるようにした。
早速チェックしたら、問題なくファイルのやりとりが出来ました。
ここを見ている方達にとってはわかりきっている事かもしれませんが、
質問をした者として、一応報告させていただきます。
また、レスをくれた方もありがとうございました。
Gmail Driveなんだけど、ドライブ内でのフォルダ間移動とか、重複ファイルの確認ダイアログとかがいちいち全部出るおよ(ノД`) 確認ダイアログとか出ないようにはどうやったらできるぽ? スレチでごめんち(;><)
ファイル名のインクリメンタルサーチがファイル名の部分一致もしてくれると使いやすいんだけどなー 下部ペーンで内骨格のpythonのインタプリタが動いたらsugeeeんだけど タブ切り替えとかで
昨日から使い始めた。 けど、なんで内骨格って名前なの?
519 :
名無しさん@お腹いっぱい。 :2009/06/30(火) 00:06:30 ID:dS1HEMXU0
カーソルが差してるファイル・ディレクトリのフルパスをクリップボードに取りたいんだけど、pythonからクリップボードっていじれるのかな・・・ ていうか、誰か、書いてくださいお願いします。
>>519 書いてみた。
# Ctrl+C でフルパスを取得してクリップボードへコピー
def copy_fullpath():
pane = window.activePane()
item = pane.file_list.getItem(pane.cursor)
path = item.getFullpath()
cfiler_misc.setClipboardText(path)
print path + u"をクリップボードにコピーしました"
window.keymap[ KeyEvent(ord('C'),MODKEY_CTRL) ] = copy_fullpath
configure直下に書くとCtrl+Cでフルパスをコピーする。
>>520 バッチリでした!キーアサインとメッセージまで想像してたのと一緒
どうもありがとう
だいなみたいに、 カーソルがある位置のファイル名を自動的にステータスバー or タイトルバーに表示させられないでしょうか? 目的は、ファイル名が...で省略されているときに、 カーソルをあわせるだけで完全なファイル名を知ることです。 returnを押して内容を表示させればファイル名がタイトルバーに出る ので、それをカーソル移動させた時点で見せる方法があれば よいのですが…
>>522 ボクもステータスバーにファイル名表示は欲しいと思うお!!(^ω^)
臨時対策として『Shift + -』押してまつ(ノД`)
プログラミング初心者だけど一応できた。 カーソルキーを押したときにタイトルバーを変更するようにしてあるので 起動した直後は表示されてません コピペするときは全角スペースを半角に直してください。 もっとうまく書ける方がいれば直してください def display_name_on_titlebar(): pane = window.activePane() window.setTitle(pane.file_list.items[pane.cursor].name) def push_downkey(): window.command_CursorDown() display_name_on_titlebar() def push_upkey(): window.command_CursorUp() display_name_on_titlebar() def push_leftkey(): window.command_FocusLeftOrGotoParentDir() display_name_on_titlebar() def push_rightkey(): window.command_FocusRightOrGotoParentDir() display_name_on_titlebar() window.keymap[VK_UP] = push_upkey window.keymap[VK_DOWN] = push_downkey window.keymap[VK_LEFT] = push_leftkey window.keymap[VK_RIGHT] = push_rightkey
>>524 Σ( ゜Д゜) スッ、スゲー!!
できたらアプリケーション名はそのまま左端に残すようにしてほしいお(^ω^)
お願いしますぽ
display_name_on_titlebar関数を書き換える def display_name_on_titlebar(): pane = window.activePane() filename = pane.file_list.items[pane.cursor].name appname = cfiler_resource.cfiler_appname title = " - ".join([filename, appname]) window.setTitle(title) 書式は5行目をいじれば変えられる title = " ".join([appname, filename]) だと アプリケーション名 ファイル名
528 :
◆Nana...Z5Q :2009/08/05(水) 19:38:02 ID:YteaO0Ic0 BE:1950648678-2BP(200)
>>527 すごいですっ!!
ありがとうございまつ(´;ω;`)
無事にappname - filenameと表示できますた(・∀・)
もっと勉強しますお(^ω^)
←↓→↑だけだと、Enterでディレクトリを潜った時とBackspaceで一階層ディレクトリ遡った時にはタイトルバーが変更されないことをハケーン
そんなのソース見れば一目瞭然なんだから 書き加えればいいじゃないか・・・
このファイラ、Pythonで機能を追加すればSVNの操作もできるのか・・・ すげぇな・・・
532 :
◆Nana...Z5Q :2009/08/09(日) 16:28:06 ID:uCiGHELH0 BE:1671984768-2BP(200)
>>530 ごめんなさいお><
自分で書き加えマスタ(・∀・)
ソース見ればわかんだから一々書かなくていいわしねっ!!!1
って言われるかもしれないけどももももしかしたらわからない人もいるかもしれないので書いておくお(^ω^)
>>524 に
def push_enterkey():
window.command_Enter()
display_name_on_titlebar()
def push_backkey():
window.command_GotoParentDir()
display_name_on_titlebar()
window.keymap[VK_RETURN] = push_enterkey
window.keymap[VK_BACK] = push_backkey
を追加お(^ω^)
いっそのこと、以下のようにしちゃった方が楽だよ def foo( func ): 〜事前処理〜 func() 〜事後処理〜 window.keymap[hoge] = foo(window.command_CursorUp)
534 :
◆Nana...Z5Q :2009/08/09(日) 21:32:43 ID:uCiGHELH0 BE:1253988566-2BP(200)
lambda : が抜けてるだけじゃね def display_name_on_titlebar( func=None ): if func: func() pane = window.activePane() filename = pane.file_list.items[pane.cursor].name appname = cfiler_resource.cfiler_appname title = " - ".join([filename, appname]) window.setTitle(title) window.keymap[VK_UP] = lambda : display_name_on_titlebar(window.command_CursorUp) window.keymap[VK_DOWN] = lambda : display_name_on_titlebar(window.command_CursorDown) window.keymap[VK_LEFT] = lambda : display_name_on_titlebar(window.command_FocusLeftOrGotoParentDir) window.keymap[VK_RIGHT] = lambda : display_name_on_titlebar(window.command_FocusRightOrGotoParentDir) window.keymap[ KeyEvent( ord('H'), 0 ) ] = lambda : display_name_on_titlebar(window.command_JumpHistory) window.keymap[ KeyEvent( ord('J'), 0 ) ] = lambda : display_name_on_titlebar(window.command_JumpList) いちいち各キーの定義をし直すのが面倒というなら、 keydown_hook で、自前でコマンド起動した後に、タイトル更新呼ぶようにすればいいと思う。 (cfiler_mainwindow.pyの#787〜#800あたりを複製する)
536 :
◆Nana...Z5Q :2009/08/10(月) 13:08:51 ID:2Pjouz0m0 BE:1253988566-2BP(200)
ラムダ・・・( ゚д゚ ) 式でつかφ(゚Д゚ )フムフム…
537 :
名無しさん@お腹いっぱい。 :2009/09/15(火) 11:55:48 ID:PcDTfY+g0
過疎w
まだまだ発展途上だと思うんだけど、ここ一月半ほどは何も動きがないからね 拡張子色分けなどの機能面も充実して欲しいけど、 中身の方もとりあえず実装優先なのかけっこうベタに書かれてる部分もあるんで、 拡張しやすいようにクラス分けやフックの整理とかして欲しい
アイコン表示機能つかないかな〜
そろそろ更新ないと心配になってくるな・・・
541 :
名無しさん@お腹いっぱい。 :2009/10/27(火) 13:22:36 ID:5/vY5MXZ0
スレが立ってまるっと二年
542 :
sage :2009/11/29(日) 01:13:50 ID:4iM7TOrD0
サイトが404・・・
>>542 ごめん、途中でおくってしまった…orz
普通に開けたので、ちょっとサーバー再起動とかメンテしてただけじゃね?
おしえてください。 仮想フォルダ内のファイルをエディタに渡したいのですが デフォルトでは用意されていない機能ですか?
履歴で上から連続で削除すると "KeyError" になるぞ。
このファイラ、xyzzy 感覚で拡張できておもしろいね。 手段と目的が入れ替わりそうだw ただ、インタラクティブな関数の中に実処理が丸ごと 実装されているものが多いようで拡張しづらい。 python よくわからんけど、関数内でクラスを定義する メリットってあるのかな? あと拡張子と当日タイムスタンプの色づけが実装されれば 最高だな。
>>関数内でクラスを定義する スコープと名前空間が制限される pythonは関数もファーストクラスオブジェクトだし、 クラスがネストされているようなものだと思えば分かりやすいかも 実装がベタだという点は同感 今手を入れても将来整理されて無駄になるのではと思い、その辺が更新されるのを待っているのだけど、 ここしばらく音沙汰が無いのが何とももどかしい
更新したろ?
何が変わったのかがわからない
version 1.86:
http://sites.google.com/site/craftware/ - ディレクトリ区切り文字をスラッシュにしているときに、ファイルのドラッグ&
ドロップや、テキストエディタの起動でもスラッシュ区切りで渡していたのを修正。
- ドライブ名の大文字/小文字をそろえる設定を追加
- ソート方法の選択ウインドウを、Shift-Enterで決定できなかったのを修正。
Shiftを押しながら決定すると、逆順になる。
- 逆順でソートした後、再度ソート方法の選択ウインドウを開いたとき、初期選択
位置がリセットされてしまうのを修正。
WindowsがFUSEを標準でサポートしてればねぇ
>>552 次回のリリースで普通のハードディスクと同じように他のソフトからも
いじれるようにしたいとか書いてるから、更新待ち。
557 :
名無しさん@お腹いっぱい。 :2010/01/05(火) 15:47:19 ID:uG9wSu4C0
履歴検索ができそうでできないなw俺だけ?
履歴窓でfキーで検索できんか?
やっぱ普通に出来るのか 何故かできないんだよね.設定見直してみるわ
拡張子色づけ(できればアイコン)とかの表示関連は、まだまだ 先なのかな〜?
エクスプローラで右ドラッグ&ドロップした時に出るメニューが出せたらいいな ・・・と思ったけどその度にフォーカスがよそに行くのも面倒か
もう8年ぐらい使ってきたあふの代わりにと内骨格を試し始めた。
>>313 と
>>457 を試してみたいんだけど、消えてるみたい。
どなたか持っていませんか?
自分でやれということかもしれないけど、
カスタマイズの情報があんまり無いような。
wikiとかあって、もっと盛り上がってるのかなー、
と思ってたんだけど。
過疎ってるなーメインで使ってる人いるの
>>565 ユーザーが少ない上に、大きな更新も無いから仕方ない
俺はメインで使ってるよ
Pythonである程度好きに弄れるから重宝してる
結局、SkyDriveには対応出来ないっぽいね まぁ、GMailDriveとはまた違った構造みたいだし仕方ないのかな… もうちょっといろいろ出来るようになると使い勝手が格段に上がるんだけどねぇ ・SkyDriveの対応 ・ハードリンク、ジャンクション、シンボリックリンクの作成や削除、そして視覚的な判別(文字色を変えるとか) ・複数ファイルの上書き確認を簡略化 (一つ一つ上書き確認するのも大切だけど、例えば全部同じ処理で上書きを行うみたいなのが欲しい) ここで言ってもあまり意味ないのかな?
拡張子や特定のtagがついたflie名の色分け機能は欲しいな。 あふで使ってるmenuの移植ができれば、内骨格mainで使えると思う。 現在menuを内骨格に移そうと格闘中。listに&CDみたいなcommandとか アプリ直指定で簡単に動いてくれれば嬉しいんだけど。 地道にdefでcommand定義しまくってる。
色分けなんかは、item_CommonPaint.paint()をちょっといじればすぐ出来そうなんだが、 いかにも将来実装されそうな部分に手を入れるのは無駄になりそうであまり気乗りがしないんだよな
>>569 見てみたけど、なんか下層にあってちょっとがっくり。
プログラムあんまり分からんのですが、compile無しでは
機能拡張できないような。
Systemの構成に破綻が出来てしまうからなのかもしれないけど、
そういうのを簡単に拡張部としてadd-onしていければ、
作者も楽だしみんなも嬉しいと思うんだけど。
それともsupportの組み合わせ範囲が逆に増えるかな?
>>570 いやPythonで実装されてる部分はさすがにコンパイルは要らないよ
動的言語のプログラムコードを実行時に置き換えるのを俗にモンキーパッチと言うが、
Pythonでもそういうことができる
この場合、内骨格の実装は一切変更する必要がない
MainWindowクラスのメソッドを単純に置き換えるのは比較的容易
>>569 のケースは比較的面倒だけど、
>>428 の手法を使えば大抵のことができる
# 黒魔術だが……
参考までに
>>569 のケースのやりかたね
http://codepad.org/Y6MDMwXB これをpaint.pyという名前でextensionに保存して、
config.pyのconfigure()の中で
import paint
を実行すると、cfiler_filelist.item_CommonPaint.paint()の実装が
paint.pyのmypaint()によって置き換えられる
後は、paint.pyのgetattr_fg()あたりを弄れば、文字色を好きなように変更できるよ
572 :
571 :2010/03/03(水) 19:32:35 ID:cAuyyw/o0
ごめん paint.pyじゃなくて、painter.pyとしてください その名前をもし変えたい場合は、mypaint()の中のpainterという文字列も 同時に変更する必要があります
>>570 クラスのitem_CommonPaint.paint()メソッドを置き換えればいい
config.py内に以下を記述すると、拡張子txtが赤字で表示される
def my_paint( self, window, x, y, width, cursor, itemformat, userdata ):
# 省略
if self.name[-3:] == u'txt':
attr_fg=(255,0,0)
# 省略
item_CommonPaint.paint = my_paint
※省略した部分は、cfiler_filelist.pyのitem_CommonPaint.paint()メソッドからコピペしてくる
574 :
571 :2010/03/03(水) 19:54:08 ID:cAuyyw/o0
>>573 あら、それだけで良かったか
継承されてるからどうかな、とちょっと気にしてたw
拡張子だけ色つけるのは無理ですか?
ソース見たけど、一行単位で画面に描いてるので拡張子だけというのは無理そうだ
>>571 >>573 どうもです。レスが2つもついて結構びっくり。
時間なくてまだ試してなけど、勉強になります。
拡張子だけ色をつけるのはむりっぽい? って話ですが、
他にもいろいろ応用できそうで、ちょっと楽しみ。
window.putString( x, y, 64, 1, attr, s ) window.putString( 64, y, 4, 1, attr, s ) みたいな感じで分割して二度書きするといけそうな感じかな。。。 attrも拡張子用の奴を作って、separatorの位置からwidthも 計算。でも、window.putStringはoffset指定できなさそう。 やっぱり無理か。 何気にwindow.putStringはyもあるからfocusの扱いを拡張できれば、 file listの上下分割もできそうな。今のところ興味ないんだが。
pythonググりながら拡張子の色変更に挑戦してみたら、
>>578 で結論がでていた
>>573 を参考にmy_paintをつくって
window.putString( x + body_width って感じにx座標を調整しながら、
ファイル名、拡張子、タイムスタンプと別々に描画してみたら一応できた
body_widthはitemformat_Name_Ext_Size_YYMMDD_HHMMSSの中で使われていた変数
それぞれの描画文字列を得るために、s = itemformat(略 のところを消して、
itemformat_Name_Ext_Size_YYMMDD_HHMMSSの中身コピぺした
将来的に不安
580 :
578 :2010/04/04(日) 07:03:30 ID:UdiNrABj0
あれ? 拡張子の色分け、早々に出来ないと思ってあきらめてた。 がんばってみよう。
581 :
578 :2010/04/05(月) 06:33:07 ID:PIU6fO4a0
>>579 の方法を試してみようと思ったけど頭悪くて出来なかった。orz
けど別の方法を思いついた。
attr_ext = cterm.Attribute( fg = attr_fg, bg_gradation = attr_bg_gradation, underline = attr_underline )
if self.name[-4:] == u'.exe':
attr_ext = cterm.Attribute( fg = (255,0,0), bg_gradation = attr_bg_gradation, underline = attr_underline )
window.putString( x, y, width, 1, attr, s )
window.putString( x, y, 106, 1, attr_ext, s )
window.putString( x, y, 101, 1, attr, s )
3回上書きするんだけど、2回目はtimestamp部は上書きしない、
3回目はtimestamp部と拡張子部を上書きしないでfile名のみ描画。
なんでもっと早く思いつかなかったんだろう。orz
誰か外部からパスを変更したり、コマンドを実行するI/Fを実装してください 今のところはキーを送るくらいしか手は無い?
584 :
564 :2010/05/23(日) 08:52:48 ID:u/kTJBGU0
>>583 います。
わざわざどうもありがとうございます。
頭が悪いので一見して、何をやってるのか分かりませんでしたが、
いろいろ弄ってみます。
>>584 機能紹介も兼ねて補足です。2通りの使い方があって。
1)user_key.install(window, path_to_resource_file)
pythonスクリプトで
window.keymap[KeyEvent(ord('Q'), MODKEY_CTRL|MODKEY_ALT)] = command_ForceQuit
と書くところを、設定ファイルで以下のように定義出来ます。
ForceQuit = Ctrl+Alt Q
コマンド名は、window.command_* が捜査対象となるので、
前準備として、windowオブジェクトへ command_ PREFIX付で関数を登録しておきます。
register_command = user_keymap.set_command_decorator(window)
で生成した関数をデコレータとして使うと簡単に記述できます。記述例
>>457 2)bind_key = user_keymap.set_keyevent_decorator(window.keymap)
関数定義時に、keymapへの登録をするデコレータ 使い方の例は
>>464
>>535 解決済っぽいけど、汎用的な方法を紹介。(内骨格での動作確認はしてません。動かない場合、誰かフォローよろしく)
例:
http://pastebin.org/291303 nothing = lambda:None
def command_hook(target, name, pre=nothing, post=nothing):
method = getattr(target, name, None)
if method: setattr(target, name, lambda:(pre(),method(),post()))
for name in ('CursorUp', 'CursorDown', 'FocusLeftOrGotoParentDir', 'FocusRightOrGotoParentDir', 'JumpHistory', 'JumpList'):
command_hook(window, 'command_'+name, post=display_name_on_titlebar)
ずっと放置されているかと思っていたが、こまめに Verup されてるんだな。
よかったよかった。
1 .98 - 2010/07/11
o 起動引数に -L と -R を追加し、開く左右のファイルリストのパスを設定できるようにした。例)
cfiler.exe -L"c:/" -R"d:/dirname"
o Alt-Z で、もうひとつ内骨格を起動できるようにした。
o Ctrl - TAB が効かなくなっていたのを修正。
o configure_ImageViewer で maximize() したときにエラーになっていたのを修正。
o ZipとTar系の仮想ディレクトリからファイルをコピーしている間に、ほかのディレクトリに移動すると、ア
ーカイブファイルがクローズされてしまって、コピーに失敗してしまっていたのを修正。
o ファイルのコピーが稀に失敗してしまうのを修正 (setFileTime中のCreateFileのリトライ処理追加。
http:/ /support.microsoft.com/kb/316609/ja)
1 .97 - 2010/06/17
1 .96 - 2010/04/11
1 .95 - 2010/03/13
1 .94 - 2010/02/27
1 .93 - 2010/02/22
1 .92 - 2010/02/13
1 .91 - 2010/02/12
ちょっと質問なんですが デフォルトの状態で、ヘルプに書いてある Yでルートディレクトリへ移動というのが効かないような self.keymap[ KeyEvent( VK_OEM_5, 0 ) ] = self.command_GotoRootDir ここの事なんでしょうか? ともかくconfig.pyに window.keymap[ 'y' ] = window.command_GotoParentDir と書き加えて問題はないのですが (スクリプトとか全然なのでこんだけの事にも苦労しましたが……) どうにも腑に落ちません
デフォで定義されているのは、Yじゃなくて\(Yen) ヘルプにもそう書かれているはず (VK_OEM_5は\キー表す) 定義はその方法で問題ない RootDirじゃなくParentDirになっているけど…
ぐえあ、返答ありがとうございます Yじゃなくて\でした…… しかも/のほうキーだと思ってたという。右上のほうのこれか…… RootDirよりParentDirのほうが好きなんで、そうしました なんにしろ、python勉強しようかな、と思わせるソフトですね
アップデートしたらスキン上書きされた
メジャーアップデート来たと思ったらスキンだった
アップデートでconfig.py読み込めなくなった
白テーマかっこいいな なんかグレーの枠みたいのが適当に立体でカッコ悪いと思ってたんだけどこれだとデスクトップに常駐しててもいいかもしんない
更新履歴書いてくれよ
596 :
名無しさん@お腹いっぱい。 :2010/11/02(火) 22:25:00 ID:UbNDdsfz0
window.SubProcessCallをキューに突っ込んでバックグランド実行みたいなことってできないのかな SubProcessCallをjobitemにするとプロセスが完了しても制御が帰ってこないようなんだけど
>>597 以前試してできなかった。地道に別の内骨格立ち上げてる。
アクティブペインにあるフォルダへwindow.command_MoveInput()を使ってファイルを移動させると、 そのフォルダを後で簡単に消せなくなる。中身のファイルは消えるけどフォルダは残ってしまう。 一度内骨格を終わらせて、タスクマネジャーに残ってるcfilerも消すとそのフォルダも無くなるけど。 何でだろ。
>2.05 - 2010/12/02 > * CopyInput や MoveInput を実行したときに、入力したディレクトリの監視用スレッドが残り続けてしまっていたのを修正。 > 内骨格のプロセスがいる間、そのディレクトリが削除できなくなってしまっていた。また、その状態では、 > ウインドウを閉じても、内骨格のプロセスが残存してしまっていた。 対応ありがとうございます。
俺も大分前からそういう現象に気づいてたけど、トリガが何かわかってなかったわ
気づいた
>>599 はえらい
>>597 遅レスだけど
subProcessCall()はsubThreadCall()で処理を行うようになっていて
subThreadCall()はちょっと特殊なのでそういう使いかたは無理だな
なので、直接cfiler_subprocess.SubProcessをつかえばいい
def run_subprocess(*args, **kw):
import cfiler_subprocess
import ckit
p = cfiler_subprocess.SubProcess(*args, **kw)
window.taskEnqueue(ckit.JobItem(lambda item: p()))
例えば、上のような関数をconfigure()の中に作っておいて
run_subprocess(['tar', '-xvf', path, '-C', dst])
という具合に呼べばいい
run_subprocessが受け付ける引数は、cfiler_subprocess.SubProcessの
コンストラクタの引数と同じ
603 :
602 :2010/12/08(水) 20:12:01 ID:T1EBzDMf0
ただし、書いといて何だけど、俺としてはお薦めできないんだな cfiler_subprocess.SubProcessの中で使っているのは Python標準のsubprocessモジュールなんだけど これがCreateProcessAを呼んでいるのでUnicode非対応だというのが一つ もう一点は、cfiler_subprocess.SubProcess.__call__()の中で > self.stdout_writer( self.p.stdout.read() ) このようにしてパイプから読みこんでるんだけど、無引数read()なので、 プロセスの全部の出力をこの一文で一気に読み込むことになる つまり、終わるまで出力が一切出ないし、データ流量が多い場合はつまって 酷いことになるかもしれない (ここは作者さんに直して欲しいところ、俺は使ってないけどw) というわけで、どうしても内骨格の下のログペインに出力を出したいのでなければ、 単にckit.shellExecute()を直接呼ぶのが手軽でおすすめ(taskEnqueue()で キューイングする必要も無い) そうでなければ、ctypesで自分でCreateProcessWを叩くか
604 :
名無しさん@お腹いっぱい。 :2010/12/26(日) 21:38:39 ID:Z0w5TCsh0
最近のバージョンになってから、Craftlaunchや内骨格が起動しなくなりました。 注意書きにある、マイクロソフトのランタイムライブラリを入れてもなおりません。 同じ症状の方はいないでしょうか? OSはWin2000SP4です。 cfiler_206 clnch_324ともに起動できませんでした。
何かメッセージとかでないの?
606 :
名無しさん@お腹いっぱい。 :2010/12/27(月) 05:47:11 ID:gK0i2cpf0
See the logfile 'D:\bin\cfiler\cfiler.exe.log' for details とウィンドウが出ます。Craftlaunchも同様です。 cfiler.exe.logの中身は Traceback (most recent call last): File "cfiler_main.py", line 9, in <module> File "cfiler_mainwindow.pyo", line 17, in <module> File "pyauto\__init__.pyo", line 3, in <module> File "pyauto\pyautocore.pyo", line 12, in <module> File "pyauto\pyautocore.pyo", line 10, in __load ImportError: DLL load failed: 指定されたプロシージャが見つかりません。 です。 あと、手持ちの過去のバージョンで試したところ、内骨格はver1.98aまで。Craftlaunchはver3.14までは問題なく起動します。
作者さま テキストビューア、バイナリビューア、テキスト比較で ページ単位のスクロールが、1行多いっす。
起動時に最新バージョンチェックをしにいってるみたいなんだけれど、 これを止めるようには出来ない?
>>610 ソースを見る限りでは
cfiler.iniの
[UPDATE]
check_frequency
の値を0にすれば、チェックしなくなりそう(確認はしてない)
すみません。アンカ間違い 610 → 611
Shift Z の設定メニューからも 無効にできるぞ
616 :
名無しさん@お腹いっぱい。 :2011/03/20(日) 07:57:47.96 ID:D07CNDHm0
内骨格 ver 2.07 公開 内骨格の ver 2.07 を公開した。 2.07 - 2011/03/08 * Python27 を使うようにした。 * migemo のバージョン 1.3c を使うようにした。 * SubProcess クラスを cfiler 名前空間に export した。 * SubProcess クラスを使ったサブプロセスの実行時に、 ログのリダイレクト処理が1行ごとに行われるようにした。 * GmailDrive の対応を廃止 (ほかにDropBoxのような便利なサービスがあるため) * テキストビューア、バイナリビューア、テキスト差分ビューアのページ単位の スクロールが1行多くスクロールしてしまっていたのを修正。
2.08 - 2011/04/24 終了時の設定ファイルの保存が失敗しにくいようにした。 (保存時にタイムアウトしないようにした。テンポラリファイルを使うようにした。) ディレクトリの削除の途中で、別のタスクが割り込むことができるようにした。 デフォルト設定ファイルに定義している NetDrive コマンドで、net use に /yes を渡すようにした。
アイコンはくるのか?
619 :
名無しさん@お腹いっぱい。 :2011/06/01(水) 01:38:07.91 ID:6aVuaKFh0
comtypes使いたいと思ってとりあえずpython2.5の環境でインストールし comtypesってフォルダをコピーしてみたんだけど全然ダメだ。 どうすれば使えるんです?
comtypesは内骨格に標準で入ってるから、他所からインストールする必要はないよ import comtypes をやれば使えるはず
内骨格を使ってたらジャンプができなくなってました エスパーの方いましたら回答お願いします
2.09 - 2011/06/26 テキストビューアで、shift-jis の代わりに、内部的に cp932 を使用するようにして、 Windows用の機種依存文字が表示できるようにした。 テーマの切り替えでエラーが発生するようになってしまっていたのを修正。
2.10 - 2011/08/21 ・Ctrl-J で Search や Grep の検索結果をリストウインドウで表示するようにした。 ・Python の標準ライブラリと comtypes を同梱するようにした。 ・Window.maximize(), Window.minimize(), Window.restore() に、SetWindowPlacement() ではなく、 WM_SYSCOMMAND を使うようにした。 これにより、最大化したまま最小化したウインドウを restore() するときに、 通常サイズに戻ることなく、最大化状態で復帰するようにした。 ・パスワードつきZipファイルを扱ったときのエラー表示を整理。 ・ビルド方法の整理。C++部分は Visual C++ 2008 (Express)を使うようにした。 ・ドキュメント生成に使用している Doxygen のバージョンアップ
書庫の圧縮・展開はDLLに任せちゃえばいいのに、ってのは素人考えですか?
拡張子.jarファイル上でリターンキー押した時にもzipと同じように中に入っていくっていう設定をしたいんですが どうやればいいでしょう
アーカイブの判定はハードコードされてるので、 cfiler_mainwindow.pyのcommand_Enter()を複製してそれを書き換えるか、 hook_Enter()に同じような処理を追記すればいいと思う def hook_Enter(): pane = window.activePane() item = pane.file_list.getItem(pane.cursor) if hasattr(item,"getLink"): link_entity = item.getLink() if link_entity: item = link_entity if not item.isdir() and os.path.splitext(item.name)[1].lower() == ".jar": window.appendHistory(pane) new_lister = cfiler_filelist.lister_Zip( window, item.getFullpath(), "" ) window.jumpLister( pane, new_lister ) return True
いけた!ありがとう!
既出かもしれないけど、圧縮ファイル展開時の属性とタイムスタンプが変? 7z,rar ファイル属性もタイムスタンプも保持 zip,tgz ファイル属性もタイムスタンプも保持されない lzh ファイル属性は保持されず、タイムスタンプは保持される
このソフトすごい良いのに、なんで人気ないんだろ 非同期だしあふwとかより高機能じゃない?
3の方が主流になったらPython覚える
Pythonって全然難しくないのになぁ。 極端な話、関数または条件文の次の行は文字下げ(インデント)するってことさえ知ってれば 何とかなると思う。
インデントは嫌われる理由になっていても難しいと思われる原因にはなってないと思われ。
プログラマー気質の人がそんなにいないということだな ファイラーにあふ以上の機能が必要という一般人は 作業のありかたを見直した方が早い
>>631 細かなところまで内部を好き勝手に書き換えられるのがいいね
みんなが作ったカスタマイズに関するノウハウやスクリプトを共有できたりすると、もうちょっと流行るんじゃないかと思うけど
>>634 vimでオートインデントすんのどうやんの?
:help autoindent てかvimスレかと思ったわ。そっちもお気に入りに入ってるから。
>>631 多分キーボメインだから
普通の人はマウスメインのファイラ使ってると思う
>>631 afxの人が言ってるみたいに年取ると設定ファイルガリガリ書くのがしんどいから
もっと包括的な設定のフロントエンドがあればいいと思う(shift+zである程度は設定できるけど)。
>>636 そういうスクリプトのアーカイブがあればありがたいねぇ。
俺は、なるべくextensionフォルダにスクリプト放り込んで、config.pyでimportするようにしてるんだが、 いかんせん改造のレベルが、「元のソースから関数コピって、必要なとこだけ直す」ってのが多くて、公開するにはちと恥ずかしすぎるw
643 :
名無しさん@お腹いっぱい。 :2011/11/08(火) 14:00:12.31 ID:fRdEdt1L0
設定ファイルとかも展開した本体フォルダに格納するようにしてほしい。 デフォだと現状user/appdateにフォルダ作られるのがなぁ・・・ 設定いじればなんとかなるんかね?
>>643 本体側にあればそっちを読むって仕様じゃなかったっけ?
>>636 pythonで細かく拡張できるのがメリットな反面で、
普及に関してはnon-programmerな人達にとっての敷居になってる部分もあると思います
>カスタマイズに関するノウハウやスクリプトを共有
現状ではコード断片を各自 config.py に貼り付けなので、この点はまだまだ改善の余地あり。
拡張機能を共有する為の枠組みが整備されるといいですね。
指しあたっては、拡張機能の実装とユーザ定義コンフィグ(キー割り当て等)の分離だろうけど・・・
拡張機能の自動読み込み、叩き台だしてみよ。
http://codepad.org/BxlGzCAt ./extension内に配置した *_plugin.* モジュールを読み込んでsetup関数を呼び出します。
setup内でwindow.command_XXX = command_XXX と登録して、config.py 側でキー・アサインといった利用を想定してます。
登録するコマンド名は他と重複してしまわないように注意。
# 自動読み込みを経由しないで使いたい場合は、自分で config.py configure() 内に import して setupを呼び出す処理を書きます。
# import hello_plugin
# hello_plugin.setup(window)
プラグイン管理用のユーザ・インターフェースも欲しいところだけど、
プラグイン保管用のフォルダとextensionフォルダを内骨格の左右で開いて、
有効にするプラグインをextensionへコピーする等。手抜き^h^h^h工夫して運用でカバー。プラグインの反映は内骨格を再起動する事で対応。
(config.pyの再読み込みでは、読み込み済みプラグインの再読み込みや解除はできない。。多分。
自分の利用方法では、
適当なフォルダに pythonスクリプトやよく使うプログラムのショートカット、batファイル等をまとめて置いて、(unixの/usr/local/bin的な場所
アクティブなpaneのパスや選択したファイルのリストを渡して起動って使い方が主です。内骨格本体はあまり拡張してません。
(いろいろとロードして内骨格本体のプロセスが肥大化するのは避けたいのと、内骨格への依存を避ける為。)
内骨格内部でいろいろやるというよりは、外部アプリの起動拠点として使ってます。# ・・・なので、内骨格へフィードバックするようなことがあまりない(^^;
647 :
名無しさん@お腹いっぱい。 :2011/11/08(火) 15:35:48.29 ID:fRdEdt1L0
>>644 あ、ほんとだ。お騒がせした。
以前やったけど何度も何度もappdateにフォルダ作られて諦めてた・・・なんだったんだろう。
>>646 乙です。
自分もnon-programmerな人間なのでafxwのマクロでゴニョゴニョやるのが精一杯です。
basic位判りやすかったらなぁ。インデント見ると怯む。
648 :
646 :2011/11/08(火) 19:48:38.94 ID:/Jzyht/w0
キーボード操作がメインでPythonが拡張言語って時点で
利用者が限定されるんじゃないかなと思ってたんだけど、そうでもないのですね。
>インデント見ると怯む。
タブと混在してエラーになったり、掲示板からコピペする時に障害となったり・・・。確かに、煩わしい部分はありますね。
non-programmerな人向けのpythonスクリプト編集のノウハウなんかもだしてったほうがいいかな。
例えば、メモ帳でのconfig.py編集はあまりお勧めしません。
インデントがtab文字と空白文字が混在してしまうとエラーの原因になったりするので、
TABをスペースに展開してくれて、全角・半角空白・タブの区別が出来るエディタの利用をお勧めします。
pythonでのインデントは、TAB文字は使わず半角のスペースが基本です。
それでもメモ帳で編集する場合のTip、間違えて全角の空白をいれてしまわないように、
Sfhit + Space でスペースを打ち込むと、少しだけ安心です(MS-IME利用の場合)
もうひとつ厄介なインデントの問題ですが、
掲示板に投稿されたコードの半角スペースやタブのインデントは、
ブラウザ経由で見る場合には省略される為、単純にコピペ出来ない事があります。
インデントがタブや全角スペース ... コピペ後に修正が必要
スペースを HTMLのエスケープ文字 に置き換えて投稿。(ブラウザで見たときスペースとして表示される)
... コピペ可。但し、コードを貼り付ける場所によってはインデントの深さを調整する必要がある。
外部サイトへ乗せる。github, pastebin.com, codepad.org 等。
... ファイルとしてダウンロード可能。
スムーズな拡張機能の共有の為には、
コードの断片でなく、ファイル単位で機能を共有する枠組みが必須です。# ってことで、
>>645 を書きました。
649 :
646 :2011/11/08(火) 19:51:28.21 ID:/Jzyht/w0
user_keymap.py の最近の内骨格への対応。 # githubへはそのうち更新させます
- from cterm import cterm_const as key_constants
+ from ckit import ckit_const as key_constants
再起動も動かなくなってたので、
>>645 利用のサンプルも兼ねて書き直し。
# ./extension/reboot_plugin.py
ttp://codepad.org/sH7y093r # config.py configure() 内での設定例
# reboot_pluginを読み込まなかった場合、
# window.command_Rebootの参照でエラーになってしまうので事前にチェック。
# hasattrはpythonの組み込み関数でimport等しなくても使えます。
if hasattr(window, "command_Reboot"):
# x キーで呼び出すコマンドへ登録
window.launcher.command_list.append((u'reboot', window.command_Reboot))
# Ctrl + Alt + F5 へ割り当て
window.keymap[KeyEvent(VK_F5, MODKEY_CTRL|MODKEY_ALT)] = window.command_Reboot
650 :
646 :2011/11/09(水) 16:48:45.58 ID:Mtf4AkJn0
# user_keymap.py 更新。取り急ぎcodepadで
#
# 変更点:
# * 新しいバージョンの内骨格に対応。
# * コメント開始文字の後にスペースがない場合、コメントとして扱われなかったのを修正。
# * 行末コメントの対応。
ttp://codepad.org/mjDokeON # ./extension/dirs_plugin.py
ttp://codepad.org/cVhicbnH popd/pushd 相当の拡張機能です。
内骨格にはジャンプリスト、ヒストリ、ブックマーク等の移動手段がありますが、
わざわざ登録する程でもない一時的な作業場所に、頻繁に行ったりきたりする場合や、
一時的な作業場所が3箇所以上になる時、移動が煩わしい事があります。
この拡張機能では、短期的な作業で複数の離れた場所を頻繁に行き来するといった状況で、
より少ないキー・ストロークでの移動手段を提供します。
使い方:
DirsPush で、現在の場所を登録します。
DirsNext, DirsPrev で登録した場所を行き来できます。タブの切り替え感覚で場所移動。
DirsPop で、現在の場所が登録されている場合、それを解除します。
DirsPrint 登録した場所の一覧表示
DirsClear すべての登録を解除
登録した場所の一覧情報は、保存されません。
ソートに数字順による並び換えを追加する
# ./extension/SortByNumber_plugin.py
ttp://codepad.org/Zr69tIQC こんな感じ
1.jpg
11.jpg
2.jpg
hoge_10.txt
hoge_3.txt
↓
1.jpg
2.jpg
11.jpg
hoge_3.txt
hoge_10.txt
>>651 nice!
ソートの比較関数に関して、
Pythonはリストやタプルのデータでも比較してくれるので、
数値とそれ以外の文字のリストに分解すると、より簡潔になるよ。
ttp://codepad.org/eEXhZoJv 自分の場合は、画像の連番だったら桁数揃えてリネームしてる。
ファイル名にバージョン番号が付いてる場合だったら、
日付順ソートで目的の並びを得られる場合もあります。
## ディレクトリの中身を隣のpaneで覗き見する拡張機能です
# ./extension/peep_plugin.py
ttp://codepad.org/5v6F01eT プラグインの読み込みは
>>645 を参考に
# キーの設定
window.command_PeepDir にキーを割り当ててください
カーソル移動と併用して使えるように、左手で使えるキーへの割り当てをお勧めします。
# 使い方
ディレクトリの上で割り当てたキーを押すと、隣のPaneがその中の場所に移動します。
キーを離すと元の場所に戻ります。
※ 注意点
_onKeyUpをフックしてます。
_onKeyUpの利用が競合する人は何らかの対策が必要になるかもしれません。
>>645 のローダでは、プラグインを読む込む順序を保障できないので、その辺は今後の課題。
ジャンプリストで階層メニューを表示するサンプル
# ./extension/JumpList_plugin.py
ttp://codepad.org/J0Hx4Kxy 使い方などはスクリプト内のコメントを参考にしてください
ワンキー決定にしてるのは私の好みです
標準と同じようにエンターで決定するようにするには、onekey_decide=Trueの所をFalseにしてください
面倒臭いので上の階層には戻れませんw
ESCで閉じて最初から選び直せばいいと思うしw
ええで、ええで!
# ショートカットの作成
ttp://codepad.org/t6IU288b 手元の内骨格(version 2.10) では comtypes.shelllink が含まれていなかったので、
コメント中にあるURLよりファイルを./extension/shelllink.py に保存して下さい。
# Tips
ワン・キーで移動できる場所に、ショートカットを纏めておくと、
ディレクトリを利用して階層メニュー的な運用が出来ます。
>>657 ttp://codepad.org/LROhdKbx いろいろと弄ってみました。
内骨格本体と重複する部分を排除して、フック関数を差分のみに変更。
フックを元の関数の前・後を設定できるように・・どちらでも効果はかわりませんが、サンプルってことで。
# config.pyリロードに対応したプラグインのsetup関数について (プログラム書く人向け)
内骨格がconfig.pyリロード時にリセットしてくれない項目に関して、
例えばフック等の追加には、追加済みかどうかをどこかに覚えておく必要があります。
現状では、プラグイン・モジュールはリロードされずにsetup関数が呼ばれてる状態なので、
モジュールのグローバル変数が使えそうですが、プラグインのリロードをサポートした場合、
そのようなグローバル変数の使い方が出来なくなり、変更を強いられます。
とりあえず自分は、windowオブジェクトの属性に放り込んでいますが、
プラグインが増えてくると、この方法もあまり好ましくないので、
拡張機能の為に何らかの名前空間が欲しいところです。
※
>>653 の onKeyUp のフックは、config.pyのリロードに対応していません。
リロードする度に無駄に多くの onKeyUp 関数を呼び出すようになってしまう。=>内骨格の再起動で解消
※
>>658 は元のメソッドを呼び出さずに上書きしているので、このリロード対応の問題はありません。
>>659 訂正
文章末尾の >658 -> >657 でした
# Reload 対応
#
>>645 ./extension/plugin_manager.py
http://codepad.org/u1KCYTIk 但し、plugin_manger.py 自体はリロードされないので、
ファイルを更新後、内骨格を再起動してください。
(non-programmerな人向け)
Pythonでは通常モジュールをimportする時、
既に読み込み済みであれば、そのキャッシュを使う仕組みになってます。
このローダを使わず、独自にリロードを行いたい場合 組み込みのreload関数 を使えますが、
きちんとリロード処理しようとすると、読み込み済みかどうかの判定も必要になってきます。
ローダを使わない場合の方法では、モジュール自体はロードされずに、
setup(window)のみもう一度呼ばれることになる点を留意しておいて下さい。
----
#
>>653 ./extension/peep_plugin.py
http://codepad.org/Sp53BkXQ setupをconfig.py のリロードに対応
リロードすると、無限ループに陥ってた(汗
>>658 !!!
onenoteの運用に思うところがあって
これをリクエストしに久しぶりにこのスレきたんだよ!
ありがとうあとで試してみる
内骨格なんてあったなあと思って作者のサイトいったらpythonスクリプト対応とかで驚いた 作者の他のソフトみたらみんなPython関係だった これはもうPython勉強するしかないのか
Macで気に入るファイラーが無いからWineで動かして使ってる。 Wine上の内骨格からMacのアプリを呼び出せるしすこぶる快適。
>>664 マジで!?Macで使えんの!?
ワインなに?ワインボトラー?みくいんすとら?それともMacportsやHomebrewのワイン?
>>665 ボトラーでいけた。
msvcr90.dllが無いと起動しないので、vcredist_x86.exeのインストールは必須かも。
内骨格からMacのアプリも起動できるのだけど、WindowsのパスとMacのパスの変換は
してやらないと行けなかったので、アドホックは関数書いて対応。
でも、今日使っていたら日本語入力できないのに気がついた。
色って変えれんの? 拡張子によって色変えたい
2.18を使用してます。 mキーの挙動をカスタマイズしたいけどできない。 myCommandを定義して、 window.keymap[ 'm' ] = myCommand と書いても、mキーを押したらMakeDirが走る。 カスタマイズできてる人がいたら、どうやってるか教えてください。
書いてる場所が悪いんじゃないの configure関数の中に書かないとダメ 下の方はリストウィンドウ用の関数(configure_ListWindow)
>669 configureの中に書いてるんですけどねー。 やりたいことはファイル(やディレクトリ)を未選択の状態で m を押すと カーソルの位置のファイル(やディレクトリ)を逆のペインに移動させたいのです。 def command_Move(): if len(window.activeSelectedItems()) == 0: window.command_Select() window.command_Move() window.keymap[ 'm' ] = command_Move と書いてます。 cキーでのコピーはほぼ同じコードを書いて、未選択の状態で c を押すとちゃんとコピーしてくれる。 また、ファイルを選択した状態だと m を押すとcommand_Moveが走ってファイルの移動ができる。
window.keymap[ ckit.KeyEvent( ord('M'), 0, extra=0 ) ] = command_Move が正しいみたい extra=0が未選択状態、extra=1が選択有状態 設定メニューのキー割り当てが101もしくは106だと、この方法でmキーに二つのコマンドが割り当てられる仕組みの様子 自分は106afxにしてたから分からんかったw
>>670 ごく最近の更新でその辺の仕様が変わって、今はkeymapテーブルのキーとして文字列を
使うことになったみたい(古いやりかたもまだ一応動くけど、VK_HOMEみたいなのを
キーに使うとdeprecatedだと言われる)
cfiler_mainwindow.pyのconfigure()を見てみると雰囲気は分かる、さらに詳しくは
ckit_key.pyで文字列とWindowsの仮想キーコードのマッピングが行われている
その目的なら、キーとして'm'ではなく'M'を使えばいいはず
673 :
670 :2012/04/23(月) 19:17:24.25 ID:+KsecEZk0
>671,672 ありがとうございます。 window.keymap[ ckit.KeyEvent( ord('M'), 0, extra=0 ) ] = command_Move でいけました。 'M' はダメでした。
zipファイル内に「表」を含むファイル名があると、化けますな。 展開・仮想展開・圧縮、すべて化ける。
すでに内骨格が起動している状態で外部ツールから cfiler.exe -L"ディレクトリ" とかされたときに ディレクトリだけ移動してくれるようにはできないのかな。 二重起動させたくないんだけどやりかたありますか?
>>399 の拡張で希望な動作できました。
さきにログ読んでおくべきですね、すいません。
user_keymap.py 更新しました. KeyEvent->新しい仕様の文字を返すよう変更
このモジュールで読み込むキー表記は、新しい仕様の表記(S-X等)には対応してません
ttp://codepad.org/tVxlughC 本体側のkeymapが文字列に対応されたので,同様の機能はもっと簡単に実装できますね
今回は以前の設定を読み込んでエラー/警告が出ないようにするのみに留めておきます
>>675 7zipだと化けないみたいなので、簡単な対応方法
7zipのDLLを入手・配置した上で、.zip ファイルも 7zip を使うように設定。
# config.py configure関数内
import cfiler_filelist
cfiler_filelist.lister_Zip = cfiler_filelist.lister_Archive
681 :
675 :
2012/07/01(日) 00:17:32.60 ID:gs8hd3uN0 >>680 たった2行で修正できるということで、わけもわからずやってみましたら
ファイル名は化けなくなりました。
でもファイルの中身が正しく表示されなかったりなんだか怪しいです。
展開するとやっぱりおかしいので、内蔵のzipを扱う部分はあちこち
修正が必要みたいです。