Infocatcher wrote:Strange to check edit window without main window.
My way may is strange, but simple, fast and efficient.
Posted: Fri Jul 09, 2010 1:21 pm
by VladSh
Бывает, когда набираю текст, работаю только с клавиатурой, и часто не хватает функции копирования текущего слова, т.е. того, на котором установлена каретка.
У самому писать не хочется функцию определения текущего слова, а в AkelPad'е она есть, поэтому хотелось бы её использовать.
Идея проста: написать скрипт и посадить на комбинацию клавиш (я бы посадил на Ctrl+Alt+C или Ctrl+Alt+Up), в котором примерно такой алгоритм:
- проверка, если позиция курсора и позиция каретки не совпадает, то переместить курсор в позицию каретки;
- инициировать даблклик;
- скопировать в буфер то, что выделилось;
- восстановить позицию курсора.
Не понятно, как сделать первые два пункта... подскажете?
Не возражал бы, если эту функцию включить в Clipboard-плагин, и не пришлось её писать
var hWndEdit = AkelPad.GetEditWnd();
if(hWndEdit)
{
var nPos = AkelPad.GetSelStart();
var nWordBeg = AkelPad.SendMessage(hWndEdit, 1100/*EM_FINDWORDBREAK*/, 0/*WB_LEFT*/, nPos);
var nWordEnd = AkelPad.SendMessage(hWndEdit, 1100/*EM_FINDWORDBREAK*/, 7/*WB_RIGHTBREAK*/, nWordBeg);
//! For case when caret located on word start position i.e. "prev-word |word-to-copy"
if(nWordEnd < nPos)
{
nWordBeg = AkelPad.SendMessage(hWndEdit, 1100/*EM_FINDWORDBREAK*/, 0/*WB_LEFT*/, nPos+1);
nWordEnd = AkelPad.SendMessage(hWndEdit, 1100/*EM_FINDWORDBREAK*/, 7/*WB_RIGHTBREAK*/, nWordBeg);
}
if(nWordEnd > nPos)
{
AkelPad.SetSel(nWordBeg, nWordEnd);
AkelPad.SetClipboardText(AkelPad.GetSelText());
}
AkelPad.SetSel(nPos, nPos);
}
Posted: Fri Jul 09, 2010 3:51 pm
by VladSh
FeyFre "Вот фикс"
А в чём соль? Чего-то не догоняю
Upd: догнал! )))
Думаю, что если курсор стоит не на слове, то ничего выделяться/копироваться не должно.
Fr0sT
O base64.js.
Отличный стиль! Но поддерживает ли он русские буковки? Просто в инете куча вариантов base64, но очень мало корректных, т.е. чтобы и с кирилицей работало.
Posted: Fri Jul 09, 2010 4:24 pm
by FeyFre
Думаю, что если курсор стоит не на слове, то ничего выделяться/копироваться не должно.
Ну дык фикс это и исправляет:
1. Если курсор на слове, то выделит и запомнит.
2. Если курсор на первой букве слова, то без фикса выделяло предыдущее слово а не это. Фикс это исправил.
3. Если курсор вне слова то с фиксом ничего выделять не будет(без фикса - выделит предыдущее)
Там ещё пара краевых эффектов есть(курсор в начале текста, курсор в конце текста), но их я вспомню после того как посмотрю как я их исправил в коде SpellCheck-а(я сутки убил что-бы их выловить ).
VladSh
Не выделяет слово если курсор стоит на первой букве. А должен.
Posted: Fri Jul 09, 2010 6:43 pm
by VladSh
FeyFre wrote:Не выделяет слово если курсор стоит на первой букве. А должен.
Хм... а у меня выделяет! Если курсор перед первой буквой, то естессно, - не выделяет. Но если слово хотя бы из 2-х букв и каретка после первой, то выделяет.
А если слово из одной буквы, то смысла так выделять нет, проще как обычно: Ctrl+Shift+Left либо Ctrl+Shift+Right.
Posted: Fri Jul 09, 2010 7:21 pm
by Fr0sT
VladSh wrote:Но поддерживает ли он русские буковки? Просто в инете куча вариантов base64, но очень мало корректных, т.е. чтобы и с кирилицей работало.
Вот, из-за этого пришлось делать две функции юникод <-> анси. Слава богу, Акель предоставляет текст только в одной кодировке (так ведь, хм?). Остаётся только перегнать из строки двухбайтовых символов в строку однобайтовых. В принципе, можно заморочиться и без промежуточной строки, но это уже потом
В планах поддержка других инет-кодировок, если запал не пройдёт
Posted: Fri Jul 09, 2010 7:26 pm
by FeyFre
Если курсор перед первой буквой, то естессно, - не выделяет.
Это называется на первой букве(Курсор находится на краю стороне знакоместа). А эта буква принадлежит слову. И потому должно выделять.
Posted: Sat Jul 10, 2010 4:46 pm
by Fr0sT
Уф... намучался с этой конвертацией... я знал, что с кодировками будет задница, но чтобы настолько! В общем, оптимизировал код (обработка стала быстрее в среднем на 30%), добавил проверку на длинный текст (при длине в 100к символов шуршит около 10 секунд...), добавил параметр для перекодировки из ANSI в UTF16.
Если текст был закодирован из однобайтовой кодировки или utf8, надо пользоваться параметром dec. К сожалению, не получилось всегда выдавать текст как ANSI, чтобы потом перегнать его штатными средствами Акеля - ReplaceSel обрывает строку на нулевом символе
Posted: Mon Jul 12, 2010 8:01 am
by VladSh
FeyFre wrote:Это называется на первой букве(Курсор находится на краю стороне знакоместа). А эта буква принадлежит слову. И потому должно выделять.
Значит мы здесь просто не сошлись во мнениях, что не есть страшно