Scripts discussion (4)

Discuss and announce AkelPad plugins
  • Author
  • Message
Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

yozhic wrote:opk44
Пробовал сразу. И Consolas, и Courier New, и Lucida Console, и Input Mono, и Fira, с пробелами в имени и без, ttf и otf – не меняет. Из встроенного диалога всё срабатывает, а из скрипта нет.
Скачай чью нибудь сборку и проверь как там работает. Сравни версии зависимых dll (Scripts.dll, AkelPad.exe). Я сразу полез в вики смотреть что за гарнитура... Имя, стиль начертания, размер знаю, а кегль, гарнитура только через вики.

Offline
Posts: 276
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

AZJIO wrote:Сравни версии зависимых dll (Scripts.dll, AkelPad.exe)
С этим порядок. Я подписался по RSS на новости AkelPad CodeSvn, и когда Instructor что-то меняет, скачиваю весь trunk и компилирую одним махом и программу, и все плагины (за исключением сторонних).

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

InsertDateFromCalendar.js

Added:
- button "? (F1)" for help,
- Russian translation by AZJIO.

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

Post by AZJIO »

KDJ wrote:- Russian translation by AZJIO.
after criticizing opk44

Code: Select all

if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 0x0419) //Russian translation by AZJIO
{
  var sHelp = "      Клавиши быстрого доступа в календаре:\n" +
              " Left/Right        - предыдущий/следующий день\n" +
              " Up/Down         - предыдущая/следующая неделя\n" +
              " PgUp/PgDn      - предыдущий/следующий месяц\n" +
              " Ctrl+PgUp/Ctrl+PgDn   - предыдущий/следующий год\n" +
              " Home/End      - первый/последний день месяца\n" +
              " Ctrl+Home/Ctrl+End   - первый/последний видимый день\n" +
              " BackSpace      - перейти к сегодняшнему дню\n" +
              "\n" +
              " Shift+Alt+Left/Right   - сдвинуть календарь влево/вправо\n" +
              " Shift+Alt+Up/Down    - сдвинуть календарь вверх/вниз\n" +
              " Shift+Alt+Home/End   - сдвинуть влево/вправо к краю окна\n" +
              " Shift+Alt+PgUp/PgDn   - сдвинуть вверх/вниз к краю окна\n" +
              " Shift+Alt+C      - центрировать календарь\n" +
              "\n" +
              " +/-         - Добавить/удалить месяц из календаря\n" +
              " O (S)         - Опции\n" +
              "\n" +
              " Enter\n" +
              " Shift+Enter\n" +
              " Ctrl+Enter\n" +
              " Ctrl+Shift+Enter      - вставить дату/время (см опции)";

  var sHelpDF = " d   - день месяца без предшествующего нуля\n" +
                " dd   - день месяца с предшествующим нулём\n" +
                " ddd   - день недели, трёхбукв. аббревиатура\n" +
                " dddd   - день недели, полное название\n" +
                " M   - месяц без предшествующего нуля\n" +
                " MM   - месяц с предшествующим нулём\n" +
                " MMM   - месяц, трёхбуквенная аббревиатура\n" +
                " MMMM   - месяц, полное название\n" +
                " y   - год, две цифры без предшеств. нуля\n" +
                " yy   - год, две цифры с предшеств. нулём\n" +
                " yyyy   - год, четыре цифры";

  var sHelpTF = " h   - часы без предшествующего нуля (12)\n" +
                " hh   - час с предшествующим нулём (12)\n" +
                " H   - часы без предшествующего нуля (24)\n" +
                " HH   - час с предшествующим нулём (24)\n" +
                " m   - минуты без предшествующего нуля\n" +
                " mm   - минуты с предшествующим нулём\n" +
                " s   - секунды без предшествующего нуля\n" +
                " ss   - секунды с предшествующим нулём\n" +
                " t   - метка времени с 1 символом, (A/P)\n" +
                " tt   - метка времени с 2 символами, (AM/PM)";

  var sTxtOK       = "OK";
  var sTxtOptions  = "Опции";
  var sTxtHelp     = "Справка";
  var sTxtSettings = "Опции";
  var sTxtFormat   = "Формат вставки даты/времени";
  var sTxtSystem   = "Системный";
  var sTxtLongDate = "Длинная дата";
  var sTxtDateForm = "Дата";
  var sTxtTimeForm = "Время";
  var sTxtKeyAssig = "Вставка - горячая клавиша";
  var sTxtDate     = "Дата";
  var sTxtTime     = "Время";
  var sTxtOkBut    = "Кнопка OK";
  var sTxtCalendar = "Календарь";
  var sTxtMonths   = "Количество видимых месяцев";
  var sTxtColor1   = "Фон календаря";
  var sTxtColor2   = "Текст дней месяца";
  var sTxtColor3   = "Фон заголовка месяца";
  var sTxtColor4   = "Текст заголовка месяца";
  var sTxtColor5   = "Начальные и конечные дни";
  var sTxtReset    = "С\n" +
                     "б\n" +
                     "р\n" +
                     "о\n" +
                     "с";
}
updated 1 times.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Updated Russian translation: InsertDateFromCalendar.js

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

Post by AZJIO »

Может кому интересно скрипт конвертирования js в html проба. О CodePoster.js я в курсе, просто хотел попробовать скрипт в браузере.

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

Post by AZJIO »

Интересует функционал выделения между скобками от курсора. В IDE от PureBasic если несколько раз вызвать хоткей выделения блоков (Ctrl+M) то он как бы подымается на следующий уровень выделения.
Грубо говоря сначала выделяется между скобками (), следующий раз допустим между фигурными скобками {} условия if, следующий раз между фигурными скобками {} функции и т.д. Главный критерий что функционал видит парные скобки, то есть если найдены ближайшие скобки справа и слева от выделенного это не является критерием для выделения, а будет выделять именно логический блок.

Offline
Posts: 44
Joined: Wed May 01, 2019 10:10 am

Post by Олег »

Добрый день!
Подскажите, как написать скрипт для рестарта Акела с сохранением сессии когда сохранение сессий отключено.
Скрипт Restart.vbs у меня почему то не работает.

P.S. Скрипт взят с сайта скриптов для Акела TC Image and Group.
На форуме нашол такой код:
"Рестарт" Exec(`"C:\Windows\System32\NirCmd.exe" execmd ("~$nir.exefile$" closeprocess "AkelPad.exe") && ("~$nir.exefile$" waitprocess "AkelPad.exe") && ("~$nir.exefile$" exec show "%a\AkelPad.exe")`) Icon(0)

тоже сессия не сохраняется.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Олег

Try this script: AkelPadRestart.js

Offline
Posts: 44
Joined: Wed May 01, 2019 10:10 am

Post by Олег »

KDJ
OK. It works!
Thank you very much! :)

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

Post by AZJIO »

Начал делать скрипт

Code: Select all

// AZJIO 14.10.2019 Обновил 6 раз
//
// Description(1033): Selects the text between operators () [] {} "" ', and the re-call extends the selection until the next nesting level.
// Description(1049): Выделяет текст между операторами ( ) [ ] { } " " ' ', причём повторный вызов расширяет выделение до следующего уровня вложения.
//
// Usage:
//   Call("Scripts::Main", 1, "SelectLevel.js")

var hEditWnd = AkelPad.GetEditWnd();
var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();
var nSelStart = AkelPad.GetSelStart();
var nSelEnd = AkelPad.GetSelEnd();

if (nSelStart == 0) {
	WScript.Quit();
}

// Установи "nearestbr.selto_flags=1" в файле XBrackets.ini, чтобы начинать захват сразу со скобками/кавычками
if (nSelStart == nSelEnd) {
	AkelPad.Call("XBrackets::SelToNearestBrackets");
	WScript.Quit();
}

var sEditFile = AkelPad.GetEditFile(0);
var sFileExt = AkelPad.GetFilePath(sEditFile, 4 /*CPF_FILEEXT*/ );

// var pStartText=AkelPad.GetTextRange(0, nSelStart);
// var pEndText=AkelPad.GetTextRange(nSelEnd, -1);

switch (sFileExt.toLowerCase()) {

// эти (xml, html) практически не работают, надо писать индивидуальный алгоритьм
	case "xml":
	case "htm":
	case "html":
		/*
		aStart = ["<"];
		aStart = [">"];
		*/
		aStart = ["<", ">", '"', "'"]; // выделяет не тексты, а теги
		aStart = [">", "<", '"', "'"];
		break;

	default:
		/*
		aStart = '(,{,[,"'.split(',')
		aEnd = '),},],"'.split(',')
		*/
		aStart = ["(", "{", "[", '"', "'"];
		aEnd = [")", "}", "]", '"', "'"];
		break;
}

var nPosAll = [[0, 0, nSelStart],
[0, 0, nSelStart],
[0, 0, nSelStart],
[0, 0, nSelStart],
[0, 0, nSelStart],
[0, 0, nSelStart]];

var nStartPos2 = 0;
var nEndPos2 = 0;
var nEndPos = 0
var nStartPosTmp = 0;
var nStartPos = 0;
var idx = -1;


SetRedraw(hEditWnd, false);
var nFirstLine = saveLineScroll(hEditWnd);
Search()
function Search() {
	for (var j = 0; j <= 7; j++) { // сколько раз ищем скобки выше и выше. Ведь выше стоящие скобки могут быть одноуровневые и скрипт никогда не захватит выше.
		for (var i = 0; i <= aStart.length; i++) {
		// WScript.Echo(i);
			if (nPosAll[i][2] ==  -1) { // если 
				continue;
			}
			AkelPad.SetSel(nPosAll[i][2], nSelEnd); // возвращаем выделение
			nStartPos = AkelPad.TextFind(hEditWnd, aStart[i], 0x00100000 + 0x80000000); // FRF_UP + FRF_TEST - ищем вверх парный оператор
			nPosAll[i][2] = nStartPos;
		// WScript.Echo(nStartPos);
			if (nStartPos ==  -1) { // если 
				continue;
			}
			nEndPos = GetPos(nStartPos); // ищем парный оператор
			// WScript.Echo('шаг = ' + i + '\n' + nStartPos + '\n' + nEndPos);
			if (nEndPos < nSelEnd || nEndPos == -1) { // если закрывающий оператор-скобка не вышла за пределы выделенного, то игнор
				continue;
			} else {
				// nStartPos2 = nStartPos; // кэшируем валидные операторы
				// nEndPos2 = nEndPos;
				nPosAll[i][0] = nStartPos; // кэшируем валидные операторы
				nPosAll[i][1] = nEndPos;
		// WScript.Echo('валидные = ' + nStartPos + '\n' + nEndPos);
		// WScript.Echo('валидные = ' + nPosAll[i][0] + '\n' + nPosAll[i][1]);
				// WScript.Echo(nPosAll[i][0] + '\n' + nPosAll[i][1]);
			}
		
			if (nStartPosTmp < nStartPos) {
				nStartPosTmp = nStartPos
				idx = i;
			}
		};
		if (idx > -1) {
			return
		}
	};
};

// WScript.Echo('idx = ' + idx);
if (idx > -1) { // nStartPos не подразумевает 0, так как это выделить всё
	if (nPosAll[idx][0] !== -1 && nPosAll[idx][1] !== -1) {
		// WScript.Echo(nPosAll[idx][0] + '\n' + nPosAll[idx][1]);
		// AkelPad.SetSel(nPosAll[i][0] + 1, nPosAll[i][1]); // без захвата разделителя
		AkelPad.SetSel(nPosAll[idx][0], nPosAll[idx][1] + 1); // с захватом разделителя
	}
} else {
AkelPad.SetSel(nSelStart, nSelEnd);
}
restoreLineScroll(hEditWnd, nFirstLine);
SetRedraw(hEditWnd, true);

function GetPos(Pos) {
	var lpBuffer;
	var a;
	var s = "";
	AkelPad.SetSel(Pos, Pos); // курсор в начало скобки/кавычки, чтобы найти пару

	if (lpBuffer = AkelPad.MemAlloc(64 * _TSIZE)) {
		var res;

		res = AkelPad.Call("XBrackets::SelToMatchingBracket", 1, lpBuffer);
		if (res > 0) {
			s = AkelPad.MemRead(lpBuffer, _TSTR);
		}

		AkelPad.MemFree(lpBuffer);
	}

	a = s.split(" ");
	if (a.length == 3) {
		// WScript.Echo("pos1 = " + a[0] + "\npos2 = " + a[1] + "\nbrackets = " + a[2]);
		return parseInt(a[1])
	}
	return -1
}

function SendMessage(hWnd, uMsg, wParam, lParam) {
	return oSys.Call("User32::SendMessage" + _TCHAR, hWnd, uMsg, wParam, lParam);
}

function SetRedraw(hWnd, bRedraw)
{
  SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
  bRedraw && oSys.Call("User32::InvalidateRect", hWnd, 0, true);
}

// From Instructor's SearchReplace.js
function saveLineScroll(hWnd)
{
	AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, false, 0);
	return AkelPad.SendMessage(hWnd, 3129 /*AEM_GETLINENUMBER*/, 4 /*AEGL_FIRSTVISIBLELINE*/, 0);
}
function restoreLineScroll(hWnd, nBeforeLine)
{
	if (AkelPad.SendMessage(hWnd, 3129 /*AEM_GETLINENUMBER*/, 4 /*AEGL_FIRSTVISIBLELINE*/, 0) != nBeforeLine)
	{
		var lpScrollPos;
		var nPosY=AkelPad.SendMessage(hWnd, 3198 /*AEM_VPOSFROMLINE*/, 0 /*AECT_GLOBAL*/, nBeforeLine);

		if (lpScrollPos=AkelPad.MemAlloc(_X64?16:8 /*sizeof(POINT64)*/))
		{
			AkelPad.MemCopy(lpScrollPos + 0 /*offsetof(POINT64, x)*/, -1, 2 /*DT_QWORD*/);
			AkelPad.MemCopy(lpScrollPos + (_X64?8:4) /*offsetof(POINT64, y)*/, nPosY, 2 /*DT_QWORD*/);
			AkelPad.SendMessage(hWnd, 3180 /*AEM_SETSCROLLPOS*/, 0, lpScrollPos);
			AkelPad.MemFree(lpScrollPos);
		}
	}
	AkelPad.SendMessage(hWnd, 3377 /*AEM_UPDATECARET*/, 0, 0);
	AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, true, 0);
	oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
, о котором я писал выше. Конечно я видел скрипт BracketsGoTo.js, но хочу сделать подсчёт открывающих и закрывающих операторов, чтобы выделять по своей скобке.
Есть нюансы, для кавычек только на одной строке. Учесть типы файлов.

И вопрос: как узнать что оператор подсвечен как комментарий и его надо игнорировать? Если сделать их очистку, то сложно высчитывать позицию. Я бы хотел знать какой ID подсвеченного символа. На данный момент комментарии ломают алгоритм.

Использовал плаг XBrackets.dll, который выдаёт правильную скобку.
Уже рабочий вариант. Попробуйте многократно вызывать хоткей скрипта и выделение будет расширяться шаг за шагом и остановится когда следующий шаг бесполезен так как выделил бы всё содержимое. Но в других языках где используются чаще ключевые слова, например If и EndIf, Switch и EndSwitch эфективность скрипта мала.

В HTML-файле работает плохо, я добавил команду Call("XBrackets::SelToNearestBrackets") если ничего не выделено, чтобы выделять между тегами в HTML-файле.

Обновил 6 раз. Добавил восстановление прокрутки.

Offline
Posts: 44
Joined: Wed May 01, 2019 10:10 am

Post by Олег »

Доброго времени суток!
Хочу написать код для кнопки-обрамление выделения символами.Нужно чтобы кнопка была активной только когда есть выделение.
Пробую написать так:

SET(128, If(`AkelPad.GetSelText(0)`, 0x0, 0x2))
"Обрамление выделения" <код>
UNSET(128)
но ничего не происходит...
Интересно что такой же код в главном меню срабатывает, а на тулбаре никак не хочет. Знак минуса перед именем кнопки отсутствует. В чём дело?
P.S. AkelPad версии 4.8.9 установлен на замену стандартному блокноту.

Да, забыл написать. Кнопка представляет собой выпадающее меню с выбором символов. Может в этом всё дело?

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

Post by opk44 »

Олег wrote:Кнопка представляет собой выпадающее меню с выбором символов. Может в этом всё дело?
Нет, не в этом.
Проверял на меню спецсимвлов. Флаг работает:

Code: Select all

SET(128, If(`AkelPad.GetSelText(0)`, 0x0, 0x2)) 
"Специальные символы" +Call("SpecialChar::Main") Menu("SPECIALCHAR") Icon("%a\AkelFiles\Plugs\SpecialChar.dll", 0)
UNSET(128) 
P.S. Если не хотите показывать код целиком, то убедитесь, для начала, что он в принципе работает (без флага "128"). По обрывкам трудно угадывать.

Offline
Posts: 44
Joined: Wed May 01, 2019 10:10 am

Post by Олег »

Код:
"Обрамление выделения" Menu("BRACKETS")

В Context Menu:
"BRACKETS"
{
"Круглые скобки" Insert ("(\s)",1)
"Квадратные скобки" Insert ("[\s]",1)
"Фигурные скобки" Insert ("{\s}",1)
и.т.д.....
}

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

Post by opk44 »

Олег wrote:...
"Круглые скобки" Insert ("(\s)",1)
...
Что вам каждый раз мешает просто "скопипастить" истинный код? Такой код как вы тут написали, не может быть принят ContextMenu-плагином (из-за пробела после Insert перед скобкой), следовательно у вас там что-то другое.
Повторюсь, если записать правильно, то флаг "128" обрабатывается корректно

AkelPad.exe 4.9.9.0
--------------------------------
ContextMenu.dll 17.9.0.0
ToolBar.dll 12.6.0.0
Post Reply