Как я могу отслеживать свертывание кода в редакторе кода?

Я пишу плагин, который помечает определенные строки, и буду пытаться закрасить маркер выделения для определенных линий поверх редактора кода. Для этого мне нужно рассчитать положение на экране конкретных строк кода, то есть строк в буфере.

Редактор кода Delphi имеет некоторый доступ к тем, какие строки видны на экране через IOTAEditView"s BottomRow а также TopRow свойства. Однако в более новых версиях IDE области кода и методы могут быть свернуты, то есть несколько строк свернуты в одну. Первый шаг для рисования выделенных линий - это узнать, какие линии видны и где они расположены, и для этого мне может понадобиться отслеживать, какие части редактора сложены, а какие нет. Кажется, существуют методы OTAPI для вызова свертывания кода (elision), но не для того, чтобы знать, когда это происходит.

Однако некоторые плагины, такие как Castalia, справляются с этим. Как это можно сделать?

1 ответ

Решение

Элемент управления редактора IDE имеет метод, IsLineElided, Elision[*] - это внутренний термин IDE для скрытой линии, когда она является частью свернутой области, метода или другой структуры. В пользовательском интерфейсе это называется "сворачивание", как в "свертывании кода", но для внутреннего термина довольно часто что-то отличается от термина пользовательского интерфейса, представляемого пользователю.

Этот метод не является общедоступным; это метод внутреннего класса TEditControl. Чтобы использовать его, вам нужно вызвать метод IDE. В отличие от многих хаков IDE, вам не нужно подключать его, так как вам не нужно менять его поведение - просто вызовите его.

  • Искалеченное имя: @Editorcontrol@TCustomEditControl@LineIsElided$qqri
  • с методом-прототипом: TLineIsElidedProc = function(Self: TObject; LineNum: Integer): Boolean;
  • находится в файле coreide*.bpl.

Например,

PFLineIsElided := GetProcAddress(CoreIDEHandle, StrIDELineIsElidedName);

Вы можете получить дескриптор ядра IDE BPL, читая загруженные модули. Первым параметром должно быть окно редактора - не представление редактирования ToolsAPI, а внутренний редактор. В этой статье показана связь между элементом управления редактора и IOTAEditView.

Теперь вы можете спросить, удалена ли строка (то есть скрыта ли она?) Из вашего плагина следующим образом:

if PFLineIsElided(FCodeEditor, 123) then ...

Однако для того, чтобы увидеть, какие области согнуты, или, точнее, поскольку верхняя линия любой согнутой области все еще нарисована, нахождение линии, после которой удаляется одна или несколько линий, - требуется немного больше логики. Лучший способ - перебирать строки на экране в представлении, IOTAEditView.TopRow а также BottomRow, Если линия после той, на которую вы смотрите, согнута, а та, на которую вы смотрите, нет, то на которую вы смотрите, это репрезентативная линия для согнутой области (линия, которая имеет +/- символ в канаве.)

Обратите внимание, что если вы рисуете в редакторе кода, разница между номерами логических строк (номера строк, напечатанные в водосточном коде) и номинальными номерами строк (строки, видимые на экране в представлении) будут важны для вас, и контроль кода - это то, что контролирует этот. Когда код свернут, логические и номинальные номера строк не будут совпадать: представление редактирования всегда рисует номинальные номера строк по порядку, но если в середине есть сложенная область, номера логических строк будут иметь пробелы.

Дальнейшее чтение: большая статья об интеграции с редактором кода, в одном разделе которой обсуждается свертывание кода и обработка номеров строк. Это одна из двух тем, посвященных интеграции плагинов / мастеров Delphi с редактором кода в блоге Parnassus. Хотя он охватывает гораздо больше, чем свернутый код, если вы пишете плагин IDE, который должен обрабатывать подобные вещи, там есть много полезного материала. (Отказ от ответственности: мой блог.)

[*] Кроме того, elision - это авто-антоним: слово, имеющее два противоположных значения (общий пример - "расщепление"). Одно из значений elision - пропуск или удаление, а другое - объединение или слияние.

Другие вопросы по тегам