Scripts discussion (4)

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

Post by opk44 »

wertfds
js --> vbs == '0x' --> '&H'

Code: Select all

AkelPad.SetSel 0, -1, &H08
либо можно получать (из десятичных значений!) функцией Hex():

Code: Select all

myFlag = Hex(8)
AkelPad.SetSel 0, -1, myFlag

Offline
Posts: 47
Joined: Sat Mar 10, 2018 11:35 am

Post by wertfds »

&H08
прекрасно, благодарю

ещё бы добавить в .ReplaceSel
[nSelect]=-3 НЕ выделять вставленный текст и восстановить позицию прокрутки, чтобы без костылей было

Offline
Posts: 47
Joined: Sat Mar 10, 2018 11:35 am

Post by wertfds »

добавьте в Scripts значение полосы прокрутки

Code: Select all

n = AkelPad.ScrollRow
AkelPad.ScrollRow = n + 1

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

Post by opk44 »

wertfds wrote:добавьте в Scripts значение полосы прокрутки

Code: Select all

n = AkelPad.ScrollRow
AkelPad.ScrollRow = n + 1
Что за код?
А если так:

Code: Select all

Call("Scroll::Settings", 2, 1)

Offline
Posts: 47
Joined: Sat Mar 10, 2018 11:35 am

Post by wertfds »

Что за код?
тот код, по которому следовало бы получать текущее значение полосы прокрутки. такого функционала же нет?

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

Post by opk44 »

wertfds wrote:
Что за код?
тот код, по которому следовало бы получать текущее значение полосы прокрутки. такого функционала же нет?
Как это "нет", если ниже указано что есть!

Offline
Posts: 47
Joined: Sat Mar 10, 2018 11:35 am

Post by wertfds »

opk44 wrote:есть!
каким кодом можно это сделать?
считать текущий номер полосы прокрутки в переменную

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

Post by AZJIO »

Имелись в наличии 2 скрипта DuplicateSel.js и LinesSelectCopyMoveDuplicate.js. Используя их функции сделал следующее:

Code: Select all

// 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" несколько раз и вписать свои числа. Допустим перечисление локальных переменных в функции с неким префиксом.

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

Post by YuS »

AZJIO wrote: Скрипт дублирует выделенное, но только вставляет его не рядом, а в конец строки. Проверьте, правильно ли всё, у меня работает.
Суть если есть допустим список "zd34, zd7, zd89, zd678" и надо его продолжить, только продублировать ", zd" несколько раз и вписать свои числа. Допустим перечисление локальных переменных в функции с неким префиксом.
Честно говоря, суть не вполне ясна, т.е. не совсем понятно, какие действия требуется выполнить в итоге... поэтому проверить будет сложно.
Если это:

Code: Select all

zd34, zd7, zd89, zd678
- строка и к этой строке требуется дополнение ",zd", после которого следует набор цифр...
Имхо, будет проще скопировать в буфер то, что необходимо дополнять и при многократном дополнении, не понадобятся лишние действия (выделение необходимой части для добавления в конец строки), просто после набора цифр, достаточно использовать хоткей - Ctrl+V
Либо я неточно понял суть задачи...

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

Post by AZJIO »

YuS wrote:Либо я неточно понял суть задачи...
Если не иметь хоткей Ctrl+Shift+D, то надо перед Ctrl+V ещё сделать Ctrl+С, то есть один хоткей заменяет 2 при определённых событиях, которые у меня встречаются часто. Учитывая что я привык к хорошему и удобному, то не хочется отвыкать.

________________
Да, и ещё может кто не в курсе, мне помогли сделать это

Code: Select all

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); 
- объединить два способа дублирования строки и выделенного на один хоткей.

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

Post 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: Учитывая что я привык к хорошему и удобному, то не хочется отвыкать.
Привычка - дело стабильное, отвыкать от чего-либо вообще, всегда сложно. :)

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

Post by opk44 »

AZJIO wrote:Если не иметь хоткей Ctrl+Shift+D, то надо перед Ctrl+V ещё сделать Ctrl+С, то есть один хоткей заменяет 2 при определённых событиях...
Исключительно в качестве ремарки:
Clipboard::SelAutoCopy
Автоматическое копирование выделения.
... и [Ctrl+С] нажимать больше не придётся.

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

Post by AZJIO »

YuS wrote:Ctrl+V - набор цифр - Ctrl+V - набор цифр ... и т.д..
Так я тоже использую, но например для разовой вставки одно нажатие все равно лишнее, так как курсор в любом случае перемещать. И бывает дублируешь строки такие как

Code: Select all

, <a href="111.htm">111</a>
в которых цифры пишешь не в конце, а делаешь двойной клик на 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", не знаю стоит ли при этом сразу ставить курсор в позицию ввода номера списка? Думаю надо выделить вставленное, тогда если захочется снова вставить то не потеряем эту возможность, а если хотим вводить номер списка, то жмём стрелку вправо, чтобы сдвинуть курсор в позицию конца выделенного.

Итак на выходе получаем новый скрипт

Code: Select all

// Description(1033): Select ", list" in the line "tmp32, list12, Arr2, NumL" and use the script
// Description(1049): Выделите ", list" в строке "tmp32, list12, Arr2, NumL" и используйте скрипт
//
// Usage:
//   Call("Scripts::Main", 1, "DuplicateSelCycle.js")

var sSelText=AkelPad.GetSelText();
if (sSelText=="")
  WScript.Quit();
  // втихаря завершаем

var lenDel = 2; // задаём длину разделителя (1 без пробела, 2 с пробелом, например "," или ", ")
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);
}

var find2 = sSelText.substr(0,lenDel); /*берём 1 или 2 символа из выделенного*/
if (find2.length < 2)
{
SetRedraw(hEditWnd, true);
WScript.Quit();
}

AkelPad.SetSel(nSelEnd, nLineEnd); // выделяем текст  до конца строки
var sSelText2=AkelPad.GetSelText(); // получаем текст  до конца строки
var nPos = sSelText2.indexOf(find2, 0); // ищем в нём повтор
if (nPos == -1)
  nPos= nPos+1;

nPos = nSelEnd + nPos;

AkelPad.SetSel(nPos, nPos);
AkelPad.ReplaceSel(sSelText);
AkelPad.SetSel(nPos, nPos+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);
}

function GetEndLine(nLine)
{
  return SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine, 0) + SendMessage(hEditWnd, 193 /*EM_LINELENGTH*/, SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine, 0), 0);
}


Улучшение для

Code: Select all

// 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. После вставки выделен дубликат, а не оригинал, так проще приступить сразу к его правке (стрелка вправо, затирание или добавление суффикса, аналогично и префикса)

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

Post by AZJIO »

Добавьте в toggleComments.js

Code: Select all

pb: "ahk",
reg: "ini",

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

Post by VladSh »

AZJIO
Здесь обсуждения скриптав, как что-то написать и т.п., а сами скрипты публикуются в теме Scripts collection. Тут не нужны эти простыни.
Post Reply