Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Infocatcher wrote:Strange to check edit window without main window.
My way may is strange, but simple, fast and efficient.

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

Post by VladSh »

Бывает, когда набираю текст, работаю только с клавиатурой, и часто не хватает функции копирования текущего слова, т.е. того, на котором установлена каретка.
У самому писать не хочется функцию определения текущего слова, а в AkelPad'е она есть, поэтому хотелось бы её использовать.
Идея проста: написать скрипт и посадить на комбинацию клавиш (я бы посадил на Ctrl+Alt+C или Ctrl+Alt+Up), в котором примерно такой алгоритм:
- проверка, если позиция курсора и позиция каретки не совпадает, то переместить курсор в позицию каретки;
- инициировать даблклик;
- скопировать в буфер то, что выделилось;
- восстановить позицию курсора.
Не понятно, как сделать первые два пункта... подскажете?

Не возражал бы, если эту функцию включить в Clipboard-плагин, и не пришлось её писать :D

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

VladSh,

Code: Select all

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);
	AkelPad.SetSel(nWordBeg, nWordEnd);
}

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

Post by VladSh »

Как-то так я и думал, что есть такие коды для SendMessage... но не подозревал, что всё столь красиво :D
Бомба :!: 8)

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Ой, забыл главное сделать - в буфер положить :)

PS: поспешили выложить. Там есть недочёт один.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Code: Select all

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);
}

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

Post by VladSh »

FeyFre "Вот фикс"
А в чём соль? Чего-то не догоняю :)

Upd: догнал! )))
Думаю, что если курсор стоит не на слове, то ничего выделяться/копироваться не должно.


Fr0sT
O base64.js.
Отличный стиль! Но поддерживает ли он русские буковки? Просто в инете куча вариантов base64, но очень мало корректных, т.е. чтобы и с кирилицей работало.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Думаю, что если курсор стоит не на слове, то ничего выделяться/копироваться не должно.
Ну дык фикс это и исправляет:
1. Если курсор на слове, то выделит и запомнит.
2. Если курсор на первой букве слова, то без фикса выделяло предыдущее слово а не это. Фикс это исправил.
3. Если курсор вне слова то с фиксом ничего выделять не будет(без фикса - выделит предыдущее)
Там ещё пара краевых эффектов есть(курсор в начале текста, курсор в конце текста), но их я вспомню после того как посмотрю как я их исправил в коде SpellCheck-а(я сутки убил что-бы их выловить :) ).

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

Post by VladSh »

FeyFre
А мой вариант как?

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

VladSh
Не выделяет слово если курсор стоит на первой букве. А должен.

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

Post by VladSh »

FeyFre wrote:Не выделяет слово если курсор стоит на первой букве. А должен.
Хм... а у меня выделяет! Если курсор перед первой буквой, то естессно, - не выделяет. Но если слово хотя бы из 2-х букв и каретка после первой, то выделяет.
А если слово из одной буквы, то смысла так выделять нет, проще как обычно: Ctrl+Shift+Left либо Ctrl+Shift+Right.
Last edited by VladSh on Mon Jul 12, 2010 7:59 am, edited 1 time in total.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

VladSh wrote:Но поддерживает ли он русские буковки? Просто в инете куча вариантов base64, но очень мало корректных, т.е. чтобы и с кирилицей работало.
Вот, из-за этого пришлось делать две функции юникод <-> анси. Слава богу, Акель предоставляет текст только в одной кодировке (так ведь, хм?). Остаётся только перегнать из строки двухбайтовых символов в строку однобайтовых. В принципе, можно заморочиться и без промежуточной строки, но это уже потом :)

В планах поддержка других инет-кодировок, если запал не пройдёт :)
Last edited by Fr0sT on Fri Jul 09, 2010 7:27 pm, edited 1 time in total.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Если курсор перед первой буквой, то естессно, - не выделяет.
Это называется на первой букве(Курсор находится на краю стороне знакоместа). А эта буква принадлежит слову. И потому должно выделять.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Уф... намучался с этой конвертацией... я знал, что с кодировками будет задница, но чтобы настолько! В общем, оптимизировал код (обработка стала быстрее в среднем на 30%), добавил проверку на длинный текст (при длине в 100к символов шуршит около 10 секунд...), добавил параметр для перекодировки из ANSI в UTF16.
Если текст был закодирован из однобайтовой кодировки или utf8, надо пользоваться параметром dec. К сожалению, не получилось всегда выдавать текст как ANSI, чтобы потом перегнать его штатными средствами Акеля - ReplaceSel обрывает строку на нулевом символе :(

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

Post by VladSh »

FeyFre wrote:Это называется на первой букве(Курсор находится на краю стороне знакоместа). А эта буква принадлежит слову. И потому должно выделять.
Значит мы здесь просто не сошлись во мнениях, что не есть страшно :D
Locked