Page 2 of 5

Posted: Mon Apr 21, 2008 2:13 pm
by DV
v.1.2 (April 2008)
+ new function: altSmartEnd

Posted: Wed Apr 23, 2008 11:35 am
by VladSh
Сила! Теперь даже нечего попросить :D

Posted: Fri Jul 04, 2008 12:32 pm
by DV
v.1.3
Changed: AkelPad 3.6.0 required.

Posted: Wed Aug 13, 2008 7:26 am
by DV
v.1.4
* compatibility with column selection in AkelPad 4.0.1+

Posted: Wed Aug 13, 2008 8:45 am
by VladSh
DV
Емеет ли смысл теперь NoSelEOL::Main, ведь выделение с новым контролом и так не захватывает символ перевода строки/конца файла?

Posted: Thu Aug 14, 2008 10:51 am
by DV
захватывает после дбл-кликов, выделяющих всю строку, а также по клику перед началом строки.

Неприятный баг

Posted: Mon Nov 17, 2008 9:26 am
by VladSh
Если предложение переходит на другую строку, то если установить курсор в строку, где находится начало предложения, при нажатии клавиши End курсор переходит не на последний символ этой же строки, а на первый символ следующей строки. :shock: А изредка бывает так, что курсор переходит на просто на следующую строку, а на след. строку в самый конец предложения!

Posted: Thu Nov 20, 2008 8:33 am
by DV
Instructor wrote:VladSh
Такого не наблюдаю. Может дело в NoSelEOL::SmartEnd?
Да, в нём. Но я не вижу решения, поскольку:
1) так ведёт себя EM_EXSETSEL. Хотя это можно было бы обойти, оставив обработку по умолчанию для позиции в конце строки, если бы не
2) для позиции каретки в конце строки, чьё продолжение перенесено на другую строку, EM_EXLINEFROMCHAR возвращает индекс не той строки, на которой находится каретка, а индекс следующей строки. Из-за этого невозможно понять, находится ли каретка в конце первой части перенесенной строки, или же в начале второй части перенесенной строки.

Posted: Thu Nov 20, 2008 9:19 am
by VladSh
DV
Интересно, по какому алгоритму работает подсветка текущей строки... Она работает правильно, т.е. выход по идее есть. Но это только Instructor может подсказать :)

Posted: Mon Aug 31, 2009 9:22 am
by VladSh
Видимо всё же в алгоритмах ошибки.

Если отключить AltSmartEnd (SmartEnd включён) и установить курсор в предложение, оканчивающееся на этой же строке, то курсор бегает правильно!

Если при этих же условиях установить курсор в предложение, оканчивающееся на следующей строке, то при первом нажатии End курсор устанавливается в конец этой же строки (это правильно! т.е. сделать, чтобы работало правильно, возможно!), при втором нажатии от соскакивает в начало следующей строки!
Это ошибка, но можно было бы реализовать довольно-таки бомбезную штуку - при втором нажатии End устанавливать курсор в конец всего предложения :!: 8) Даже если оно занимает несколько строк! Мечта о такой функции есть уже давно :!: :D

Если же включить AltSmartEnd, установить курсор в предложение, оканчивающееся на следующей строке, то при нажатии End курсор сразу соскакивает в начало следующей строки!

Если подправите, буду очень признателен, т.к. мучаюсь с соскоком курсора, вот уже год, постоянно... :cry:

Posted: Tue Sep 01, 2009 7:43 am
by DV
Вышеописанное - это частные (локальные) проявления упомянутого поведения EM_EXLINEFROMCHAR:
для позиции каретки в конце строки, чьё продолжение перенесено на другую строку, EM_EXLINEFROMCHAR возвращает индекс не той строки, на которой находится каретка, а индекс следующей строки. Из-за этого невозможно понять, находится ли каретка в конце первой части перенесенной строки, или же в начале второй части перенесенной строки.
Установка позиции курсора при нажатии на клавишу End описывается функцией OnEditEndKeyDown в файле "NoSelEOL.c". Можете попробовать поиграться с кодом выше строки

Code: Select all

SendMessage( hEdit, EM_EXSETSEL, 0, (LPARAM) &cr );
Для сборки dll можно использовать Dev-C++ или Visual C++ Express.

Posted: Tue Sep 01, 2009 8:52 am
by VladSh
Не, я не настолько крут)) таким никогда не занимался :)

А можно ли как-то анализировать, что если не конец предложения, а соскок курсора вниз (номера строк до нажатия End и после - не совпадают), то насильно возвращать курсор на одну позицию назад?

Posted: Tue Sep 01, 2009 4:14 pm
by DV
VladSh wrote:(номера строк до нажатия End и после - не совпадают), то насильно возвращать курсор на одну позицию назад?
Так должно получиться. Но каретка будет позиционирована не в конце строки, а за один пробел или таб перед концом строки. И придётся ещё колбасить дополнительное условие для такой позиции каретки: "если мы за один пробел или таб до конца текущей строки и если следующая позиция перенесет нас на следующую строку, то по нажатию Енд прыгнуть на последний непробельный символ, иначе прыгнуть в конец строки".

Posted: Tue Sep 01, 2009 5:41 pm
by VladSh
Пожалуйста! Я Вас умоляю!!! :oops: :lol:

Upd: Может это из-за наложения алгоритмов происходит? Может удалить вообще SmartEnd (всё равно никто им не пользуется), а оставить только AltSmartEnd?

Posted: Wed Sep 02, 2009 9:39 am
by DV
М-да, ну что я могу сказать... Как "костыли" ни приделывай - всё равно криво получается. Пусть у нас есть перенесённая (из-за WordWrap) строка вида

abc__
defghi


где символы подчёркивания означают пробелы.
Ситуации вида

a|bc__
defghi


или

abc_|_
defghi


обрабатываются корректно - каретка устанавливается в конец первой части строки:

abc__|
defghi


И вот в последней ситуации начинается маразм: если трактовать позицию кусора в конце первой части строки как относящуюся к первой части строки, то случай

abc__
|defghi


считается идентичным приведенному выше - то есть курсор в начале второй части строки по нажатию End прыгнет в конец предыдущей части строки. То есть сюда:

abc|__
defghi


Если же считать, что

abc__|
defghi


относится к началу второй части строки, тогда по нажатию End курсор прыгнет в конец второй части строки:

abc__
defghi|


Короче, в обеих ситуациях поведение неправильное - и я не могу сказать, какое лучше.