/* * 最近または最後に閉じたファイルを開く秀丸マクロ (ファイルヒストリ利用) * * Ver.2.3 (2013-08-27) * * 機能 * - 秀丸エディタのファイルヒストリには既に開いているファイルも表示されますが、 * このマクロを利用するとそれらを除外した「閉じられている」ファイルの一覧から * 開きたいファイルを選択できます。 * * - このマクロが実行されたときに特定のキーが押されていたかどうかに応じて * 以下のどちらかの機能が実行されます。 * * - 最後に閉じたファイルを開く * - 最近閉じたファイルの一覧を表示する * * デフォルトの設定では、Alt キーが押されている場合に後者の処理が行われます。 * * Yasunori Miyamoto * http://tipszone.jp/20130329_open_closed_file/ * mailto: nori@tipszone.jp */ // このマクロが実行された時にここで設定したキーが押されていた場合、 // 閉じたファイルのリストが表示され、その中から開くファイルを選択できます。 // そうでない場合は最後に閉じたファイルが開かれます。 // // Shift: 0x10 上: 0x26 下: 0x28 0〜9: 0x30〜0x39 // Ctrl : 0x11 左: 0x25 右: 0x27 A〜Z: 0x41〜0x5A // Alt : 0x12 ※詳しくは秀丸エディタマクロヘルプの iskeydown の項目を参照 #code = 0x12; // 一度にリスト表示するファイル数 #limit = 35; if (iskeydown(#code)) { ##page = 0; #seek = 0; // 次のページのファイルヒストリ読み込み開始位置 while (true) { call SHOW_CLOSED_FILES ##page; if (##return == 0) break; if (##return == 1) { if (##page == 0) break; ##page = ##page - 1; continue; } if (##return == #limit + 4) { ##page = ##page + 1; continue; } // ファイルを開く $$file = $list[##page][##return - 1]; ##i = strrstr($$file, "\t"); if (0 < ##i) $$file = leftstr($$file, ##i); call OPENFILE_EX $$file; if (##return) break; } } else { call OPEN_CLOSED_FILE; } endmacro; // ファイルヒストリの中で秀丸エディタで開いていないものを表示する。 // $list[#page] と #page_size[#page] に各ページの表示内容とサイズをキャッシュする。 // Param: integer ページ番号(0 から数える) // Return: 選択された項目の番号 SHOW_CLOSED_FILES: ##page = ##1; if ($list[##page][0] == "") { // ファイルヒストリ取得 ##i = #seek[##page]; ##size = 0; while (true) { $$file = getfilehist(##i); ##i = ##i + 1; if ($$file == "") break; if (filename2 == $$file || 0 < findhidemaru($$file) || (!existfile($$file))) continue; ##size = ##size + 1; if (##size < 10) $$file = $$file + "\t&" + str(##size); else if (##size < 36) $$file = $$file + "\t&" + char(55 + ##size); $list[##page][##size + 1] = $$file; if (#limit == ##size) break; } #seek[##page + 1] = ##i; // ヘッダー if (##page == 0) { $list[##page][0] = "閉じたファイルの一覧"; } else { $list[##page][0] = "前のページ\t&<<"; } $list[##page][1] = "\x01"; // フッター if (##size == #limit && getfilehist(##i) != "") { $list[##page][#limit + 2] = "\x01"; $list[##page][#limit + 3] = "次のページ\t&>>"; #page_size[##page] = #limit + 4; } else { #page_size[##page] = ##size + 2; } } mousemenuarray $list[##page], #page_size[##page]; return result; // 最後に閉じたファイルを開く OPEN_CLOSED_FILE: ##i = 0; while (true) { $$file = getfilehist(##i); ##i = ##i + 1; if ($$file == "") break; if (filename2 == $$file || 0 < findhidemaru($$file) || (!existfile($$file))) continue; call OPENFILE_EX $$file; break; } return; // 指定されたファイルを開く。 // また、ファイルを開いた直後の自動起動マクロが設定されている場合にはそれを実行する。 // Param: string 開くファイルのパス // Return: ファイルを開くことに成功した場合は true, そうでなければ false OPENFILE_EX: if (!existfile($$1)) { message "ファイルが存在しません。\n\n" + $$1; return false; } openfile $$1; if (!result) return false; call EXEC_EVENT_MACRO "Opened"; return true; // 引数で指定した種類の自動起動マクロを実行する。 // 自動起動マクロが登録されていない場合には何もしない。 // ※このサブルーチンを実行するとレジストリが閉じられます。 // Param: string 自動起動マクロの設定を保持しているレジストリのキー名から // "EventMacro" プレフィックスを取り除いた文字列 EXEC_EVENT_MACRO: openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env"; if (!result) return; $$macro = getregstr("EventMacro" + $$1); closereg; if ($$macro == "") return; execmacro $$macro; return;