Добавлен FileTabs.js для использования в WinMerge.js, но, думаю, он под дальнейшие потребности будет расширяться; возможно в дальнейшем переделаю на "класс".
P.S. Спасибо всем, кто помогал, и у кого я натырил кода))
Где-то неделю мучались.. у меня всё работает, а у se7h нет. Может быть кто-то поможет понять, в чём тут дело?
В чём суть доработки:
• Когда в проге открыто всего лишь 2 вкладки, то они должны сразу же передаваться в WinMerge, без выдачи диалога выбора 2-го файла, иначе будет выдаваться диалог.
• Если хоть один файл не сохранён, то эта вкладка должна автоматически активироваться и производиться запрос на сохранение файла, после чего оба файла передаются в WinMerge.
• Файлы в WinMerge должны передаваться в той последовательности, в которой они расположены в AkelPad'е и не зависеть от того, какая вкладка сейчас активирована.
/// WinMerge v0.5.0
// (с) se7h, VladSh
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11455#p11455
//
// Comparison of current and selected files using WinMerge (http://winmerge.org/)
//
// Usage in Toolbar/ContextMenu plugin:
// -"Compare with file..." Call("Scripts::Main", 1, "WinMerge.js") Icon(pathToAnyIcon) - searching for a path to WinMerge automatically
// -"Compare with file..." Call("Scripts::Main", 1, "WinMerge.js", `"d:\Programs\TotalCmd\UTILs\WinMerge\"`) - takes a path from scripts Arguments, else searching a path automatically
//
// FileTabs.js you found here: http://akelpad.sourceforge.net/forum/viewtopic.php?p=16297#p16297
// CommonFunctions.js - here: http://akelpad.sourceforge.net/forum/viewtopic.php?p=1582#p1582
if (!AkelPad.GetMainWnd()) WScript.Quit();
if (!AkelPad.Include("FileTabs.js")) WScript.Quit();
if (!AkelPad.Include("CommonFunctions.js")) WScript.Quit();
var WshShell = new ActiveXObject("WScript.shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var FILES = {};
var nFileCurIndex = getTabIndexCurrent();
if (nFileCurIndex > 1) nFileCurIndex = 1;
FILES[nFileCurIndex] = getCurrentFileWithSave();
if (!FILES[nFileCurIndex]) WScript.Quit();
var pToolFileName = "WinMergeU.exe";
var pToolPath = "";
if (WScript.Arguments.length) //сначала пытаемся взять из аргументов
pToolPath = getEnvironmentPath(WScript.Arguments(0) + pToolFileName);
if (!pToolPath)
{
try {
//ищем по записи в реестре
pToolPath = WshShell.RegRead("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\" + pToolFileName + "\\");
if (pToolPath)
pToolPath = getEnvironmentPath(pToolPath);
} catch(e) {}
if (!pToolPath)
{
//ищем в путях по системмным переменным
var appPaths = ["%ProgramFiles%\\WinMerge\\", "%ProgramFiles (x86)%\\WinMerge\\"];
var p = 0;
do
{
pToolPath = getEnvironmentPath(appPaths[p] + pToolFileName);
if (pToolPath) break;
p += 1;
}
while (p < appPaths.length)
if (!pToolPath)
{
//ищем в стандартных путях по доступным локальным дискам
appPaths = [":\\Program Files\\WinMerge\\", ":\\Program Files(x86)\\WinMerge\\"];
var disks = getDrivesList();
for (var d = 0; d < disks.length; d++)
{
p = 0;
do
{
pToolPath = getEnvironmentPath(disks[d] + appPaths[p] + pToolFileName);
if (pToolPath) break;
p += 1;
}
while (p < appPaths.length)
if (pToolPath) break;
}
if (!pToolPath)
{
AkelPad.MessageBox(hWndMain, "Application WinMerge was not found!", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
WScript.Quit();
}
}
}
}
var nFileOtherIndex = Number(!nFileCurIndex);
if (AkelPad.SendMessage(hWndMain, 1291 /*AKD_FRAMESTATS*/, 0 /*FWS_COUNTALL*/, 0) == 2) //если открыто всего 2 файла, то будем передавать их
{
FILES[nFileOtherIndex] = getTabFileByIndex(nFileOtherIndex);
if (!FILES[nFileOtherIndex]) //если файл новый, переходим на его вкладку чтобы попытаться сохранить
{
// AkelPad.Command(4316 /*IDM_WINDOW_FRAMENEXT*/);
activateTabByIndex(nFileOtherIndex);
FILES[nFileOtherIndex] = getCurrentFileWithSave();
}
}
else //если открыто не 2 файла, то в утилиту будем передавать текущий и выбранный в диалоге открытия файла
{
FILES[nFileOtherIndex] = FILES[nFileCurIndex];
FILES[nFileCurIndex] = FileDialogDefault(true, FILES[nFileCurIndex], GetFileExt(FILES[nFileCurIndex]));
}
if (FILES[nFileOtherIndex])
{
var cmdLine = "\"" + pToolPath + "\" \"" + FILES[0] + "\" \"" + FILES[1] + "\"";
WshShell.Exec(cmdLine);
}
//VladSh by MSDN :)
function getDrivesList()
{
var e = new Enumerator(fso.Drives);
var x;
var i = 0;
var disks = [];
for (; !e.atEnd(); e.moveNext())
{
x = e.item();
if (x.DriveType == 3 && x.IsReady)
{
disks[i] = x.DriveLetter;
i += 1;
}
}
return disks;
}
function getEnvironmentPath(paths)
{
var path = WshShell.ExpandEnvironmentStrings(paths);
if (fso.FileExists(path)) return path;
return "";
}
function getCurrentFileWithSave()
{
var pCurrentFile = AkelPad.GetEditFile(0);
if (!pCurrentFile) //если файл не сохранён, пытаемся его сохранить
{
AkelPad.Command(4105);
pCurrentFile = AkelPad.GetEditFile(0);
}
return pCurrentFile;
}
Posted: Sun Jan 01, 2012 1:39 pm
by zoog
плз, подскажите, как пользоваться keyboard.js? или направьте в раздел, где задаются такие вопросы)
Posted: Sun Jan 01, 2012 8:22 pm
by DV
zoog wrote:плз, подскажите, как пользоваться keyboard.js?
Запускать из-под плагина Scripts, для выделенного текста.
crypt.js
Removed forgotten speed tests.
Improved "busy" indication – Ok and Apply buttons now disabled during encryption/decryption.
Fixed: double click on radio buttons did not work in modal mode.
FeyFre wrote:Updated history.js
A whole bunch of new features.
Только по нему вообще ничего непонятно - открывается узкая панелька без подсказок, внизу перечислены какие-то комбинации клавиш (ну потом вчитываясь в историю изменений, что-то понять можно, только все равно не реагируют). Когда прописываются ассоциации в списке Hotkeys плагина, хорошо бы чтобы к названиям была приписка "history.js". Кнопочки у полей панели непонятно что дают. Да и насчет полей непонятно. И что нужно ожидать от самого большого поля или списка?
Posted: Wed Jan 04, 2012 4:09 pm
by FeyFre
Только по нему вообще ничего непонятно
Назначение скрипта написано: позволяет восстановить закрытые ранее документы. Значит нужно что-бы хоть один был закрыт. Ну а дальше можно разобраться.
открывается узкая панелька
Мышку в руки и расширить сколько угодно. И даже передвинуть в другую сторону.
хорошо бы чтобы к названиям была приписка "history.js"
Названия вполне говорящие. Кому надо, тот может в скрипте подправить.
только все равно не реагируют
Странно что вы ожидаете что-бы воздух горел. Ведь топливо тоже должно быть, правда?
Posted: Wed Jan 04, 2012 5:03 pm
by Lenchik
FeyFre wrote:позволяет восстановить закрытые ранее документы. Значит нужно что-бы хоть один был закрыт.
Методом тыка выяснил, что востанавливаемые документы должны быть закрытыми после запуска скрипта.
И соответственно вопрос, как сделать так, чтобы скрипт запускался автоматически с самим акельпадом?
FeyFre wrote:Кому надо, тот может в скрипте подправить.
Учитывая, что некоторым удобно выкачивать обновления скрипта автоматизированно, не хотелось бы править после каждого обновления скрипта.