NoSelEOL plugin
- Author
- Message
-
Offline
- Posts: 3217
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
-
Offline
- Posts: 3217
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
-
Offline
- Posts: 3217
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
Неприятный баг
Если предложение переходит на другую строку, то если установить курсор в строку, где находится начало предложения, при нажатии клавиши End курсор переходит не на последний символ этой же строки, а на первый символ следующей строки. А изредка бывает так, что курсор переходит на просто на следующую строку, а на след. строку в самый конец предложения!
-
Offline
- Posts: 1250
- Joined: Thu Nov 16, 2006 11:53 am
- Location: Kyiv, Ukraine
Да, в нём. Но я не вижу решения, поскольку:Instructor wrote:VladSh
Такого не наблюдаю. Может дело в NoSelEOL::SmartEnd?
1) так ведёт себя EM_EXSETSEL. Хотя это можно было бы обойти, оставив обработку по умолчанию для позиции в конце строки, если бы не
2) для позиции каретки в конце строки, чьё продолжение перенесено на другую строку, EM_EXLINEFROMCHAR возвращает индекс не той строки, на которой находится каретка, а индекс следующей строки. Из-за этого невозможно понять, находится ли каретка в конце первой части перенесенной строки, или же в начале второй части перенесенной строки.
-
Offline
- Posts: 3217
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
-
Offline
- Posts: 3217
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
Видимо всё же в алгоритмах ошибки.
Если отключить AltSmartEnd (SmartEnd включён) и установить курсор в предложение, оканчивающееся на этой же строке, то курсор бегает правильно!
Если при этих же условиях установить курсор в предложение, оканчивающееся на следующей строке, то при первом нажатии End курсор устанавливается в конец этой же строки (это правильно! т.е. сделать, чтобы работало правильно, возможно!), при втором нажатии от соскакивает в начало следующей строки!
Это ошибка, но можно было бы реализовать довольно-таки бомбезную штуку - при втором нажатии End устанавливать курсор в конец всего предложения Даже если оно занимает несколько строк! Мечта о такой функции есть уже давно
Если же включить AltSmartEnd, установить курсор в предложение, оканчивающееся на следующей строке, то при нажатии End курсор сразу соскакивает в начало следующей строки!
Если подправите, буду очень признателен, т.к. мучаюсь с соскоком курсора, вот уже год, постоянно...
Если отключить AltSmartEnd (SmartEnd включён) и установить курсор в предложение, оканчивающееся на этой же строке, то курсор бегает правильно!
Если при этих же условиях установить курсор в предложение, оканчивающееся на следующей строке, то при первом нажатии End курсор устанавливается в конец этой же строки (это правильно! т.е. сделать, чтобы работало правильно, возможно!), при втором нажатии от соскакивает в начало следующей строки!
Это ошибка, но можно было бы реализовать довольно-таки бомбезную штуку - при втором нажатии End устанавливать курсор в конец всего предложения Даже если оно занимает несколько строк! Мечта о такой функции есть уже давно
Если же включить AltSmartEnd, установить курсор в предложение, оканчивающееся на следующей строке, то при нажатии End курсор сразу соскакивает в начало следующей строки!
Если подправите, буду очень признателен, т.к. мучаюсь с соскоком курсора, вот уже год, постоянно...
-
Offline
- Posts: 1250
- Joined: Thu Nov 16, 2006 11:53 am
- Location: Kyiv, Ukraine
Вышеописанное - это частные (локальные) проявления упомянутого поведения EM_EXLINEFROMCHAR:
Для сборки dll можно использовать Dev-C++ или Visual C++ Express.
Установка позиции курсора при нажатии на клавишу End описывается функцией OnEditEndKeyDown в файле "NoSelEOL.c". Можете попробовать поиграться с кодом выше строкидля позиции каретки в конце строки, чьё продолжение перенесено на другую строку, EM_EXLINEFROMCHAR возвращает индекс не той строки, на которой находится каретка, а индекс следующей строки. Из-за этого невозможно понять, находится ли каретка в конце первой части перенесенной строки, или же в начале второй части перенесенной строки.
Code: Select all
SendMessage( hEdit, EM_EXSETSEL, 0, (LPARAM) &cr );
-
Offline
- Posts: 3217
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
-
Offline
- Posts: 1250
- Joined: Thu Nov 16, 2006 11:53 am
- Location: Kyiv, Ukraine
Так должно получиться. Но каретка будет позиционирована не в конце строки, а за один пробел или таб перед концом строки. И придётся ещё колбасить дополнительное условие для такой позиции каретки: "если мы за один пробел или таб до конца текущей строки и если следующая позиция перенесет нас на следующую строку, то по нажатию Енд прыгнуть на последний непробельный символ, иначе прыгнуть в конец строки".VladSh wrote:(номера строк до нажатия End и после - не совпадают), то насильно возвращать курсор на одну позицию назад?
-
Offline
- Posts: 3217
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
-
Offline
- Posts: 1250
- Joined: Thu Nov 16, 2006 11:53 am
- Location: Kyiv, Ukraine
М-да, ну что я могу сказать... Как "костыли" ни приделывай - всё равно криво получается. Пусть у нас есть перенесённая (из-за WordWrap) строка вида
abc__
defghi
где символы подчёркивания означают пробелы.
Ситуации вида
a|bc__
defghi
или
abc_|_
defghi
обрабатываются корректно - каретка устанавливается в конец первой части строки:
abc__|
defghi
И вот в последней ситуации начинается маразм: если трактовать позицию кусора в конце первой части строки как относящуюся к первой части строки, то случай
abc__
|defghi
считается идентичным приведенному выше - то есть курсор в начале второй части строки по нажатию End прыгнет в конец предыдущей части строки. То есть сюда:
abc|__
defghi
Если же считать, что
abc__|
defghi
относится к началу второй части строки, тогда по нажатию End курсор прыгнет в конец второй части строки:
abc__
defghi|
Короче, в обеих ситуациях поведение неправильное - и я не могу сказать, какое лучше.
abc__
defghi
где символы подчёркивания означают пробелы.
Ситуации вида
a|bc__
defghi
или
abc_|_
defghi
обрабатываются корректно - каретка устанавливается в конец первой части строки:
abc__|
defghi
И вот в последней ситуации начинается маразм: если трактовать позицию кусора в конце первой части строки как относящуюся к первой части строки, то случай
abc__
|defghi
считается идентичным приведенному выше - то есть курсор в начале второй части строки по нажатию End прыгнет в конец предыдущей части строки. То есть сюда:
abc|__
defghi
Если же считать, что
abc__|
defghi
относится к началу второй части строки, тогда по нажатию End курсор прыгнет в конец второй части строки:
abc__
defghi|
Короче, в обеих ситуациях поведение неправильное - и я не могу сказать, какое лучше.