Discuss and announce AkelPad plugins
Offline
Posts: 1873 Joined: Mon Aug 06, 2007 1:07 pm
Contact:
Post
by Infocatcher » Sun Feb 06, 2011 4:29 pm
se7h
Ладно, видимо, это знак. Бромиуму быть.
Обновил:
openFileIn.js
Offline
Site Admin
Posts: 6403 Joined: Thu Jul 06, 2006 7:20 am
Post
by Instructor » Sun Feb 06, 2011 5:20 pm
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 » Sun Feb 06, 2011 5:32 pm
Instructor wrote: Чтобы перенос не дергать с помощью IDM_VIEW_WORDWRAP, можно воспользоваться для получения номера строки:
Code: Select all
nUnwrappedLine=AkelPad.SendMessage(hWndEdit, 3143 /*AEM_GETUNWRAPLINE*/, nLine, 0);
Что ж раньше-то молчали!
А с прочими EM_LINEINDEX и EM_LINELENGTH что?
Кстати, там еще и в toggleComments.js при включении переноса должны быть проблемы, все ленюсь.
Offline
Site Admin
Posts: 6403 Joined: Thu Jul 06, 2006 7:20 am
Post
by Instructor » Sun Feb 06, 2011 6:03 pm
Infocatcher wrote: А с прочими EM_LINEINDEX и EM_LINELENGTH что?
Есть еще AEM_GETWRAPLINE. Также может пригодится:
GetOffset.js GetOffset.js 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 » Sun Feb 06, 2011 7:33 pm
Instructor
Спасибо.
Еще нужен заменитель для
Code: Select all
var linesCount = AkelPad.SendMessage(hWndEdit, 3129 /*AEM_GETLINENUMBER*/, 0 /*AEGL_LINECOUNT*/, 0);
Offline
Site Admin
Posts: 6403 Joined: Thu Jul 06, 2006 7:20 am
Post
by Instructor » Mon Feb 07, 2011 4:20 am
Упустил _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 » Mon Feb 07, 2011 4:43 am
Instructor wrote: Упустил
Обновил.
Instructor wrote: Если имеется ввиду получение номера строки без переноса, то сначала вызывается AEM_GETLINENUMBER затем AEM_GETUNWRAPLINE.
Да, было нужно количество строк (номер последней строки).
Теперь понял, тупим-с. Но пробовать буду чуть позже.
viewtopic.php?p=7951#p7951 (
viewtopic.php?p=8493#p8493 )
Infocatcher wrote: Хотелось бы две раздельные группы команд для переключения вкладок (сейчас поведение переключается только настройкой).
Гора слишком вяло шла к Магомету:
tabsRightLeft.js
Offline
Posts: 3234 Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:
Post
by VladSh » Mon Feb 07, 2011 7:35 am
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 » Mon Feb 07, 2011 1:41 pm
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 » Mon Feb 07, 2011 2:57 pm
А мы продолжаем тупить.
Было:
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 » Tue Feb 08, 2011 9:28 am
Infocatcher
Оставляем EM_EXLINEFROMCHAR и добавляем AEM_GETUNWRAPLINE
Offline
Posts: 1873 Joined: Mon Aug 06, 2007 1:07 pm
Contact:
Post
by Infocatcher » Tue Feb 08, 2011 3:49 pm
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.
[Upd]
goToLongestLine-test.js vs
goToLongestLine.js
Скорость обработки упала вдвое (видно по проценту обработанного на больших файлах или при установке маленького ограничения по времени).
Offline
Site Admin
Posts: 6403 Joined: Thu Jul 06, 2006 7:20 am
Post
by Instructor » Tue Feb 08, 2011 5:22 pm
Скорость обработки упала вдвое...
Ну например
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 » Tue Feb 08, 2011 6:06 pm
Instructor
Да, логично.
Но тогда аналогично можно ускорить исходный алгоритм.
Также идин из вызовов можно убрать. Если reverse == true, убирается вторая строка. Если reverse == false, убирается вторая строка.
Опечатка?
В любом случае там потом
Code: Select all
var lineText = AkelPad.GetTextRange(lineStart, lineEnd);
для пересчета табуляций.