Что хотелось бы добавить в AkelPad (3)

Russian main discussion
  • Author
  • Message
Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

1. Почему для вертикальной вставки отдельная команда и хоткей? Нельзя ли перед вставкой определить выделено ли несколько мест или одно, и соответственно использовать вертикальную вставку при вертикальном выделении.

2. При выделении столбиком и вводе текста удаляется выделенный текст и вставляется в первом выделении в верхней строке, нельзя ли ввод текста как то имитировать аналогично вертикальной вставкой, то есть ввод сразу во все строки.

Эти два пункта работают в Notepad++.

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

Post by YuS »


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

Post by AZJIO »

Не понял в чём ответ? Это всё равно не метод вставки, с тем же успехом я могу скопировать текст и выполнить Alt+V, а суть ввода в строки позволяет пропустить несколько действий, таких как выделять+копировать+вставлять, так как ввод происходит минуя эти операции, просто вводишь и всё.
Хотя 2 лишних клавиши удобней нажимать чем выделять+копировать+вставлять.

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

Post by YuS »

AZJIO wrote:
Не понял в чём ответ?
Там ответ на второй вопрос.
AZJIO wrote: Это всё равно не метод вставки, с тем же успехом я могу скопировать текст и выполнить Alt+V, а суть ввода в строки позволяет пропустить несколько действий, таких как выделять+копировать+вставлять, так как ввод происходит минуя эти операции, просто вводишь и всё.
Видно, что даже не было попытки попробовать... попробуй, а потом обсудим.
Скрипт делает, как раз, ровно это:
AZJIO wrote: 2. При выделении столбиком и вводе текста удаляется выделенный текст и вставляется в первом выделении в верхней строке, нельзя ли ввод текста как то имитировать аналогично вертикальной вставкой, то есть ввод сразу во все строки.

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

Post by AZJIO »

YuS wrote:попробуй
я не помню чтобы я что-то писал не попробовав. Предыдущий пост я сказал, что лучше чем ничего, но хотелось бы ... А скрипт от требует вызова, а тот идеальный вариант о котором я говорю он требует отлов сообщений (действий пользователя) при вводе. У скрипта такой штуки нет, если только она не предусмотрена заранее, тогда скрипт надо запустить при запуске AkelPad, чтобы он в фоне отлавливал события.
За ссылку скрипт всё равно спасибо, я видел его но думал он делает замену внутри выделенных частей (одно другим), но оказалось он для удобства вставки столбиком.
Кстати, пробел работает. Если я выделяю столбиком пробел и начинаю вводить пробелы, то текст сдвигается во всех, вот нужно тоже самое только для любого символа.

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

Post by YuS »

AZJIO wrote:А скрипт от требует вызова, а тот идеальный вариант о котором я говорю он требует отлов сообщений (действий пользователя) при вводе. У скрипта такой штуки нет, если только она не предусмотрена заранее, тогда скрипт надо запустить при запуске AkelPad, чтобы он в фоне отлавливал события.
Единственный недостаток - вызов скрипта (можно повесить на "горячие клавиши"). Одно дополнительное действие - имхо, это, всё же, не рыскание по меню, да и не сильно трудозатратно. А учитывая частоту подобной надобности (лично мне, за много лет, понадобилось, может быть, всего пару раз), реальная возможность реализации стремится к нулю...
AZJIO wrote: За ссылку скрипт всё равно спасибо, я видел его но думал он делает замену внутри выделенных частей (одно другим), но оказалось он для удобства вставки столбиком.
Помимо самого скрипта, там ещё надо посмотреть на даты постов и на то, что пожелания на эту фичу поступают не впервые и неоднократно...
AZJIO wrote: Кстати, пробел работает. Если я выделяю столбиком пробел и начинаю вводить пробелы, то текст сдвигается во всех, вот нужно тоже самое только для любого символа.
Сам-то я абсолютно не против, если вдруг так показалось и как сказал выше, пожелания такие существуют давно... но, пока увы.
Вижу три причины нереализации: либо сильно трудозатратно, либо реализация повлечет значительные переделки кода, которые могут повлиять на работу остальных плагинов, либо реальная необходимость реализации, для автора, слабо аргументирована... как-то так.

ЗЫ Кстати, по поводу notepad++, там есть в одном из постов:
Воркфлоу как два пальца об... асфальт: выделяете столбец, жмёте кнопку/пункт меню/горячие клавиши и в появившемся окне InputBox вбиваете/вставляете текст и жмёте Enter - более чем изящно, учитывая, что иного решения пока нет и скорость работы скрипта: не вижу ощутимой разницы при столбце на 10 строк, 3 000 строк, 10 500 строк, зато в NotePad++ вижу. Привык быстро.
Сам не пользуюсь NP++, но видимо, всё же, есть там какие-то проблемы, приводящие к тормозам при вводе на большое число строк...

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

Post by Infocatcher »

AZJIO wrote:1. Почему для вертикальной вставки отдельная команда и хоткей? Нельзя ли перед вставкой определить выделено ли несколько мест или одно, и соответственно использовать вертикальную вставку при вертикальном выделении.
На первый взгляд, поможет что-то вроде такого:

smartPaste.js

Code: Select all

var hWndEdit = AkelPad.GetEditWnd();
var pasteMode = AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0)
	? 2 /*PASTE_COLUMN*/
	: 0;
AkelPad.SendMessage(AkelPad.GetMainWnd(), 1194 /*AKD_PASTE*/, hWndEdit, pasteMode);

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

Post by AZJIO »

YuS
Не знаю насколько часто, но замечаю необходимость, вот примеры:
табличные данные всегда

Code: Select all

до
03.10.18 - какой то текст лог данных (дата ремонта)
13.08.18
29.07.18
после
03.10.2018
13.08.2018
29.07.2018
массив данных в программировании

Code: Select all

до
aa[bb] = cc
aa[bb] = cc
после
dd[ee] = ff
dd[ee] = ff
справка HTML перечисление списка параметров, одним цветом параметр, другим описание, вдруг в CSS класс надо зарезервировать под что-то а текущему дать осмысленный.

Code: Select all

до
<font class="red">
<font class="red">
после
<font class="param">
<font class="param">
две строки это для примера, там может быть 20 строк, то есть реально мне приходится делать в строках в пределах экрана максимум двух, то есть если NPP и тормозит при 1000 у меня как раз таки реального не было с огромным списком. Но опять же не спорю, я нахожу удобным ещё и клавишу Alt+Shift я нажимаю чтобы выделить к ним ещё нажимаю Insert и вот оно окошко ввода.

Infocatcher
да, работает.

___________________
В NPP есть генератор чисел и у него кстати есть недостатки. Смысл следующий: есть массив, мне нужно прописать индексы

Code: Select all

до
aa[bb] = cc
aa[bb] = cc
после
aa[1] = cc
aa[2] = cc
В NPP делается до конца файла от курсора, поэтому надо копировать в отдельный временный новый документ, потом обратно. Допустим я выделил вертикально 10 строк, если разряд меняется (после 9 идёт 10 уже 2 разряда) то дополнительно выделяю, потом ставлю курсор в верхней строки и открываю окно генератора чтобы задать шаг увеличение +1 (инкремент) и он вставляет в каждой строке в 3-ей позиции номера. Хотелось бы поддержка многострочного курсора, чтобы не в весь программный код вставлял, а в заданные строки. Не исключаю вариант текущая позиция курсора (начало выделения) запоминается как отступ, в которой вставлять, а последняя строка для вставки возможно методом выделения нескольких строк и автоматически захватится в окно настройки? Если начало и конец можно определить выделением, а в большинстве инкремент +1, то в принципе можно легко написать скрипт.

Вроде оно NumberListGenerator.js

Добавил InputBox с пятью полями ввода параметров.
Last edited by AZJIO on Tue Sep 03, 2019 3:50 pm, edited 1 time in total.

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

Post by YuS »

AZJIO wrote:YuS
Не знаю насколько часто, но замечаю необходимость
Возможно, она и есть у кого-то, но меня-то в этом убеждать бесполезно, обращаться надо к автору. :)
AZJIO wrote: В NPP есть генератор чисел и у него кстати есть недостатки. Смысл следующий: есть массив, мне нужно прописать индексы

Code: Select all

до
aa[bb] = cc
aa[bb] = cc
после
aa[1] = cc
aa[2] = cc
В NPP делается до конца файла от курсора, поэтому надо копировать в отдельный временный новый документ, потом обратно. Допустим я выделил вертикально 10 строк, если разряд меняется (после 9 идёт 10 уже 2 разряда) то дополнительно выделяю, потом ставлю курсор в верхней строки и открываю окно генератора чтобы задать шаг увеличение +1 (инкремент) и он вставляет в каждой строке в 3-ей позиции номера. Хотелось бы поддержка многострочного курсора, чтобы не в весь программный код вставлял, а в заданные строки. Не исключаю вариант текущая позиция курсора (начало выделения) запоминается как отступ, в которой вставлять, а последняя строка для вставки возможно методом выделения нескольких строк и автоматически захватится в окно настройки? Если начало и конец можно определить выделением, а в большинстве инкремент +1, то в принципе можно легко написать скрипт.
Надо учитывать то, что редактор не создавалась и не развивался по принципу: "а вот, в программе N, есть такой-то функционал, давайте его реализуем", это точно не сработает. :)

Что касается инкрементной вертикальной вставки, можно глянуть тут и тут, возможно пригодится.

Про многострочный курсор уже говорилось и не раз, но... возможно, у тебя и получится убедить автора... :)

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

Post by AZJIO »

YuS wrote:Возможно, она и есть у кого-то, но меня-то в этом убеждать бесполезно, обращаться надо к автору. :)
Знаёшь фразу "а что так можно было?", а вдруг в тот момент ты просто не знал о такой возможности.
YuS wrote:"а вот, в программе N, есть такой-то функционал, давайте его реализуем", это точно не сработает
и я знаю почему, если есть фотошоп, это не значит что я должен его для кого-то написать. Но тут срабатывает другая вещь, допустим проходит год-два и откладывается некоторые хотелки для реализации, идеально, это когда комплексно подойти, сразу учесть в план вещи, которые если ты уже сделаешь, а потом кто-то скажет добавь, а надо переписывать прогу, естественно это улетит ещё на год-два, а то и на десятилетие.
YuS wrote:Что касается инкрементной вертикальной вставки
Я написал сначала скрипт InsertNum.js, потом смотрю скрипты начале темы и вдруг там он уже есть от cnnnc, пробую, действительно создаёт список, но он просто вставляет последовательный список, не в колонку, а формирует его, потом вставляет, то есть это как бы не то, но что мне понравилось - окно параметров, вдруг я вижу скрипу нужна InputBox_function.js, думаю, а может там упрощено создание, смотрю автора, коллекцию, там оказывается пример есть KDJ\Examples\InputBox.js, конструкция очевидная, естественно я вставляю себе в скрипт, и то что я хотел задать параметры уже работает. Но у cnnnc работает и с дробным списком, там он как то их разделяет на до запятой и после и подстраивает ожидаемо, я конечно сделал попроще, частично выправляя результат, но догадался что дробную точку можно ведь поставить после вертикальной вставкой, так что это вопрос закрыт. Но ещё как и в NPP ранее был недостаток, допустим надо ввести числа в сто строк, но пока эти строки не создашь он их сам не создаёт, будет одна строка введёт 1 и всё, поэтому я сделал как у cnnnc, тупо вставить заданное количество чисел, добавив поле "Число строк", но этот вариант отменяет параметр "Колонка". Получается не всё очевидно и надо читать описание к скрипту, интуитивно пользователь задаст число строк и потеряет основное преимущество - вставка в колонку.

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

Post by YuS »

AZJIO wrote: Знаёшь фразу "а что так можно было?"
Ну, так, надеюсь, что Александр иногда читает нас... и возможно, при удачном сочетании желания и свободного времени, что-нибудь реализует. :)
То, что скриптами реализовать невозможно, естественно.
AZJIO wrote:Получается не всё очевидно и надо читать описание к скрипту, интуитивно пользователь задаст число строк и потеряет основное преимущество - вставка в колонку.
Тем и хорош AP, что для облегчения собственного труда, многое можно реализовать скриптами и даже ими поделиться. Сам-то я как-то пытался написать что-то, но как правило, по мере изучения готовых скриптов, оказывалось, что моя хотелка уже существует и работает... так что, так и не получилось наваять что-то более-менее законченное, а не парустрочие. :)
А описание надо читать всегда (хорошо, когда оно есть), ибо интуитивно - не всегда можно определить наличие той или иной функции в скрипте...

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

Post by AZJIO »

Нехватает подсветки в консоли скриптом или я не понимаю как сделать!

Code: Select all

var hWndOutput = GetOutputWindow() // получить дескриптор окна консоли

AkelPad.SetEditWnd(hWndOutput); // устанавливает консоль окном редактирования
// sLogText = AkelPad.GetTextRange(0, -1); // получает текст консоли
AkelPad.Call("Coder::HighLight", 2, "#FFFFFF", "#F54E52", 0, 0, -1, "полу");
AkelPad.SetEditWnd(0); // возвращает окно редактирования


function GetOutputWindow() {
	var lpWnd;
	var hWnd = 0;

	if(lpWnd = AkelPad.MemAlloc(_X64 ? 8 : 4 /*sizeof(HWND)*/ )) {
		AkelPad.Call("Log::Output", 2, lpWnd);
		hWnd = AkelPad.MemRead(lpWnd, 2 /*DT_QWORD*/ );
		AkelPad.MemFree(lpWnd);
	}
	return hWnd;
}

В примере AkelPad.GetTextRange работает с окном консоли, после подмены с помощью AkelPad.SetEditWnd, но AkelPad.Call("Coder::HighLight" не подсвечивает в консоли, я попытался в Scripts-Rus.txt и Coder-Rus.txt найти команды, но не нашёл. Если только сгенерировать Coder файл на лету и применить его с Call("Log::Output", 4, "TEXT", TEXTLEN, APPEND, CODEPAGE, "ALIAS")

Сделал

Code: Select all

// AZJIO, 20.09.2019
// Description(1033): Highlight the text in the console (Log plugin)
// Description(1049): Подсветить текст в консоли (Log плагин)
//
// Usage:
// AkelPad.Call("Scripts::Main", 1, "LogHighLight.js", '-sSelText="Привет" -bNotRegExp=1'); // элементарный вызов
// AkelPad.Call("Scripts::Main", 1, "LogHighLight.js", '-sSelText="' + sWhatText + '" -bNotRegExp=1'); // sWhatText - переменная с текстом
// AkelPad.Call("Scripts::Main", 1, "LogHighLight.js", '-sSelText="' + sWhatText + '" -bNotRegExp=' + (SendDlgItemMessage(hDlg, IDC_SEARCH_REGEXP, 240 /*BM_GETCHECK*/, 0, 0)?0:1)); // здесь пример захвата чекбокса рег.выр. в скрипте FindReplaceEx.js

var hWndOutput = GetOutputWindow() // получить дескриптор окна консоли
if(!hWndOutput) {
	WScript.Echo("Консоль закрыта, нечего подсвечивать");
	WScript.Quit();
};

var pPath = AkelPad.GetAkelDir();
var pPathCoder = pPath + "\\AkelFiles\\Plugs\\Coder\\sss1.tmp";
if (!FileExists(pPathCoder)) {
	WScript.Echo('Нужен файл "\\AkelFiles\\Plugs\\Coder\\sss1.tmp"');
	WScript.Quit();
}

// Добавлена обработка параметров
var bNotRegExp = AkelPad.GetArgValue("bNotRegExp", 1);
var sSelText = AkelPad.GetArgValue("sSelText", AkelPad.GetSelText());
// WScript.Echo(sSelText + ' ' + bNotRegExp);

// var sSelText = AkelPad.GetSelText()
if(sSelText == "") {
	var hMainWnd = AkelPad.GetMainWnd();
	if(AkelPad.MessageBox(hMainWnd, "Нужно выделить текст!\nИспользовать регулярное выражения из буфера обмена?", WScript.ScriptName, 4+256+32) == 6) {
		sSelText = AkelPad.GetClipboardText();
		bNotRegExp=0;
	}
	else {
		WScript.Quit();
	}
}

AkelPad.SetEditWnd(hWndOutput); // устанавливает консоль окном редактирования
var sLogText = AkelPad.GetTextRange(0, -1); // получает текст консоли
var pPathCoder1 = pPath + "\\AkelFiles\\Plugs\\Coder\\ss1.coder";
var pTextCoder = AkelPad.ReadFile(pPathCoder, 0xD, 1200, true); // 1200 = 16LE
if(/[\r\n]/.test(sSelText)) { // отменяем подсветку если выделен многострочный текст, Coder это не переварит
	AkelPad.SetEditWnd(0);
	WScript.Echo("Не для многострочного текста");
	WScript.Quit();
}

if (bNotRegExp) {
	sSelText = sSelText.replace(/[\]\[\{\}\(\)\*\+\?\.\^\$\|\=\<\>\#\\]/g, escaper); // экранировать спецсимволы регулярного выражения
}
pTextCoder = pTextCoder.replace(/%#\$&@/g, sSelText); // замена шаблона в рег.выр. секции
AkelPad.WriteFile(pPathCoder1, pTextCoder, -1, 1200, true); // 1200 = 16LE
AkelPad.Call("Log::Output", 4, sLogText, -1, 0, 0, ".ss1") // вставить текст включая подсветку alias
AkelPad.SetEditWnd(0); // возвращает окно редактирования
AkelPad.Call("Coder::Settings", 2); // перерисовать  подсветку

function escaper(str) {
	return '\\' + str;
}

function GetOutputWindow() {
	var lpWnd;
	var hWnd = 0;

	if(lpWnd = AkelPad.MemAlloc(_X64 ? 8 : 4 /*sizeof(HWND)*/ )) {
		AkelPad.Call("Log::Output", 2, lpWnd);
		hWnd = AkelPad.MemRead(lpWnd, 2 /*DT_QWORD*/ );
		AkelPad.MemFree(lpWnd);
	}
	return hWnd;
}

// если объект разово используется, то можно внутри функции его создать
function FileExists(pPathCoder) {
	var fso = new ActiveXObject("Scripting.FileSystemObject");
	return (fso.FileExists(pPathCoder)?1:0);
}
- чтобы подсветить нужно sss.coder, в раздел QuotesRE: добавить строку
; для поиска
1 "%#$&@" "\0=(0,#FFFFFF,#F54E52)"
, переименовать файл в sss1.tmp, создать ещё файл ss1.coder (копия предыдущего) и обновить кэш, чтобы там появилась строка типа ss1.coder=3990EFF801D56808:"*.ss1"
Смысл в следующем: в файле шаблоне sss1.tmp строка "%#$&@" заменяется выделенным или буфером обмена при вызове скрипта LogHighLight.js он заменяет текст сохраняя в ss1.coder, который прописан в кэше, далее вызывается перерисовка и текст в консоли подкрашен.
Как это использовать: допустим выполнен поиска какого либо слова в консоль целыми строками. Так как обычно диалог поиска вызывается с предварительно выделенным текстом, то остаётся ещё вызвать хоткей подкраски лога и текст будет подсвечен.
Можно ещё добавить подсветку взависимости от расширения файла, тогда это будет более адекватно.

Code: Select all

Files:
*.ss1

QuotesRE:
; для поиска
1	`%#$&@`	"\0=(0,#FFFFFF,#F54E52)"
; Для FindReplaceEx.js
1	"^  \[\d+, \d+, \d+, \d+:\d+\]"	"\0=(0,#AFE7B3,0)"
1	"\A[A-Z]:\\.+?:"	"\0=(0,#E3CEAB,0)"
1	"Всего вхождений: \d+\Z"	"\0=(0,#E3CEAB,0)"
; Для SearchReplace.js
1	"\(\d+,\d+\)"	"\0=(0,#AFE7B3,0)"
1	"\A\d+:"	"\0=(0,#E3CEAB,0)"
; Для HTMLTidy
; 1	"^line \d+ column \d+"	"\0=(0,#AFE7B3,0)"
1	"^(line) (\d+) (column) (\d+)"	"\1=(0,#AFE7B3,0)	\2=(0,#FDCEAE,0)	\3=(0,#AFE7B3,0)	\4=(0,#FDCEAE,0)"
; 0	'[а-яё]'	"\0=(0,#BFCAA9,0)"
; Латинский алфавит
0	'[a-z]'	"\0=(0,#AAA6DB,0)" ; может C0AD72
; Операторы
0	'[&+=*\(\)\{\}\]\[]'	"\0=(0,#DE9797,0)"
; Числа
0	"\d"	"\0=(0,#EBCB9C,0)"
Last edited by AZJIO on Fri Sep 20, 2019 2:41 pm, edited 1 time in total.

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

Post by AZJIO »

Выше постом я сделал LogHighLight.js. Что если вставить его вызов в скрипт поиска FindReplaceEx.js? В строке 1779 есть код вставки результатов

Code: Select all

  if (nCmd <= 2)
    AkelPad.Call("Log::Output", 4, bContinue ? sTxtTotalFound + nCountAll : "...", -1);
  else if (bContinue)
надо сделать так

Code: Select all

  if (nCmd <= 2)
    {
    AkelPad.Call("Log::Output", 4, bContinue ? sTxtTotalFound + nCountAll : "...", -1);
    // AkelPad.Call("Scripts::Main", 1, "LogHighLight.js", "");
    AkelPad.Call("Scripts::Main", 1, "LogHighLight.js", '-sSelText="' + sWhatText + '" -bNotRegExp=' + (SendDlgItemMessage(hDlg, IDC_SEARCH_REGEXP, 240 /*BM_GETCHECK*/, 0, 0)?0:1)); // sWhatText - искомый
    }
  else if (bContinue)
в результате сразу подсветка
Image

Обновил: в скрипт LogHighLight.js добавил передачу параметров из скрипта FindReplaceEx.js

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

Post by AZJIO »

Очень трудно ставить курсор в начале строки, особенно если в начале строки буква i. В левой части есть отступ 4 пиксела, в этой области курсор меняет стрелку вправо, как и на поле с номерами строк. При клике в этой области выделяется строка, как и на поле с цифрами. Нельзя ли, чтобы клик на этом поле ставил курсор в начале строки, а на поле с цифрами было бы также как и раньше выделение строки. Для тех кто не использует эти поля понятно что пропадёт возможность такого выделения, но обычно те кто знает об этой фичи у них скорее всего будет поле фолдинга и номера строк. Хотя кнопка home помогает даже при выделении столбиком.

Offline
Posts: 24
Joined: Sat Jul 30, 2016 9:39 am

Post by Sticher78 »

AZJIO wrote:Очень трудно ставить курсор в начале строки, особенно если в начале строки буква i. ...кнопка home помогает даже при выделении столбиком.
Вот сам себе и ответил.

Есть еще настройка:
Настройки -> Параметры -> Отступ текста.

Но она не то делает, и да, не помешала бы настройка под увеличение свободного места под вставку курсора в начало строки, полностью подписываюсь.
Хотя всю дорогу сам кнопку Home и юзал, но никто же не откажется от удобства? :D

Off-top: Ещё бы кто под мои леворукие клешни клаву забацал с функционально-цифровым блоком слева, в пределах адекватной цены, ехх..
Post Reply