Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

se7h
Ладно, видимо, это знак. Бромиуму быть. :)
Обновил: openFileIn.js

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher
Чтобы перенос не дергать с помощью IDM_VIEW_WORDWRAP, можно воспользоваться для получения номера строки:

Code: Select all

nUnwrappedLine=AkelPad.SendMessage(hWndEdit, 3143 /*AEM_GETUNWRAPLINE*/, nLine, 0);

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

Post by Infocatcher »

Instructor wrote:Чтобы перенос не дергать с помощью IDM_VIEW_WORDWRAP, можно воспользоваться для получения номера строки:

Code: Select all

nUnwrappedLine=AkelPad.SendMessage(hWndEdit, 3143 /*AEM_GETUNWRAPLINE*/, nLine, 0);
Что ж раньше-то молчали! :D
А с прочими EM_LINEINDEX и EM_LINELENGTH что?

Кстати, там еще и в toggleComments.js при включении переноса должны быть проблемы, все ленюсь. :)

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher wrote:А с прочими EM_LINEINDEX и EM_LINELENGTH что?
Есть еще AEM_GETWRAPLINE. Также может пригодится:

Code: Select all

var hWndEdit=AkelPad.GetEditWnd();
var nCaretPos;
var nTextLen;
var nCaretLineStartPos;
var nCaretLineEndPos;

//No input position required pass -1
nCaretPos=GetOffset(hWndEdit, 5 /*AEGI_CARETCHAR*/, -1);
nTextLen=GetOffset(hWndEdit, 2 /*AEGI_LASTCHAR*/, -1);

//Input position required
nCaretLineStartPos=GetOffset(hWndEdit, 18 /*AEGI_WRAPLINEBEGIN*/, nCaretPos);
nCaretLineEndPos=GetOffset(hWndEdit, 19 /*AEGI_WRAPLINEEND*/, nCaretPos);

WScript.Echo("Caret line lenght=" + (nCaretLineEndPos - nCaretLineStartPos));

function GetOffset(hWndEdit, nType /*AEGI_*/, nOffset)
{
  var lpIndex;

  if (lpIndex=AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/))
  {
    if (nOffset != -1)
      AkelPad.SendMessage(hWndEdit, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset, lpIndex);
    AkelPad.SendMessage(hWndEdit, 3130 /*AEM_GETINDEX*/, nType, lpIndex);
    nOffset=AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex);
    AkelPad.MemFree(lpIndex);
  }
  return nOffset;
}
Last edited by Instructor on Mon Feb 07, 2011 4:27 am, edited 1 time in total.

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

Post by Infocatcher »

Instructor
Спасибо.
Еще нужен заменитель для

Code: Select all

var linesCount = AkelPad.SendMessage(hWndEdit, 3129 /*AEM_GETLINENUMBER*/, 0 /*AEGL_LINECOUNT*/, 0);

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

Post by Infocatcher »

toggleComments.js
Fixed lines handling with word wrap enabled, thanks to Instructor's example.


[Upd]
Instructor
С ShiftTabSize.js при -Local=true теперь неудобство – %t в строке состояния не показывает реальную ширину табов.

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Упустил _X64?24:12 в GetOffset.js, чтобы работало на x64.
Infocatcher wrote:Еще нужен заменитель для...
Если имеется ввиду получение номера строки без переноса, то сначала вызывается AEM_GETLINENUMBER затем AEM_GETUNWRAPLINE.
...%t в строке состояния не показывает реальную ширину табов.
Да, т.к. размер табуляции устанавливается напрямую в AkelEdit минуя при -Local=true AkelPad.

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

Post by Infocatcher »

Instructor wrote:Упустил
Обновил. :)
Instructor wrote:Если имеется ввиду получение номера строки без переноса, то сначала вызывается AEM_GETLINENUMBER затем AEM_GETUNWRAPLINE.
Да, было нужно количество строк (номер последней строки).
Теперь понял, тупим-с. Но пробовать буду чуть позже. :)

viewtopic.php?p=7951#p7951 (viewtopic.php?p=8493#p8493)
Infocatcher wrote:Хотелось бы две раздельные группы команд для переключения вкладок (сейчас поведение переключается только настройкой).
Гора слишком вяло шла к Магомету: tabsRightLeft.js :D

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

Post by VladSh »

Infocatcher wrote:было нужно количество строк (номер последней строки).
Последняя строка файла:

Code: Select all

var nLastLine = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, -2);
Instructor wrote:Есть еще AEM_GETWRAPLINE. Также может пригодится: GetOffset.js
А в чём разница?
Пока что вижу, что для такой простой операции, как получение длины строки, приходится делать кучу телодвижений..
В чём прелесть?

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

Post by Infocatcher »

VladSh wrote:Последняя строка файла:

Code: Select all

var nLastLine = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, -2);
И посчитаются все строки, в том числе и перенесенные из-за word wrap.
VladSh wrote:Пока что вижу, что для такой простой операции, как получение длины строки, приходится делать кучу телодвижений..
В чём прелесть?
Прелесть в том, что не надо отключать на время вычислений перенос по словам.

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

Post by Infocatcher »

А мы продолжаем тупить. :)

Было:

Code: Select all

line = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, indx);
Вопрос: как через индекс вычислить номер строки с учетом переноса по словам?
Индекс, например, такой:

Code: Select all

var indx = AkelPad.GetSelStart() + 1;

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher
Оставляем EM_EXLINEFROMCHAR и добавляем AEM_GETUNWRAPLINE :)

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

Post by Infocatcher »

Instructor wrote:Оставляем EM_EXLINEFROMCHAR и добавляем AEM_GETUNWRAPLINE :)
Точно туплю. :)

Code: Select all

var hWndEdit = AkelPad.GetEditWnd();
var indx = AkelPad.GetSelStart();
var wrpLine = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, indx);
var unwrpLine = AkelPad.SendMessage(hWndEdit, 3143 /*AEM_GETUNWRAPLINE*/, wrpLine, 0);
WScript.Echo(wrpLine + "\n" + unwrpLine);

А я сделал function unwrapLine(hWndEdit, line) и забыл передать ей hWndEdit. :? :D


[Upd]
goToLongestLine-test.js vs goToLongestLine.js
Скорость обработки упала вдвое (видно по проценту обработанного на больших файлах или при установке маленького ограничения по времени). :?

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Скорость обработки упала вдвое...
Ну например

Code: Select all

line       = getLineByIndex(hWndEdit, indx);
вызывать нет необходимости, т.к. при вхождении в цикл "while(true)" мы уже имеем line, который достаточно увеличивать на единицу или уменьшать (если reverse == true).
Также идин из вызовов можно убрать. Если reverse == true, убирается вторая строка. Если reverse == false, убирается вторая строка.

Code: Select all

		lineStart  = getOffset(hWndEdit, 18 /*AEGI_WRAPLINEBEGIN*/, indx);
		lineEnd    = getOffset(hWndEdit, 19 /*AEGI_WRAPLINEEND*/,   indx);
Т.к. indx уже равен началу/концу строки.

Code: Select all

		indx = reverse
			? lineStart - 1
			: lineEnd   + 1;

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

Post by Infocatcher »

Instructor
Да, логично.
Но тогда аналогично можно ускорить исходный алгоритм. :)
Также идин из вызовов можно убрать. Если reverse == true, убирается вторая строка. Если reverse == false, убирается вторая строка.
Опечатка?
В любом случае там потом

Code: Select all

var lineText = AkelPad.GetTextRange(lineStart, lineEnd);
для пересчета табуляций.
Locked