NoSelEOL plugin

Discuss and announce AkelPad plugins
  • Author
  • Message
DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

v.1.2 (April 2008)
+ new function: altSmartEnd

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

Post by VladSh »

Сила! Теперь даже нечего попросить :D

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

v.1.3
Changed: AkelPad 3.6.0 required.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

v.1.4
* compatibility with column selection in AkelPad 4.0.1+

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

Post by VladSh »

DV
Емеет ли смысл теперь NoSelEOL::Main, ведь выделение с новым контролом и так не захватывает символ перевода строки/конца файла?

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

захватывает после дбл-кликов, выделяющих всю строку, а также по клику перед началом строки.

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

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

Post by VladSh »

Если предложение переходит на другую строку, то если установить курсор в строку, где находится начало предложения, при нажатии клавиши End курсор переходит не на последний символ этой же строки, а на первый символ следующей строки. :shock: А изредка бывает так, что курсор переходит на просто на следующую строку, а на след. строку в самый конец предложения!

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

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

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

Post by VladSh »

DV
Интересно, по какому алгоритму работает подсветка текущей строки... Она работает правильно, т.е. выход по идее есть. Но это только Instructor может подсказать :)

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

Post by VladSh »

Видимо всё же в алгоритмах ошибки.

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

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

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

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

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post 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.

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

Post by VladSh »

Не, я не настолько крут)) таким никогда не занимался :)

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

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

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

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

Post by VladSh »

Пожалуйста! Я Вас умоляю!!! :oops: :lol:

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

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

М-да, ну что я могу сказать... Как "костыли" ни приделывай - всё равно криво получается. Пусть у нас есть перенесённая (из-за WordWrap) строка вида

abc__
defghi


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

a|bc__
defghi


или

abc_|_
defghi


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

abc__|
defghi


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

abc__
|defghi


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

abc|__
defghi


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

abc__|
defghi


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

abc__
defghi|


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