// Description(1033): Duplicate selected text at the end of the line
// Description(1049): Дублирует выделенный текст в конец строки
//
// Usage:
// Call("Scripts::Main", 1, "DuplicateSelAtEndLine.js")
var sSelText=AkelPad.GetSelText();
if (sSelText=="")
WScript.Quit();
// втихаря завершаем
var hEditWnd = AkelPad.GetEditWnd();
var sTitle = "Duplicate";
var nWordWrap;
var oSys = AkelPad.SystemFunction();
var nSelStart = AkelPad.GetSelStart();
var nSelEnd = AkelPad.GetSelEnd();
SetRedraw(hEditWnd, false);
//Disable Word Wrap
nWordWrap = SendMessage(hEditWnd, 3241 /*AEM_GETWORDWRAP*/, 0, 0);
if (nWordWrap > 0)
AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
var nLine1 = SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nSelStart);
var nLine2 = SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nSelEnd);
if (nLine1 != nLine2)
{
SetRedraw(hEditWnd, true);
WScript.Quit();
}
var nLineEnd = GetEndLine(nLine2);
if (nWordWrap > 0)
{
AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
SendMessage(hEditWnd, 3377 /*AEM_UPDATECARET*/, 0, 0);
}
SetRedraw(hEditWnd, true);
AkelPad.SetSel(nLineEnd, nLineEnd);
AkelPad.ReplaceSel(sSelText);
AkelPad.SetSel(nSelStart, nSelEnd);
function SetRedraw(hWnd, bRedraw)
{
SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
bRedraw && oSys.Call("User32::InvalidateRect", hWnd, 0, true);
}
function SendMessage(hWnd, uMsg, wParam, lParam)
{
return oSys.Call("User32::SendMessage" + _TCHAR, hWnd, uMsg, wParam, lParam);
}
function GetEndLine(nLine)
{
return SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine, 0) + SendMessage(hEditWnd, 193 /*EM_LINELENGTH*/, SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine, 0), 0);
}
Скрипт дублирует выделенное, но только вставляет его не рядом, а в конец строки. Проверьте, правильно ли всё, у меня работает.
Суть если есть допустим список "zd34, zd7, zd89, zd678" и надо его продолжить, только продублировать ", zd" несколько раз и вписать свои числа. Допустим перечисление локальных переменных в функции с неким префиксом.
Posted: Mon Jun 10, 2019 4:02 am
by YuS
AZJIO wrote:
Скрипт дублирует выделенное, но только вставляет его не рядом, а в конец строки. Проверьте, правильно ли всё, у меня работает.
Суть если есть допустим список "zd34, zd7, zd89, zd678" и надо его продолжить, только продублировать ", zd" несколько раз и вписать свои числа. Допустим перечисление локальных переменных в функции с неким префиксом.
Честно говоря, суть не вполне ясна, т.е. не совсем понятно, какие действия требуется выполнить в итоге... поэтому проверить будет сложно.
Если это:
- строка и к этой строке требуется дополнение ",zd", после которого следует набор цифр...
Имхо, будет проще скопировать в буфер то, что необходимо дополнять и при многократном дополнении, не понадобятся лишние действия (выделение необходимой части для добавления в конец строки), просто после набора цифр, достаточно использовать хоткей - Ctrl+V
Либо я неточно понял суть задачи...
Posted: Mon Jun 10, 2019 4:59 am
by AZJIO
YuS wrote:Либо я неточно понял суть задачи...
Если не иметь хоткей Ctrl+Shift+D, то надо перед Ctrl+V ещё сделать Ctrl+С, то есть один хоткей заменяет 2 при определённых событиях, которые у меня встречаются часто. Учитывая что я привык к хорошему и удобному, то не хочется отвыкать.
________________
Да, и ещё может кто не в курсе, мне помогли сделать это
var sSelText=AkelPad.GetSelText();
if (sSelText=="") {
AkelPad.Call("Scripts::Main", 1, "LinesSelectCopyMoveDuplicate.js", "D 1")
WScript.Quit();
}
var nSelStart=AkelPad.GetSelStart();
var nSelEnd=AkelPad.GetSelEnd();
AkelPad.SetSel(nSelEnd, nSelEnd);
AkelPad.ReplaceSel(sSelText);
AkelPad.SetSel(nSelStart, nSelEnd);
- объединить два способа дублирования строки и выделенного на один хоткей.
Posted: Mon Jun 10, 2019 5:45 am
by YuS
AZJIO wrote:Если не иметь хоткей Ctrl+Shift+D, то надо перед Ctrl+V ещё сделать Ctrl+С, то есть один хоткей заменяет 2 при определённых событиях, которые у меня встречаются часто.
Да, но Ctrl+Shift+D придется либо нажимать каждый раз после выделения необходимого, либо сразу нажать необходимое количество раз, но при этом после заполнения необходимых цифр в одном из скопированных элементов, придется перемещать каретку к следующему элементу вручную либо стрелками, либо мышью... в случае же с Ctrl+V, копирование Ctrl+C выполняется один раз, после чего последовательно выполняются необходимые добавления:
Ctrl+V - набор цифр - Ctrl+V - набор цифр ... и т.д.
YuS wrote:Либо я неточно понял суть задачи...
AZJIO wrote:
Учитывая что я привык к хорошему и удобному, то не хочется отвыкать.
Привычка - дело стабильное, отвыкать от чего-либо вообще, всегда сложно.
Posted: Mon Jun 10, 2019 12:25 pm
by opk44
AZJIO wrote:Если не иметь хоткей Ctrl+Shift+D, то надо перед Ctrl+V ещё сделать Ctrl+С, то есть один хоткей заменяет 2 при определённых событиях...
YuS wrote:Ctrl+V - набор цифр - Ctrl+V - набор цифр ... и т.д..
Так я тоже использую, но например для разовой вставки одно нажатие все равно лишнее, так как курсор в любом случае перемещать. И бывает дублируешь строки такие как
в которых цифры пишешь не в конце, а делаешь двойной клик на 111 и забиваешь свои данные. Посмотри тут во "Взаимосвязанные", внутри html как раз вышеуказанные ссылки. Бывает сильно отличающиеся тексты, а бывает похожие, выделяешь удобную для правки ссылку, дублируешь её в конец, подменяешь последнюю цифру.
opk44 wrote: ... и [Ctrl+С] нажимать больше не придётся.
Надо будет попробовать чтобы взвесить плюсы и минусы. Из минусов - будет забивать историю CLCL (расширенный буфер) ложными элементами.
YuS
Ладно, ещё идея, допустим выделяем ", ку" из списка "ку12, ку55, ку78, ку22", далее ищем программно из выделенного первые 2 символа, то есть ", " сразу после выделенного (определяем начало цикличных повторов) и перед ним вставляем, получим "ку12, ку55, ку, ку78, ку22". Аналогично выделяем переменную из списка "Local tmp32, list12, Arr2, NumL" допустим ", list" и после хоткея получаем "Local tmp32, list12, list, Arr2, NumL", не знаю стоит ли при этом сразу ставить курсор в позицию ввода номера списка? Думаю надо выделить вставленное, тогда если захочется снова вставить то не потеряем эту возможность, а если хотим вводить номер списка, то жмём стрелку вправо, чтобы сдвинуть курсор в позицию конца выделенного.
// Description(1033): Duplicate selected text to the right
// Description(1049): Дублирует выделенный текст вправо
//
// Usage:
// Call("Scripts::Main", 1, "DuplicateSel.js")
var sSelText=AkelPad.GetSelText();
if (sSelText=="") {
AkelPad.Call("Scripts::Main", 1, "LinesSelectCopyMoveDuplicate.js", "D 1")
WScript.Quit();
}
var hEditWnd = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();
var nSelStart=AkelPad.GetSelStart();
var nSelEnd=AkelPad.GetSelEnd();
SetRedraw(hEditWnd, false);
AkelPad.SetSel(nSelEnd, nSelEnd);
AkelPad.ReplaceSel(sSelText);
// AkelPad.SetSel(nSelStart, nSelEnd); // Оставить выделенным оригинал
AkelPad.SetSel(nSelEnd, nSelEnd+sSelText.length); // Выделить дубликат
SetRedraw(hEditWnd, true);
function SetRedraw(hWnd, bRedraw)
{
SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
bRedraw && oSys.Call("User32::InvalidateRect", hWnd, 0, true);
}
function SendMessage(hWnd, uMsg, wParam, lParam)
{
return oSys.Call("User32::SendMessage" + _TCHAR, hWnd, uMsg, wParam, lParam);
}
- убрал мерцание известными функциями SetRedraw. После вставки выделен дубликат, а не оригинал, так проще приступить сразу к его правке (стрелка вправо, затирание или добавление суффикса, аналогично и префикса)