Scripts discussion (3)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Lenchik
Проверил; ясно. Спасибо.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

VladSh wrote:Несколько пожеланий к скрипту backupVersion.js.
1. В известном случае вылетает сообщение "Не удалось определить версию файла!", а после него новое окно, в котором задаётся имя. /Добавлено: Кстати версию можно ещё попробовать определять из такой записи: "v3.9" (доки к плагам идут в таком формате) и в таком: "v.3.9" (я иногда так пишу)/.
Можно ли так сделать, чтобы вылетало одно окно, т.е. вышеуказанный текст из первого сообщения в этом случае вставлялся бы в текст окна? Вроде что-то помнится, что в штатном InputBox'е есть ограничение на то ли количество символов, то ли на одну строку... в таком случае можно ли вообще не выдавать первое сообщение? Если вылетел диалог с предлагаемым именем файла, то это и так понятно, что инфа о версии не найдена.
С -warnings=false теперь будет просто запрашивать новое имя.
Для версии без точки тоже подправил + небольшая распорка для ссылок со словами типа «version».
VladSh wrote:2. Добавить возможность задания в аргументах полного отключения вывода подтверждающего диалога, - выводить только сообщение о сохранении с именем файла (какое и сейчас выводится).
Речь о запросе
Файл «...» уже существует!
Перезаписать?
---------------------------
Да Нет Отмена
?
VladSh wrote:И заметил такую странность: сначала вызывал скрипт для файла в 13:10, затем в 13:14 и в 13:15, но приставка к названию бэкап-файла почему-то отаётся "_13-10".
Хм, это странно, там же или из файла вытаскивается, или текущее время используется.
Upd: Ой, я гоню :), берется дата модификации файла.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor
Просьба обновить TabSwitch.js (v.3.9) в Instructor.zip (там сейчас v.3.7).

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Infocatcher wrote:
VladSh wrote:2. Добавить возможность задания в аргументах полного отключения вывода подтверждающего диалога, - выводить только сообщение о сохранении с именем файла (какое и сейчас выводится).
Речь о запросе "Файл «...» уже существует! Перезаписать?"
И этот диалог тоже не хотелось бы. Он выдаёт то же имя файла, а лучше бы добавлял минуты что ли...

А вообще я имел в виду диалог, где выдаётся имя файла для сохранения.
Т.е. в идеале хочется полный silent-mode - каждый раз даётся уникальное имя файла (если версия не меняется, то надо просто дату в конце добавлять с минутами), а в конце выводится сообщение, что файл сохранён с таким-то именем и до свидания :)

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Вопрос ко всем не совсем по теме :)
Есть простенький скрипт:

Code: Select all

var pToolFileName = "AkelPad.exe";
var cmdLine = "d:\\Temp\\111.txt";
var AppShell = new ActiveXObject("shell.application");
AppShell.ShellExecute(pToolFileName, cmdLine);
из AkelPad'а он запускается идеально - файл открывается. /Также другие exe'шники, типа WinMerge и др. открываются без проблем./ Но если запустить этот же скрипт просто из файловой системы или из TotalCommander'а, то выдаёт ошибку, что типа "AkelPad не найден"...
Так и должно быть или это баг? И как с этим бороться?

Дополнение. Заметил, что у меня вообще скрипты из файловой системы не запускались, а при запуске открывались прямо в AkelPad'е. Тогда я сделал "открыть с помощью" и выбрал Wscript.exe. Скрипты запускаться стали, но возможно чего-то не доисправилось...

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

VladSh wrote:Вопрос ко всем не совсем по теме :)
Есть простенький скрипт:

Code: Select all

var pToolFileName = "AkelPad.exe";
var cmdLine = "d:\\Temp\\111.txt";
var AppShell = new ActiveXObject("shell.application");
AppShell.ShellExecute(pToolFileName, cmdLine);
...
Так и должно быть или это баг? И как с этим бороться?
Хмм... например, прописать папку, где расположен Akelpad.exe, в системную переменную PATH или запускать скрипт рядом с AP, ну или указать абсолютный путь в скрипте к Akelpad.exe...
Заодно, надо бы проверить содержание переменной PATHEXT...

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

YuS
Так и делаю - прописываю пути, но проблема в другом - ShellExecute работает только в AkelPad'е, и хотелось бы именно с этим разобраться...

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

VladSh
Может это банально, но попробуйте тормознуть файервол с антивирусом и посмотреть, что будет.

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

VladSh wrote:ShellExecute работает только в AkelPad'е, и хотелось бы именно с этим разобраться...
Имхо, если я правильно понял, то:
VladSh wrote:Но если запустить этот же скрипт просто из файловой системы или из TotalCommander'а, то выдаёт ошибку, что типа "AkelPad не найден"...
- результат запуска скрипта в системе? Если да, то ShellExecute отрабатывает, но найти не может AP и именно из-за:
VladSh wrote:

Code: Select all

var pToolFileName = "AkelPad.exe";
т.е. система не знает, что ей надо запустить...
А если же скрипт не отрабатывает совсем, то это уже надо копать систему, но здесь это обсуждать, наверное, всё таки, слишком оффтопично...

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

opk44
Не помогло.

YuS
Скрипт запускается.
т.е. система не знает, что ей надо запустить...
Когда из AkelPad'а я открываю WinMerge и указываю

Code: Select all

var pToolFileName = "WinMergeU.exe";
и оно почему-то знает как его открыть, а при запуске скрипта из файловой системы не знает?

Я где-то читал, что ShellExecute в отличие от WshShell.Exec производит поиск полного пути по имени exe-файла из веток реестра:

Code: Select all

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths
AkelPad'а по этим путям нет, зато есть WinMerge.
AkelPad есть здесь, но нет WinMerge:

Code: Select all

HKEY_CLASSES_ROOT\Applications
Короче правильные проги должны, по идее, прописывать себя в обе ветки.

Ребята, спасибо за неравнодушие к проблеме! 8)

P.S. Для проверки мой последний вариант

Code: Select all

///Comparison of current and selected files using WinMerge (http://winmerge.org/)
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=16379#p16379
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11455#p11455
// Version: 0.5.1 (2014.11.16)
// (с) se7h, VladSh
//
// Usage:
// 	-"Compare..." Call("Scripts::Main", 1, "WinMerge.js") Icon(pathToAnyIcon)		- searching for a path to WinMerge automatically (when WinMerge installed with registration in Windows)
// 	-"Compare..." Call("Scripts::Main", 1, "WinMerge.js", `-toolDir="d:\Programs\TotalCmd\UTILs\WinMerge\"`)      - takes a path from scripts Arguments (when WinMerge installed as portable), else searching a path automatically
//
// Dependencies:
// 	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 pToolFileName = "WinMergeU.exe";

var FILES = {};
var nFileCurIndex = getTabIndexCurrent();
if (nFileCurIndex > 1) nFileCurIndex = 1;
FILES[nFileCurIndex] = getCurrentFileWithSave();
if (!FILES[nFileCurIndex]) WScript.Quit();

var nFileOtherIndex = Number(!nFileCurIndex);
if (AkelPad.SendMessage(hWndMain, 1291 /*AKD_FRAMESTATS*/, 0 /*FWS_COUNTALL*/, 0) == 2) {
	//если открыто всего 2 файла, то будем передавать их
//	FILES[nFileOtherIndex] = getTabFileByIndex(nFileOtherIndex);	//MDI only
	FILES[nFileOtherIndex] = getTabFilePrev();	//MDI and PMDI
	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 = "\"" + FILES[0] + "\" \"" + FILES[1] + "\"";
	var pToolPath = AkelPad.GetArgValue("toolDir", "");
	if (pToolPath) {
		//сначала пытаемся взять из аргументов (возможно WinMerge был установлен как portable)
		pToolPath = getEnvironmentPath(pToolPath + pToolFileName);
		if (pToolPath) {
			cmdLine = "\"" + pToolPath + "\" " + cmdLine;
			var WshShell = new ActiveXObject("WScript.shell");
			WshShell.Exec(cmdLine);
			WScript.Quit();
		}
	}
	//для нормально инсталлированного WinMerge или когда портативный не был найден
	var AppShell = new ActiveXObject("shell.application");
	AppShell.ShellExecute(pToolFileName, cmdLine);
}

function getCurrentFileWithSave() {
	var pCurrentFile = AkelPad.GetEditFile(0);
	if (!pCurrentFile) {
		//если файл не сохранён, пытаемся его сохранить
		AkelPad.Command(4105);
		pCurrentFile = AkelPad.GetEditFile(0);
	}
	return pCurrentFile;
}


Добавлено:
Ура, победа!
Прописал с помощью reg-файла:

Code: Select all

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AkelPad.exe]
@="C:\\Program Files (x86)\\AkelPad\\AkelPad.exe"
"Path"="C:\\Program Files (x86)\\AkelPad\\"
и заработало! Теперь открывает при запуске скрипта из файловой системы!

Ребята, проверьте пожалуйста у кого не портативная, а инсталлированная версия, есть ли такой ключ реестра?

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

VladSh

С winMergeTabs.js от Infocatcher скрипту можно тоже указать путь, либо он сам ищет, причём в первую очередь ищет в

Code: Select all

"<HKCU\\Software\\Thingamahoochie\\WinMerge\\Executable>"
т.к. если WinMerge пишет в реестр, в этом ключе обязательно будет путь к исполняемому файлу. У меня, например, распакованный дистриб и в \Microsoft\Windows\CurrentVersion\App Paths WinMergeU.exe нет.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher wrote:Просьба обновить TabSwitch.js (v.3.9) в Instructor.zip (там сейчас v.3.7).
Архив будет обновлен после релиза 4.9.1 с версией TabSwitch.js 4.0.

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

VladSh wrote: Я где-то читал, что ShellExecute в отличие от WshShell.Exec производит поиск полного пути по имени exe-файла из веток реестра:

Code: Select all

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths
Ну, да, или так... но кроме того, всё же, ищет и через PATH

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Кстати, насчет TabSwitch.js.
Неужели только я заметил, что с версии v.3.9 окошко TabSwitch по нажатию Ctrl+Tab появляется не посередине окна редактирования, а со сдвигом вправо и вниз?
Я так понимаю, причиной являются строки "rcMain.left+=" и "rcMain.top+=", где раньше стояло "=" вместо "+=".

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

DV
В TabSwitch.js 4.0 такого не наблюдаю. Возможно последствия перетаскивания кусков кода из новой версии скрипта.
Locked