Scripts discussion (4)

Discuss and announce AkelPad plugins
  • Author
  • Message
Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

AZJIO wrote:opk44
Это описание AutoIt есть на русском, как и вся справка (уровнем выше).
1. Во-первых я не использую AutoIT (немного AHK не в счёт).
2. Во-вторых, как уже писал ранее, технический перевод - это не самая сильная ваша сторона.
Оригинал:
replace all files using batch #2 without confirmation and message, next close dialog
AZJIO "перевод":
заменить все файлы, используя пакет #2 без подтверждений и сообщений, следующий диалог закрытия
И если всё равно придётся лезть в первоисточник, чтобы понять "от какой курицы яйца", то быстрее будет сразу взять словарь и читать оригинал.

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

opk44 wrote:технический перевод - это не самая сильная ваша сторона.
Проблема в то что я не только переводил как переводчики делают, а ещё и тестировал, то есть проверял, действительно ли поведение соответствует написанному. Поэтому мне как бы приходилось исправлять не только орфографические ошибки, но ещё и смысловые. Причём выкладывал я их десятками, на тысячу точно наберётся, можете полистать эту тему Причём, англоязычный перевод, он всё равно является переводом, мы так не говорим, поэтому мне ещё и приходилось по второму кругу переводить, когда уже через время перечитывал прочитанное. А также был человек, который, скрупулёзно изучая, просил исправить или уточнить там где были не стыковки, причём не стыковки вызванные не переводом, а отсутствием уточнений. Также я перевёл 90%, то что переводил не я указано на странице "от переводчика". Также я добавлял допустим для "Number" правила преобразования, которых не было в оригинале. При сравнении сравнивайте перевод той версии, которую я переводил, а не той новой, в которой всё исправлено.
opk44 wrote:AZJIO "перевод":
заменить все файлы, используя пакет #2 без подтверждений и сообщений, следующий диалог закрытия
не смог найти где это написано, хотя поиск по справке работает.

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

Post by DV »

CommandPalette.js
Версия 0.2:
- теперь Ctrl+Backspace удаляет предыдущее слово, а не вставляет странный символ;
- алгоритм нечёткой фильтрации немного улучшен;
- добавлен перевод команд на русский язык (благодаря AZJIO).

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

Post by opk44 »

AZJIO wrote:не смог найти где это написано, хотя поиск по справке работает.
AkelPad.chm ==> js_FindReplaceEx.htm

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

Post by opk44 »

DV
/*
CommandPalette.js
Language: Russian (1049)
*/
...
Cmd_4333 = "Окно: Перейти к предыдующему диалоговому окну";
...
предыдующему ==> предыдущему

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

opk44 wrote:всё равно придётся лезть в первоисточник
чтобы что? увидеть там тот же текст только на английском?

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

Post by opk44 »

AZJIO wrote:
opk44 wrote:всё равно придётся лезть в первоисточник
чтобы что? увидеть там тот же текст только на английском?
Т. е. вы действительно не понимаете и настаиваете что в данном переводе всё хорошо?
Оригинал:
replace all files using batch #2 without confirmation and message, next close dialog
AZJIO "перевод":
заменить все файлы, используя пакет #2 без подтверждений и сообщений, следующий диалог закрытия
Ну тогда мне вас искренне жаль.

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

DV
Что на счёт скриптов? Мне кажется расширить возможности поиска было бы очень заметно. Например скрипт по работе с закладками имеет 40 пунктов меню. Скрипт можно выполнить из другого скрипта. Может добавить их?

Нельзя ли сделать 3 массива:
1. Массив команд AkelPad
2. Массив команд плагов
3. Массив команд скриптов
и три последовательных цикла обработки. Вроде как не понадобится целый столбик под "ID_PLUGIN"

Формат для плагов
["Clipboard::Capture", "Название пункта меню" ],

Формат для скриптов:
["FindReplaceEx.js", '-dlg="R"', "Открыть диалог замены Ctrl+H" ],

Зачем делать массив в скрипте, если можно генерировать его используя CommandPalette_nnnn.lng? Сделать файл обязательным, при отсутствии выдавать мессагу, при отсутствии данных пустой массив, циклы игнорируют.
Формат

Code: Select all

[Commands]
Cmd_4101 = "Файл: Новый   Ctrl+N";

[Plugins]
Clipboard_Capture = "Название пункта меню";

[Scripts]
FindReplaceEx = -dlg="R"|Открыть диалог замены Ctrl+H
Ну или собственный формат, главное чтобы анализировать не сложно и читабельный

Code: Select all

{
4101=Файл: Новый   Ctrl+N
4113=Файл: Печать
}
{
Clipboard::Capture=Название
Exit::Main=Название2
}
{
FindReplaceEx|-dlg="R"|Открыть диалог замены Ctrl+H
}

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

Post by DV »

CommandPalette.js
Версия 0.3:
- новое поколение скрипта, в котором наличие файла "CommandPalette.lng" является обязательным, так как именно из него берутся списки доступных команд;
- теперь для команд отображаются также "горячие клавиши".

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

DV
Нельзя ли сделать через чтобы в листбокс добавлялся например номер списка команд и текст меню
[1] Файл: Новый\tCtrl+N
...
[50] Coder::Settings
...
[150] Search.js
Если мы кликаем по пункту меню, то получаем индекс (1 или 50 или 150) далее в массиве берём 3 ячейки двумерного массива принадлежащие индексу например 50 и эти команды внутри используем как контент необходимый для запуска.
Я тут играл играл и наиграл

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=34456#p34456
// Version: 0.3
// Author: Vitaliy Dovgan aka DV... Модернизировал AZJIO
//
// *** Command Palette: AkelPad's and Plugins' commands ***
//
// Description(1049): Быстрый поиск пунктов меню по мере набора части текста и их выполнение
// Добавил Exec
//
var ShowCmdIds = true; // true -> "[4153] Edit: Cut", false -> "Edit: Cut"
var ID_PLUGIN = -1;
var ID_SCRIPT = -2;
var Commands = [];
// var Commands1 = [];

// Windows Messages...
var WM_CREATE = 0x0001;
var WM_DESTROY = 0x0002;
var WM_SETFOCUS = 0x0007;
var WM_SETREDRAW = 0x000B;
var WM_CLOSE = 0x0010;
var WM_SETFONT = 0x0030;
var WM_GETFONT = 0x0031;
var WM_KEYDOWN = 0x0100;
var WM_CHAR = 0x0102;
var WM_SYSKEYDOWN = 0x0104;
var WM_COMMAND = 0x0111;
var EM_GETSEL = 0x00B0;
var EM_SETSEL = 0x00B1;
var EM_REPLACESEL = 0x00C2;
var LB_ADDSTRING = 0x0180;
var LB_RESETCONTENT = 0x0184;
var LB_SETCURSEL = 0x0186;
var LB_GETCURSEL = 0x0188;
var LB_GETTEXT = 0x0189;
var LB_GETITEMDATA = 0x0199;
var LB_SETITEMDATA = 0x019A;
var LBN_DBLCLK = 2;

// Windows Constants...
var TRUE = 1;
var FALSE = 0;
var VK_BACK = 0x08; // BackSpace
var VK_TAB = 0x09;
var VK_RETURN = 0x0D; // Enter
var VK_CONTROL = 0x11; // Ctrl
var VK_ESCAPE = 0x1B;
var VK_PRIOR = 0x21; // Page Up
var VK_NEXT = 0x22; // Page Down
var VK_END = 0x23;
var VK_HOME = 0x24;
var VK_LEFT = 0x25;
var VK_UP = 0x26;
var VK_RIGHT = 0x27;
var VK_DOWN = 0x28;
var VK_DELETE = 0x2E;
var SW_SHOWNA = 8;
var SW_RESTORE = 9;
var DEFAULT_GUI_FONT = 17;
var MB_OK = 0x0000;
var MB_ICONERROR = 0x0010;
var MB_ICONWARNING = 0x0030;

var WS_TABSTOP = 0x00010000;
var WS_SYSMENU = 0x00080000;
var WS_HSCROLL = 0x00100000;
var WS_VSCROLL = 0x00200000;
var WS_BORDER = 0x00800000;
var WS_CAPTION = 0x00C00000;
var WS_VISIBLE = 0x10000000;
var WS_CHILD = 0x40000000;
var WS_POPUP = 0x80000000;
var ES_AUTOHSCROLL = 0x0080;
var LBS_NOTIFY = 0x0001;
var LBS_SORT = 0x0002;
var LBS_USETABSTOPS = 0x0080;

var LANGID_FULL = 0;
var LANGID_PRIMARY = 1;
var LANGID_SUB = 2;

// AkelPad Constants...
var DT_ANSI = 0;
var DT_UNICODE = 1;
var DT_QWORD = 2;
var DT_DWORD = 3;
var DT_WORD = 4;
var DT_BYTE = 5;

// The Program...
var oSys = AkelPad.SystemFunction();
var hInstDLL = AkelPad.GetInstanceDll();
var sClassName = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
var hWndDlg;
var hWndFilterEdit;
var hWndCommandsListBox;
var hSubclassFilterEdit;
var hSubclassCommandsListBox;
var sCmdFilter = "";
var sCmdFilter0 = "";
var nCmdIndex = -1;
var nCmdIndex0 = -1;

ReadLngFile();

if (hWndDlg = oSys.Call("User32::FindWindowEx" + _TCHAR, 0, 0, sClassName, 0)) {
	if (!oSys.Call("User32::IsWindowVisible", hWndDlg))
		oSys.Call("User32::ShowWindow", hWndDlg, SW_SHOWNA);
	if (oSys.Call("User32::IsIconic", hWndDlg))
		oSys.Call("User32::ShowWindow", hWndDlg, SW_RESTORE);

	oSys.Call("User32::SetForegroundWindow", hWndDlg);
} else {
	var sScripName = "Command Palette";
	var ActionItem = undefined;

	var ID = 0;
	var CLASS = 1;
	var HWND = 2;
	var EXSTYLE = 3;
	var STYLE = 4;
	var X = 5;
	var Y = 6;
	var W = 7;
	var H = 8;
	var TXT = 9;

	var aWnd = [];
	var IDC_ED_FILTER = 1011;
	var IDC_LB_ITEMS = 1021;

	var hGuiFont;
	var hWndEdit = AkelPad.GetEditWnd();
	var hFontEdit = AkelPad.SendMessage(hWndEdit, WM_GETFONT, 0, 0);
	if (hFontEdit) {
		hGuiFont = hFontEdit;
	} else {
		hGuiFont = oSys.Call("Gdi32::GetStockObject", DEFAULT_GUI_FONT);
	}

	var nDlgWidth = 600;
	var nDlgHeight = 570;

	var hMainWnd = AkelPad.GetMainWnd();
	var rectWnd = GetWindowRect(hMainWnd);

	var nEdStyle = WS_VISIBLE | WS_CHILD | WS_TABSTOP | ES_AUTOHSCROLL;
	var nLbStyle = WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_BORDER | WS_TABSTOP | LBS_USETABSTOPS | LBS_NOTIFY;
	//Windows          ID,  CLASS,     HWND,EXSTYLE,   STYLE,   X,   Y,   W,   H, TXT
	aWnd.push([IDC_ED_FILTER, "EDIT", 0, 0, nEdStyle, 2, 4, -1, 20, ""]);
	aWnd.push([IDC_LB_ITEMS, "LISTBOX", 0, 0, nLbStyle, 2, 26, -1, -1, ""]);

	ReadWriteIni(false);
	AkelPad.ScriptNoMutex(0x11 /*ULT_LOCKSENDMESSAGE|ULT_UNLOCKSCRIPTSQUEUE*/ );
	AkelPad.WindowRegisterClass(sClassName);

	hWndDlg = oSys.Call("User32::CreateWindowEx" + _TCHAR,
		0, // dwExStyle
		sClassName, // lpClassName
		sScripName, // lpWindowName
		WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU, // style
		rectWnd.X + Math.floor((rectWnd.W - nDlgWidth) / 2), // x
		rectWnd.Y + 40, // y
		nDlgWidth, // nWidth
		nDlgHeight, // nHeight
		hMainWnd, // hWndParent
		0, // ID
		hInstDLL, // hInstance
		DialogCallback); // Script function callback. To use it class must be registered by WindowRegisterClass.

	AkelPad.WindowGetMessage();
	AkelPad.WindowUnregisterClass(sClassName);

	if (ActionItem != undefined) {
		oSys.Call("User32::SetFocus", hMainWnd);
		// if (ActionItem[0] == ID_PLUGIN)
		var idx = ActionItem[0]
		// WScript.Echo('=' + idx);
		// WScript.Echo('0 = ' + ActionItem[0] + '\n1 = ' + ActionItem[1]);
				// WScript.Echo('0 = ' + Commands[idx][0] + '\n1 = ' + Commands[idx][1] + '\n2 = ' + Commands[idx][2] + '\n3 = ' + Commands[idx][3]);
				// WScript.Echo('0 = ' + Commands[idx][0] + '\n1 = ' + Commands[idx][1] + '\n2 = ' + Commands[idx][2]);
				// WScript.Quit();
		if (/^\d\d\d\d$/g.test(Commands[idx][2])) {
			// AkelPad.Command(ActionItem[0]);
			AkelPad.Command(Commands[idx][2]);
		} else if (/^\w+::\w+$/g.test(Commands[idx][2])) {
			AkelPad.Call(Commands[idx][2]);
		} else if (/^\w+?.js$/g.test(Commands[idx][2])) {
			AkelPad.Call("Scripts::Main", 1, Commands[idx][2], Commands[idx][3]);
		} else if (/^ex$/g.test(Commands[idx][3])) {
			AkelPad.Exec(Commands[idx][2]);
		}
	}
}

function IsCtrlPressed() {
	return oSys.Call("User32::GetKeyState", VK_CONTROL) & 0x8000;
}

function DialogCallback(hWnd, uMsg, wParam, lParam) {
	if (uMsg == WM_CREATE) {
		var i;
		var w, h;
		var rectClient;
		var hLbWnd;

		rectClient = GetClientRect(hWnd);

		for (i = 0; i < aWnd.length; ++i) {
			w = (aWnd[i][W] < 0) ? (rectClient.W - 2 * aWnd[i][X]) : aWnd[i][W];
			h = (aWnd[i][H] < 0) ? (rectClient.H - aWnd[i][Y]) : aWnd[i][H];
			aWnd[i][HWND] =
				oSys.Call("User32::CreateWindowEx" + _TCHAR,
					aWnd[i][EXSTYLE], //dwExStyle
					aWnd[i][CLASS], //lpClassName
					0, //lpWindowName
					aWnd[i][STYLE], //dwStyle
					aWnd[i][X], //x
					aWnd[i][Y], //y
					w, //nWidth
					h, //nHeight
					hWnd, //hWndParent
					aWnd[i][ID], //ID
					hInstDLL, //hInstance
					0); //lpParam

			SetWndFont(aWnd[i][HWND], hGuiFont);
		}

		hWndFilterEdit = oSys.Call("User32::GetDlgItem", hWnd, IDC_ED_FILTER);
		hWndCommandsListBox = oSys.Call("User32::GetDlgItem", hWnd, IDC_LB_ITEMS);

		if (sCmdFilter == "") {
			FillCommandsListBox(hWndCommandsListBox, undefined);
		} else {
			oSys.Call("User32::SetWindowTextW", hWndFilterEdit, sCmdFilter);
			i = sCmdFilter.length;
			AkelPad.SendMessage(hWndFilterEdit, EM_SETSEL, 0, -1);
			FillCommandsListBox(hWndCommandsListBox, sCmdFilter);
		}
		if (nCmdIndex != -1) {
			AkelPad.SendMessage(hWndCommandsListBox, LB_SETCURSEL, nCmdIndex, 0);
		}
		oSys.Call("User32::SetFocus", hWndFilterEdit);

		hSubclassFilterEdit = AkelPad.WindowSubClass(hWndFilterEdit, FilterEditCallback);
		hSubclassCommandsListBox = AkelPad.WindowSubClass(hWndCommandsListBox, CommandsListBoxCallback);
	} else if (uMsg == WM_KEYDOWN) {
		if (wParam == VK_ESCAPE) {
			sCmdFilter = "";
			nCmdIndex = -1;
			oSys.Call("User32::PostMessage" + _TCHAR, hWnd, WM_CLOSE, 0, 0);
		} else if (wParam == VK_RETURN) {
			ActionItem = GetLbCurSelItem(hWndCommandsListBox);
			oSys.Call("User32::PostMessage" + _TCHAR, hWnd, WM_CLOSE, 0, 0);
		}
	} else if (uMsg == WM_COMMAND) {
		if (HIWORD(wParam) == LBN_DBLCLK) {
			if (LOWORD(wParam) == IDC_LB_ITEMS) {
				ActionItem = GetLbCurSelItem(hWndCommandsListBox);
				oSys.Call("User32::PostMessage" + _TCHAR, hWnd, WM_CLOSE, 0, 0);
			}
		}
	} else if (uMsg == WM_CLOSE) {
		ReadWriteIni(true);
		oSys.Call("User32::DestroyWindow", hWnd); // Destroy dialog
	} else if (uMsg == WM_DESTROY) {
		oSys.Call("User32::PostQuitMessage", 0); // Exit message loop
	}

	return 0;
}

function FilterEditCallback(hWnd, uMsg, wParam, lParam) {
	if (uMsg == WM_KEYDOWN) {
		if ((wParam == VK_BACK) || (wParam == VK_DELETE)) {
			if ((wParam == VK_BACK) && IsCtrlPressed()) {
				var n1, n2;
				n2 = LOWORD(AkelPad.SendMessage(hWnd, EM_GETSEL, 0, 0));
				AkelPad.WindowNextProc(hSubclassFilterEdit, hWnd, uMsg, VK_LEFT, 0);
				n1 = LOWORD(AkelPad.SendMessage(hWnd, EM_GETSEL, 0, 0));
				AkelPad.SendMessage(hWndFilterEdit, EM_SETSEL, n1, n2);
				AkelPad.SendMessage(hWndFilterEdit, EM_REPLACESEL, 1, "");
			} else
				AkelPad.WindowNextProc(hSubclassFilterEdit, hWnd, uMsg, wParam, lParam);

			sCmdFilter = GetWindowText(hWnd);
			FillCommandsListBox(hWndCommandsListBox, sCmdFilter);

			AkelPad.WindowNoNextProc(hSubclassFilterEdit);
			return 0;
		}
		if ((wParam == VK_DOWN) || (wParam == VK_UP) ||
			(wParam == VK_PRIOR) || (wParam == VK_NEXT)) {
			AkelPad.SendMessage(hWndCommandsListBox, uMsg, wParam, lParam);

			AkelPad.WindowNoNextProc(hSubclassFilterEdit);
			return 0;
		}
	} else if (uMsg == WM_CHAR) {
		if ((wParam == 0x7F) && IsCtrlPressed()) // 0x7F is Ctrl+Backspace. Why? Ask M$
		{
			// do nothing
		} else {
			AkelPad.WindowNextProc(hSubclassFilterEdit, hWnd, uMsg, wParam, lParam);

			sCmdFilter = GetWindowText(hWnd);
			FillCommandsListBox(hWndCommandsListBox, sCmdFilter);
		}

		AkelPad.WindowNoNextProc(hSubclassFilterEdit);
		return 0;
	}
}

function CommandsListBoxCallback(hWnd, uMsg, wParam, lParam) {
	if (uMsg == WM_KEYDOWN) {
		if ((wParam == VK_DOWN) || (wParam == VK_UP) ||
			(wParam == VK_PRIOR) || (wParam == VK_NEXT) ||
			(wParam == VK_HOME) || (wParam == VK_END)) {
			// default processing
		} else {
			AkelPad.SendMessage(hWndFilterEdit, uMsg, wParam, lParam);
			oSys.Call("User32::SetFocus", hWndFilterEdit);
			AkelPad.WindowNoNextProc(hSubclassCommandsListBox);
			return 0;
		}
	} else if (uMsg == WM_CHAR) {
		AkelPad.SendMessage(hWndFilterEdit, uMsg, wParam, lParam);
		oSys.Call("User32::SetFocus", hWndFilterEdit);
		AkelPad.WindowNoNextProc(hSubclassCommandsListBox);
		return 0;
	}
}

function GetWindowRect(hWnd) {
	var oRect = new Object();
	var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)

	oSys.Call("User32::GetWindowRect", hWnd, lpRect);

	oRect.X = AkelPad.MemRead(_PtrAdd(lpRect, 0), DT_DWORD);
	oRect.Y = AkelPad.MemRead(_PtrAdd(lpRect, 4), DT_DWORD);
	oRect.W = AkelPad.MemRead(_PtrAdd(lpRect, 8), DT_DWORD) - oRect.X;
	oRect.H = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD) - oRect.Y;

	AkelPad.MemFree(lpRect);
	return oRect;
}

function GetClientRect(hWnd) {
	var oRect = new Object();
	var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)

	oSys.Call("User32::GetClientRect", hWnd, lpRect);

	oRect.X = AkelPad.MemRead(_PtrAdd(lpRect, 0), DT_DWORD);
	oRect.Y = AkelPad.MemRead(_PtrAdd(lpRect, 4), DT_DWORD);
	oRect.W = AkelPad.MemRead(_PtrAdd(lpRect, 8), DT_DWORD) - oRect.X;
	oRect.H = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD) - oRect.Y;

	AkelPad.MemFree(lpRect);
	return oRect;
}

function SetWndFont(hWnd, hFont) {
	AkelPad.SendMessage(hWnd, WM_SETFONT, hFont, TRUE);
}

function GetWindowText(hWnd) {
	var nMaxTextLen = 1024;
	var lpText = AkelPad.MemAlloc(nMaxTextLen * 2);
	oSys.Call("User32::GetWindowTextW", hWnd, lpText, nMaxTextLen);
	var S = AkelPad.MemRead(lpText, DT_UNICODE);
	AkelPad.MemFree(lpText);
	return S;
}

function GetLbCurSelItem(hLbWnd) {
	var n = AkelPad.SendMessage(hLbWnd, LB_GETCURSEL, 0, 0);
	if (n < 0)
		n = 0;

	nCmdIndex = n;

	var S = "";
	var Id = AkelPad.SendMessage(hLbWnd, LB_GETITEMDATA, n, 0);
	//   if (Id == ID_PLUGIN)
	//   {
	var nMaxTextLen = 1024;
	var lpText = AkelPad.MemAlloc(nMaxTextLen * 2);
	AkelPad.SendMessage(hLbWnd, LB_GETTEXT, n, lpText);
	S = AkelPad.MemRead(lpText, DT_UNICODE);
	AkelPad.MemFree(lpText);
	// }

	return [Id, getInitialCmdText(S)];
}

function MatchFilter(sFilter, sLine) {
	var i;
	var j;
	var m;

	i = sLine.indexOf(sFilter);
	if (i != -1) {
		m = "" + i;
		while (m.length < 3) m = "0" + m;
		return "e" + m; // exact match
	}

	j = 0;
	m = "";
	for (i = 0; i < sFilter.length; i++) {
		j = sLine.indexOf(sFilter.substr(i, 1), j);
		if (j == -1)
			return ""; // no match

		while (m.length < j) m = m + "x";
		m = m + "v";
		++j;
	}
	return "p" + m; // partial match
}

function compareByCommand(a, b) {
	if ((a[2] < b[2]) || (a[2] == b[2] && a[1] < b[1]))
		return -1;
	if ((a[2] > b[2]) || (a[2] == b[2] && a[1] > b[1]))
		return 1;
	return 0;
}

function getFullCmdText(cmdText, cmdId) {
	if (ShowCmdIds) {
		// cmdText = "[" + cmdId + "] " + cmdText;
		if (/^\d\d\d\d$/g.test(Commands[cmdId][2])) {
			cmdText = "[" + Commands[cmdId][2] + "] " + cmdText;
		} else if (/^\w+::\w+$/g.test(Commands[cmdId][2])) {
			cmdText = "[::] " + cmdText;
		} else if (/^\w+?.js$/g.test(Commands[cmdId][2])) {
			cmdText = "[js] " + cmdText;
		} else if (/^ex$/g.test(Commands[cmdId][3])) {
			cmdText = "[ex] " + cmdText;
		}
	}
	return cmdText;
}

function getInitialCmdText(cmdText) {
	var n = cmdText.lastIndexOf("  ");
	if (n != -1) {
		while (n != 0 && cmdText.substr(n, 1) == " ") n--;
		cmdText = cmdText.substr(0, n + 1); // without the trailing "  Shortcut"
	}
	if (ShowCmdIds) {
		var n = cmdText.indexOf("] ");
		if (n != -1)
			cmdText = cmdText.substr(n + 2); // without the leading "[...] "
	}
	return cmdText;
}

function FillCommandsListBox(hLbWnd, sFilter) {
	var i;
	var n;
	var C;
	var cmdId;
	var cmdText;
	var Matches = [];

	if (sFilter != undefined)
		sFilter = sFilter.toLowerCase();

	for (i = 0; i < Commands.length; i++) {
		C = [];
		C.push(Commands[i][0]);
		C.push(Commands[i][1]);
		if (sFilter == undefined || sFilter == "") {
			C.push(0);
			Matches.push(C);
		} else {
			cmdText = C[1].toLowerCase();
			n = cmdText.indexOf("::");
			if (n != -1) {
				// allows to type ' ' instead of '::'
				cmdText = cmdText.replace("::", ":: ");
			}
			cmdText = getFullCmdText(cmdText, C[0]);
			n = MatchFilter(sFilter, cmdText);
			if (n != "") {
				C.push(n);
				Matches.push(C);
			}
		}
	}

	// Matches.sort(compareByCommand);

	AkelPad.SendMessage(hLbWnd, WM_SETREDRAW, FALSE, 0);
	AkelPad.SendMessage(hLbWnd, LB_RESETCONTENT, 0, 0);

	for (i = 0; i < Matches.length; i++) {
		cmdId = Matches[i][0];
		cmdText = getFullCmdText(Matches[i][1], cmdId);
		n = AkelPad.SendMessage(hLbWnd, LB_ADDSTRING, 0, cmdText);
		AkelPad.SendMessage(hLbWnd, LB_SETITEMDATA, n, cmdId);
	}

	AkelPad.SendMessage(hLbWnd, WM_SETREDRAW, TRUE, 0);
	AkelPad.SendMessage(hLbWnd, LB_SETCURSEL, 0, 0);
}

function LOWORD(nParam) {
	return (nParam & 0xFFFF);
}

function HIWORD(nParam) {
	return ((nParam >> 16) & 0xFFFF);
}

function ReadWriteIni(bWrite) {
	var oFSO = new ActiveXObject("Scripting.FileSystemObject");
	var sIniFile = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";
	var sIniTxt;
	var oFile;
	var oRect;
	var i;

	if (bWrite) {
		if ((sCmdFilter0 != sCmdFilter) ||
			(nCmdIndex0 != nCmdIndex)) {
			//oRect   = GetWindowPos(hWndDlg);
			sIniTxt = //"nWndX="    + oRect.X  + ";\r\n" +
				//"nWndY="    + oRect.Y  + ";";
				"sCmdFilter=\"" + sCmdFilter + "\";\r\n" +
				"nCmdIndex=" + nCmdIndex + ";";

			oFile = oFSO.OpenTextFile(sIniFile, 2, true, -1);
			oFile.Write(sIniTxt);
			oFile.Close();
		}
	} else if (oFSO.FileExists(sIniFile)) {
		oFile = oFSO.OpenTextFile(sIniFile, 1, false, -1);

		try {
			eval(oFile.ReadAll());

			sCmdFilter0 = sCmdFilter;
			nCmdIndex0 = nCmdIndex;
		} catch (oError) {}

		oFile.Close();
	}
}

function alignCmdShortcut(cmdText) {
	var nMaxLen = 72 - (ShowCmdIds ? 7 : 0);
	var n = cmdText.lastIndexOf("\\t");
	if (n != -1) {
		if (cmdText.length < nMaxLen) {
			var t = "";
			var i = cmdText.length;
			while (i < nMaxLen) {
				t = t + " ";
				i++;
			}
			cmdText = cmdText.substr(0, n) + t + cmdText.substr(n + 2);
		} else {
			cmdText = cmdText.substr(0, n) + "  " + cmdText.substr(n + 2);
		}
	}
	return cmdText;
}

function ReadLngFile() {
	var oFSO = new ActiveXObject("Scripting.FileSystemObject");
	var sLngFile = WScript.ScriptFullName.replace(/\.js$/i, "_" + AkelPad.GetLangId(LANGID_FULL).toString() + ".lng");
	if (!oFSO.FileExists(sLngFile)) {
		sLngFile = WScript.ScriptFullName.replace(/\.js$/i, ".lng");
	}
	if (oFSO.FileExists(sLngFile)) {
		var n;
		var s;
		var m;
		var count = -1;
		var section = "";
		var oTextStream = oFSO.OpenTextFile(sLngFile, 1, false, -1);
		while (!oTextStream.AtEndOfStream) {
			s = oTextStream.ReadLine();
			m = s.match(/^\s*\/\/.*/);
			if (m) {
				// Comment
				continue;
			}
			m = s.match(/^\s*\[([^\]]+)\]\s*$/);
			if (m) {
				// [Section]
				section = m[1].toLowerCase();
				continue;
			}
			if (section == "akelpad") {
				m = s.match(/^\s*(\d\d\d\d)\s*=\s*"(.+)"\s*$/);
				if (m) {
					// AkelPad's Command: id = Text
					n = parseInt(m[1]);
					if (isNaN(n)) {
						n = oTextStream.Line - 1;
						oTextStream.Close();
						FatalErr("Command Id is not a number: \"" + m[1] + "\"!\nFile: \"" + sLngFile + "\"\nLine: " + n);
					}

					s = alignCmdShortcut(m[2]);
					count += 1
					Commands.push([count, s, n, ""]);
					continue;
				}
			} else if (section == "plugins") {
				m = s.match(/^\s*([\w:]+)\s*=\s*"(.+)"\s*$/);
				if (m) {
					n = m[1];
					s = alignCmdShortcut(m[2]);
					count += 1
					Commands.push([count, s, n, ""]);
					continue;
				} else { // иначе плаг без текста перевода
					m = s.match(/^\s*([\w:]+)\s*$/);
					if (m) {
						n = m[1];
						s = alignCmdShortcut(m[1]);
						count += 1
						Commands.push([count, s, n, ""]);
						continue;
					}
				}

			} else if (section == "scripts") {
				// m = s.match(/^\s*"(.+)"\s*$/);
				// m = s.match(/^\s*([\w\.]+)\s*=\s*"(.+)"\s*$/);
				// m = s.match(/^\s*([\w\.]+)\s*|\s*([^|]+?)\s*|\s*([^|]+)\s*$/);
				m = s.match(/^\s*([\w\.]+)\s*\|\s*([^|]+?)\s*\|\s*(.+)\s*$/);
				if (m) {
					n = m[1];
					p = m[3];
					s = alignCmdShortcut(m[2]);
					// 		WScript.Echo('1 = ' + m[1] + '\n2 = ' + m[2] + '\n3 = ' + m[3]);
					// 		WScript.Quit();
					// Commands.push( [n, s] );
					count += 1
					Commands.push([count, s, n, p]);
					continue;
				} else { // иначе скрипт без параметра
					m = s.match(/^\s*([\w\.]+)\s*\|\s*([^|]+?)\s*$/);
					if (m) {
						n = m[1];
						s = alignCmdShortcut(m[2]);
						count += 1
						Commands.push([count, s, n, ""]);
						continue;
					} else { // иначе скрипт без имени и параметра
						m = s.match(/^\s*([\w\.]+)\s*$/);
						if (m) {
							n = m[1];
							s = alignCmdShortcut(m[1]);
							count += 1
							Commands.push([count, s, n, ""]);
							continue;
						}
					}
				}

			} else if (section == "exec") {
				m = s.match(/^\s*(.+?)\s*\|\s*(.+?)\s*$/);
				// WScript.Echo('0 = ' + m[0] + '\n1 = ' + m[1] + '\n2 = ' +m[2]);
				if (m) {
					n = m[2];
					s = alignCmdShortcut(m[1]);
					count += 1
					Commands.push([count, s, n, "ex"]);
					continue;
				}

			}
		}
		oTextStream.Close();
	} else {
		FatalErr("File not found: \"" + sLngFile + "\"");
	}
}

function FatalErr(errMsg) {
	AkelPad.MessageBox(AkelPad.GetMainWnd(), errMsg, WScript.ScriptName, MB_OK | MB_ICONERROR);
	WScript.Quit();
}


1. Отключил сортировку чтобы индексы соответствовали.
2. Изменил там где проверяется ShowCmdIds
3. Гибкий анализ ini. Можно для плагов и скриптов не указывать русское название пункта тогда будет использоваться оригинальное имя.
4. В скобках снова указан тип команды
5. Добавил Exec в ini и обработку в скрипте

ini я использовал такой

Code: Select all

// CommandPalette.js
// Language: Russian (1049)

[AkelPad]
4101 = "Файл: Новый\tCtrl+N"
4102 = "Файл: Новое окно\tCtrl+Shift+N"
4103 = "Файл: Открыть...\tCtrl+O"
4104 = "Файл: Переоткрыть\tF5"
4105 = "Файл: Сохранить\tCtrl+S | F2"
4106 = "Файл: Сохранить как...\tCtrl+Shift+S"
4107 = "Файл: Параметры страницы..."
4108 = "Файл: Печать...\tCtrl+P"
4109 = "Файл: Выход\tAlt+F4"
4110 = "Файл: Сохранить все\tCtrl+Alt+F2"
4111 = "Файл: Сохранить все как..."
4113 = "Файл: Печать"
4114 = "Файл: Предпросмотр..."
4121 = "Файл: Определить кодировку заново\tAlt+F5"
4122 = "Файл: Открыть как ANSI\tAlt+W"
4123 = "Файл: Открыть как OEM\tAlt+D"
4124 = "Файл: Открыть как KOI-R\tAlt+K"
4125 = "Файл: Открыть как UTF-16 LE\tAlt+L"
4126 = "Файл: Открыть как UTF-16 BE\tAlt+B"
4127 = "Файл: Открыть как UTF-8\tAlt+U"
4131 = "Файл: Сохранить как ANSI\tShift+Alt+W"
4132 = "Файл: Сохранить как OEM\tShift+Alt+D"
4133 = "Файл: Сохранить как KOI-R\tShift+Alt+K"
4134 = "Файл: Сохранить как UTF-16 LE\tShift+Alt+L"
4135 = "Файл: Сохранить как UTF-16 BE\tShift+Alt+B"
4136 = "Файл: Сохранить как UTF-8\tShift+Alt+U"
4137 = "Файл: Сохранить как UTF-8 без BOM"
4140 = "Правка: Конт. меню преобр. кодировок\tF12"
4151 = "Правка: Отменить\tCtrl+Z"
4152 = "Правка: Вернуть отменённое\tCtrl+Shift+Z"
4153 = "Правка: Вырезать\tCtrl+X"
4154 = "Правка: Копировать\tCtrl+C"
4155 = "Правка: Вставить\tCtrl+V"
4156 = "Правка: Удалить\tDel"
4157 = "Правка: Выделить всё\tCtrl+A"
4158 = "Правка: Найти...\tCtrl+F"
4159 = "Правка: Найти следующее\tF3"
4160 = "Правка: Найти предыдущее\tShift+F3"
4161 = "Правка: Заменить...\tCtrl+H | Ctrl+R"
4162 = "Правка: Перейти к...\tCtrl+G"
4163 = "Правка: Запуск 'Таблица символов'\tCtrl+I"
4164 = "Правка: Отступ табуляцией"
4165 = "Правка: Отступ табуляцией, если несколько строк"
4166 = "Правка: Удал. табуляцию, если неск. строк, либо Отступ табуляцией"
4167 = "Правка: Удалить табуляцию, если несколько строк"
4168 = "Правка: Отступ пробелом"
4169 = "Правка: Отступ пробелом, если несколько строк"
4170 = "Правка: Удал. пробел, если неск. строк, либо Отступ пробелом"
4171 = "Правка: Удалить пробел, только если несколько строк"
4172 = "Правка: Удалить первый символ"
4173 = "Правка: Удалить первый символ, если есть выделенный текст"
4174 = "Правка: Удалить пробелы и табы в конце строк\tAlt+Backspace"
4175 = "Правка: В ВЕРХНИЙ РЕГИСТР\tCtrl+6"
4176 = "Правка: в нижний регистр\tCtrl+7"
4177 = "Правка: С заглавной буквы (регистр)\tCtrl+8"
4178 = "Правка: Каждое Слово С Заглавной (регистр)\tCtrl+9"
4179 = "Правка: иНВЕРТИРОВАТЬ рЕГИСТР\tCtrl+0"
4180 = "Правка: Преобразовать регистр по кругу (5 видов)\tCtrl+5"
4182 = "Правка: Перекодировать...\tAlt+R"
4183 = "Правка: Вставить дату\tCtrl+D"
4184 = "Правка: Формат новой строки DOS/Windows (0Dh, 0Ah)"
4185 = "Правка: Формат новой строки Unix (0Ah)"
4186 = "Правка: Формат новой строки Mac (0Dh)"
4190 = "Правка: Режим вставки/замены символов"
4191 = "Правка: Вставить как ANSI текст\tCtrl+Shift+V"
4192 = "Правка: Вставить в вертикал. выделение\tAlt+V"
4193 = "Правка: Вставить текст после каретки"
4194 = "Правка: Вставить текст с учётом регистра выделения"
4195 = "Правка: Удалить все пробелы в выделении"
4196 = "Правка: Встав. нов. строку с отступом (`Сохр. отступы слева` выкл)"
4197 = "Правка: Удалить текущую строку\tCtrl+Y"
4198 = "Правка: Переместить курсор в противоположный конец выделения\tAlt+\"
4199 = "Правка: Переместить курсор на предыдущую позицию\tAlt+,"
4200 = "Правка: Переместить курсор на следующую позицию\tAlt+."
4201 = "Вид: Шрифт..."
4202 = "Вид: Цвет..."
4204 = "Вид: Увеличить шрифт 1pt\tCtrl+Num+"
4205 = "Вид: Уменьшить шрифт 1pt\tCtrl+Num-"
4206 = "Вид: Восстановить размер шрифта при запуске\tCtrl+Num*"
4209 = "Вид: Перенос по словам\tCtrl+U"
4210 = "Вид: Поверх всех окон\tCtrl+T"
4211 = "Вид: Строка состояния"
4212 = "Вид: Разделить окно на 4 части"
4213 = "Вид: Разделить окно вертикально"
4214 = "Вид: Разделить окно горизонтально"
4215 = "Вид: Разделить окно (вкл/выкл)"
4216 = "Вид: Только чтение (блокир. в редакторе)"
4251 = "Настройки: Выполнить...\tCtrl+F5"
4252 = "Настройки: Сохранять время файла"
4253 = "Настройки: Следить за изменением файла"
4254 = "Настройки: Сохранять отступы слева\tCtrl+L"
4255 = "Настройки: Не открывать файл дважды"
4256 = "Настройки: Не открывать программу дважды"
4259 = "Настройки: Плагины...\tAlt+P"
4260 = "Настройки: Параметры..."
4261 = "Настройки: Однооконный режим (SDI)"
4262 = "Настройки: Многооконный режим (MDI)"
4263 = "Настройки: Псевдо-многооконный режим (PMDI)"
4301 = "Настройки: Вкладки сверху"
4302 = "Настройки: Вкладки снизу"
4303 = "Настройки: Скрыть вкладки"
4304 = "Настройки: Стандартные вкладки"
4305 = "Настройки: Вкладки как кнопки"
4306 = "Настройки: Вкладки как плоские кнопки"
4307 = "Окно: Выстроить окна горизонтально"
4308 = "Окно: Выстроить окна вертикально"
4309 = "Окно: Выстроить окна каскадом"
4310 = "Настройки: Переключать вкладки следующая-предыдущая"
4311 = "Настройки: Переключать вкладки правая-левая"
4316 = "Окно: Активировать следующую вкладку\tCtrl+Tab"
4317 = "Окно: Активировать предыдущую вкладку\tCtrl+Shift+Tab"
4318 = "Окно: Закрыть вкладку\tCtrl+F4 | Ctrl+W"
4319 = "Окно: Закрыть все вкладки"
4320 = "Окно: Закрыть все вкладки, кроме текущей"
4321 = "Окно: Закрыть все неизмененные вкладки"
4322 = "Окно: Клонировать вкладку"
4323 = "Окно: Копировать путь файла"
4324 = "Файл: Закрыть файл"
4325 = "Файл: Закрыть файл и выйти (SDI) или закрыть вкладку (MDI/PMDI)"
4327 = "Окно: Выбрать окно...\tF10"
4331 = "Окно: Восстановить/развернуть главное окно\tAlt+Enter"
4332 = "Окно: Перейти к следующему диалоговому окну\tF6"
4333 = "Окно: Перейти к предыдущему диалоговому окну\tShift+F6"
4341 = "Вид: Перейти к следующей части разделенного окна\tF9"
4342 = "Вид: Перейти к предыдущей части разделенного окна\tShift+F9"
4351 = "Справка: О программе..."
4352 = "Справка: Руководство ..."
4353 = "Справка: Обновление..."
5001 = "Файл: Удалить несуществующие из списка последних файлов"

[Plugins]
Clipboard::Capture = "Буфер обмена::Переключить Захват"
Clipboard::Paste = "Буфер обмена::Вставить текст (вне автокопир.)"
Clipboard::PasteSerial = "Буфер обмена::Переключить Вставка серийного номера"
Clipboard::SelAutoCopy = "Буфер обмена::Переключить Автокопирование выделенния"
Clipboard::Settings = "Буфер обмена::Настройка"
Coder::AutoComplete = "Кодер::Переключить автозавершение"
Coder::CodeFold = "Кодер::Переключить свёртку"
Coder::HighLight = "Кодер::Переключить подсветку"
Coder::Settings = "Кодер::Настройка"
ContextMenu::Main = "Меню::Настройка"
ContextMenu::Show = "Меню::Показать меню Show"
Exit::Main = "Выход::Переключить"
Exit::Settings = "Выход::Настройка"
Explorer::Main = "Панель Проводника (Explorer)"
Fonts::Main = "Динамическая загрузка шрифтов"
Format::Decrypt = "::Дешифрование выделенного текста"
Format::Encrypt = "::Шифрование выделенного текста"
Format::LineFixWrap = "::Разбить строки (по текущей ширине окна)"
Format::LineGetDuplicates = "::Дублирующиеся (все копии)"
Format::LineGetUnique = "::Только не имеющие дубликатов"
Format::LineRemoveDuplicates = "::Уникальные (все по 1-й копии)"
Format::LineReverse = "::Инвертирование порядка строк"
Format::LineSortIntAsc = "::Сортировка по числовому возрастанию"
Format::LineSortIntDesc = "::Сортировка по числовому убыванию"
Format::LineSortStrAsc = "::Сортировка по возрастанию"
Format::LineSortStrDesc = "::Сортировка по убыванию"
Format::LinkExtract = "::Получить ссылки из HTML в тегах <a>"
FullScreen::Main = "На весь экран	F11"
HexSel::Main = "Панель Шестнадцатеричный вид выделенного (HexSel)"
Hotkeys::Main = "Горячие клавиши...	Alt+A"
LineBoard::Main = "Линейка::Переключить"
; LineBoard::Main::BookmarkList = "Меню текущих закладок"
LineBoard::Settings = "Линейка::Настройка"
; Log::Output
Log::Settings = "Лог::Настройка"
Log::Watch = "Лог::Переключить просмотр в реальном времени"
Macros::Main = "Макросы..."
MinimizeToTray::Always = "Всегда сворачивать в трей"
MinimizeToTray::Now = "Свернуть в трей"
QSearch::DialogSwitcher
QSearch::QSearch = "Панель быстрого поиска	F7"
QSearch::SelFindNext
QSearch::SelFindPrev
RecentFiles::DeleteNonExistent = "::Удаление несуществующих"
RecentFiles::Manage = "::Последние файлы..."
RecentFiles::Show
SaveFile::AutoSave = "АвтоСохранение::Переключить"
SaveFile::SaveNoBOM = "::Сохраненять без метки BOM"
SaveFile::Settings = "АвтоСохранение::Настройка"
Scripts::Main = "::Скрипты"
Scroll::AlignCaret = "Прокрутка::Выравнивание каретки"
Scroll::AutoFocus = "Прокрутка::Автоматическая передача фокуса"
Scroll::AutoScroll = "Прокрутка::Автоматическая"
Scroll::NoScroll = "::Не прокручивать"
Scroll::Settings = "Прокрутка::Настройка"
Scroll::SyncHorz = "Прокрутка::Горизонтальная синхронизация"
Scroll::SyncVert = "Прокрутка::Вертикальная синхронизация"
Sessions::Main = "Менеджер сессий..."
SmartSel::NoSelEOL = "Исключить EOL из выделения"
SmartSel::Settings = "Умная навигация::Настройка"
SmartSel::SmartBackspace = "Умная клавиша Backspace"
SmartSel::SmartEnd = "Умная клавиша End"
SmartSel::SmartHome = "Умная клавиша Home"
SmartSel::SmartUpDown = "Умная клавиша Up/Down"
Sounds::Main = "Звук::Переключить"
Sounds::Settings = "Звук::Настройка"
SpecialChar::Main = "Спец-символы::Переключить"
SpecialChar::Settings = "Спец-символы::Настройка"
Speech::Main = "Машинное чтение текста"
SpellCheck::Background = "Орфография::Фоновая проверка"
SpellCheck::CheckDocument = "Орфография::Проверить документ"
SpellCheck::CheckSelection = "Орфография::Проверить веделенное"
SpellCheck::Settings = "Орфография::Настройка"
SpellCheck::Suggest = "Орфография::Проверить слово, показав рекомендации замены"
Stats::Main = "Колич. строк, слов, символов"
Templates::Main = "Шаблоны::Переключить"
Templates::Open = "Шаблоны::Новый...	Alt+Ctrl+N"
ToolBar::Main = "Панель инструментов::Переключить"
XBrackets::GoToMatchingBracket
XBrackets::GoToNearestBracket
XBrackets::Main = "Скобки::Переключить"
XBrackets::SelToMatchingBracket = "Выделить между прилегающими скобками/кавычками"
XBrackets::SelToNearestBrackets = "Выделить между скобками/кавычками	Alt+M"
XBrackets::Settings = "Скобки::Настройка"

[Scripts]
HighLight_HSB.js|Регулировка цвета меток...
LogHighLight.js|Подсветить в  консоли
Open_Help.js|Найти в справке
InsertTextLN.js|Вставить вокруг выделенного|2
SelectLevel.js|Выбрать между парными скобками/кавычками	Alt+M
indent2Tab.js|Пробел отступ в табуляцию
LogProcessing.js|Фильтр консоли
TidyAll.js|Tidy (js, htm, au3)	Alt+Z
RegExpTestJS.js|RegExp Test JS
FontSwitch.js|Следующий шрифт (Consolas, Arial mod)|-FontList="Arial mod,0,11|Consolas,0,11"
backupVersion.js|backupVersion|-warnings=false
CodePoster.js|Экспорт в HTML|-Format="html" -BR="<br>" -Info=false
getLinks.js|Получить ссылки
colorsConverter.js|Конвертировать цвет между #fee и rgb()
insertTag.js|Вставить теги вокруг выделенного
ins_html_table.js|Вставить html-таблицу
HtmlView.js|Предпросмотр HTML
ClearRecentFiles.js|Очистить список последних файлов|-Msg=false
AkelPadRestart.js|Перезапуск AkelPad
undoRedoAll.js|Отменить всё до сохранения|-mode=0 -stopOnSaved=true
undoRedoAll.js|Вернуть всё отменённое|-mode=1
NumberListGenerator.js|Генератор чисел в строки
Combine_Lists.js|Объединить списки построчно (с буфера)
DuplicateSel.js|Дублировать строку или выделенное	Ctrl+D
DuplicateSelCycle.js|Дублировать в цикле	Ctrl+Shift+D
FindReplaceFiles.js|Найти / заменить в файлах
CommandPalette.js|Найти пункт меню
Search_internet.js|Искать в интернете...
LineBoardBookmarks.js|Меню для закладок...
LineBoardBookmarks.js|Вырезать строки с закладками|XB
LineBoardBookmarks.js|Вырезать строки без закладок|XU
LineBoardBookmarks.js|Вырезать строки с закладками в выделенном|XBS
LineBoardBookmarks.js|Вырезать строки без закладок в выделенном|XUS
LineBoardBookmarks.js|Копировать строки с закладками|CB
LineBoardBookmarks.js|Копировать строки без закладок|CU
LineBoardBookmarks.js|Копировать строки с закладками в выделенном|CBS
LineBoardBookmarks.js|Копировать строки без закладок в выделенном|CUS
LineBoardBookmarks.js|Открыть в новой вкладке строки с закладками|OB
LineBoardBookmarks.js|Открыть в новой вкладке строки без закладок|OU
LineBoardBookmarks.js|Открыть в новой вкладке строки с закладками в выделенном|OBS
LineBoardBookmarks.js|Открыть в новой вкладке строки без закладок в выделенном|OUS
LineBoardBookmarks.js|Вставить в (переписать) строки с закладками|VB
LineBoardBookmarks.js|Вставить в (переписать) строки без закладок|VU
LineBoardBookmarks.js|Вставить в (переписать) строки с закладками в выделенном|VBS
LineBoardBookmarks.js|Вставить в (переписать) строки без закладок в выделенном|VUS
LineBoardBookmarks.js|Заменить строки с закладками|RB
LineBoardBookmarks.js|Заменить строки без закладок|RU
LineBoardBookmarks.js|Заменить строки с закладками в выделенном|RBS
LineBoardBookmarks.js|Заменить строки без закладок в выделенном|RUS
LineBoardBookmarks.js|Удалить строки с закладками|DB
LineBoardBookmarks.js|Удалить строки без закладок|DU
LineBoardBookmarks.js|Удалить строки с закладками в выделенном|DBS
LineBoardBookmarks.js|Удалить строки без закладок в выделенном|DUS
LineBoardBookmarks.js|Закладки на выделенные строки|BS
LineBoardBookmarks.js|Убрать закладки|U
LineBoardBookmarks.js|Убрать закладки в выделенных строках|US
LineBoardBookmarks.js|Инвертировать закладки|I
LineBoardBookmarks.js|Инвертировать закладки в выделенных строках|IS
SetHighLight.js|Задать рег.выр.
TextMarker.js|TextMarker
ShiftTabSize.js|Размер табуляции задать...
CaretOptionsSwitch.js|Курсор после конца строки (js)|0 %m %i
CaretOptionsSwitch.js|Показать текущую колонку|1 %m %i
CaretOptionsSwitch.js|Показать текущую строку|2 %m %i
CaretOptionsSwitch.js|Показать границу текущей строки|3 %m %i
AkelPadManualSettings.js|Настройки :: Ручные (js)...
PluginText.js|Плагины INI to Text...
TabSwitch.js|Выбрать вкладку...	Alt+F10|-Next=-1 -CtrlTab=false -RightLeft=true -MinTabs=1 -WindowLeft=-1 -WindowTop=-1
SearchReplace.js|Поиск замена +	Ctrl+Alt+F
FindReplaceEx.js|Поиск замена ++	Ctrl+F
FindReplaceEx.js|Замена ++	Ctrl+H|-dlg="R"
tileTabs.js|2 вкладки рядом
AkelPadDocsView.js|Просмотр TXT...		F1
AkelPadMethodsView.js|Просмотр методов...
menu_rus_txt.js|Плаги Rus.txt
toggleComments.js|Комментировать/переключить|-ignoreLineCommentsAfterCode -preferLineComments -lineCommentsAtStart -checkBlockComments=0
LinesSelectCopyMoveDuplicate.js|Строка(и) переместить вверх	Ctrl+Up|M -1
LinesSelectCopyMoveDuplicate.js|Строка(и) переместить вниз	Ctrl+Down|M 1
LinesSelectCopyMoveDuplicate.js|Строка - Выделить|S 0
Menu_by_type.js|Меню по типу	F8
Calculator.js|Калькулятор вычислить текст
Open_Assoc_Prog.js|Открыть документ в ассоциированной программе	F5
smartPaste.js|Вставка	Ctrl+V
ColumnsReplace.js|Замена в колонках	Ctrl+Alt+Ins

[Exec]
Проводник|explorer /e,/select, %f"
Panel_Function|%a\AkelFiles\Tools\Panel_Function\Panel_Function.exe


В общем определить является ли скрипт или плагин или команда не сложно, надо только сгенерировать правильный массив и правильно захватить строку из листбокс, а уж найти то команду связанную со строкой не сложно.

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

Post by DV »

AZJIO,
С Вашего разрешения, позаимствую некоторые идеи :) Что-то подобное крутилось и у меня в голове.
Чисто технически я уже разобрался с вызовом плагинов с параметрами и скриптов с параметрами - теперь играюсь с наполнением .lng файла, чтобы охватить как можно больше существующих возможностей стандартных плагинов и скриптов.

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

DV
При поиске, было бы не плохо, чтобы первыми в списке были совпадения от начала строки, вторыми совпадения начала слов, третьими совпадения части слова, четвёртыми совпадения букв. Причина: обычно набираешь команду по памяти или слово из команды по памяти и релевантное искомое теряется где-то между второстепенными командами. И хорошо бы если эти разделы были подсвечены разным цветом фона или хотя бы текста. Я искал возможность подсветить части слов в листбокс, но не нашёл ни одного примера на каком нибудь языке, только подсвечивается весь пункт. Допустим я бы знал что мне надо искать свой пункт в зелёном или в жёлтом строках, и если там нет то я мог ошибиться орфографически и найти пункт в красных.

Ищем все вхождения ^%s, добавляем в листбокс, а в массиве заменяем текст на пустоту чтобы больше не искался. Далее ищем \b%s или \W%s или [^\w]%s или (?<!\w)%s то есть от начала слова. Далее уже просто %s и далее по буквам.
Кстати, при вводе одной буквы нет смысла выполнять поиск по буквам, а только первую часть поиска. Может это уже есть я не вдавался.

У меня не работала переменная %f, при этом работала %a. Может программно получить путь текущего файла, а потом в командных строках подменить %f на путь? И тоже самое с другими переменными - проверить их работу и сделать поддержку.

Смущает поиск по наличию введённых букв, он практически не дает релевантного результата, просто забивает список ненужным мусором. Я бы заменил его например на поиск по частям, то есть по сокращениям. Например, вводим "нас.лог" ищем строки, в которых есть 2 вхождения "нас" и "лог", причём ищем от начала слов. Точка обычно не используется в пунктах и её можно использовать как лёгкий для набора разделитель, хотя не исключаю использовать пробел "коп стр зак" думаю это не повредит даже если будет искаться как поиск целой строки пункта, который не даст результатов, а только выдаст результат движок поиска начала слов. Проблема что если мы вводим "настройка" то выпадет много вариантов, а так у нас выпадет скорее всего 1 вариант "Настройка лога" и он будет идеальным результатом поиска при минимуме ввода. Поддержать не ограниченное число частей, например "коп.стр.зак". Ещё можно ввести критерий, если первая буква заглавная (например "Зам"), то результаты выводить только для вхождение в начале строки, ну или сделать точный поиск с учётом регистра.

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

Post by DV »

AZJIO wrote:При поиске, было бы не плохо, чтобы первыми в списке были совпадения от начала строки, вторыми совпадения начала слов, третьими совпадения части слова, четвёртыми совпадения букв.
Сейчас в функции MatchFilter используется очень упрощённая трактовка fuzzy search:
- вначале проверяется полное совпадение ( sLine.indexOf(sFilter) ), на основании чего возвращается строка вида "e00N", где 00N - позиция найденной подстроки (например, 003 для "def" в "abcdefghi");
- затем проверяется частичное совпадение ( sLine.indexOf(sFilter.substr(i, 1), j) ), на основании чего возвращается строка вида "pxxvxvv", где "v" - это совпавший символ, а "x" - несовпавший (например, "pxxvxvv" для "abc" в "54a7bc").
После чего функция compareByCommand при сортировке ( Matches.sort(compareByCommand) ) сравнивает эти строки (например, "e00N" с "pxxvxvv"). При отключенной (закоментированной) сортировке порядок строк будет неправильным.
Данный алгоритм не позволяет предпочесть, например, строку "543abc7d" строке "54a3b7cd" при поиске "abcd", потому что опирается на позицию _первого совпавшего_ символа, а не на позиции _совпавших подряд_ символов. (Я пытался наскоком написать алгоритм для совпавших подряд символов, однако его результаты были нестабильны).
Для полноценного же алгоритма fuzzy search, со "взвешенными" результатами совпадений, понадобится что-то вроде https://github.com/farzher/fuzzysort/bl ... zzysort.js , что само по себе увеличит размер скрипта вдвое.

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

DV
Нечёткий поиск удобен наверно для поиска слова, где совпадение можно было бы регулировать 70%, сохранялась бы очерёдность букв. Для тех кто пользуется постоянно помнят примерное название пункта и наберут хотя бы часть слова, а для новичка, который ещё не знает как может называться пункт - будет пробовать разные слова. Но опять же текущий частичный поиск не даёт похожести слов, он выдаёт совершенно другие слова по смыслу, так как ищет их в пункте из множества слов.

Я смотрел функцию MatchFilter и видел что добавляется префикс, искал где он потом используется, но не разобрался, мне бы проще было в точке вызова изменить алгоритм. Усугубляется тем что лучше дождаться новой версии и в ней пробовать.

На счёт приближённого поиска максимум пришла идея допустим при поиске "Заменить" хотя бы искать по 3 символа Зам аме мен ени нит ить, не было бы ярко выраженного разброса. Но я бы и это не добавлял, а как ранее сказал поиск по сокращениям "закр вкл тек" это даст релевантный вариант, а кто-то приловчится и будет писать "за в те" и даже по одной-две буквы от начала слов даст в 100 раз более вменяемый результат.

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

Post by opk44 »

AZJIO wrote:Точка обычно не используется в пунктах и её можно использовать
Image
Post Reply