перемещение строк вверх-вниз с учетом синтаксиса

Post Reply
dimon40001
Posts: 41
Joined: 05.05.2022 18:52

перемещение строк вверх-вниз с учетом синтаксиса

Post by dimon40001 »

Добрый день,
давно не был на этом форуме. Приятно, что продукт развивается!

Возник такой вопрос:

как сделать перемещение строк вверх-вниз (по умолчанию это делают клавиши Alt-Up, Alt-Down) с учетом синтаксиса языка (вообще или Python / или любой другой основанной на отступах разметки).

Примерно, как это делают продукты IntelliJ.
В каком направлении копать? Подозреваю, что TreeHelper и плагины подсветки синтаксиса здесь вряд ли помогут.

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

Во вложении сделал анимированный gif-файл демонстрирующий желаемое поведение. Каждый кадр - это нажатие Alt-Up. Кнопка табуляции не должна быть задействована.

Первая поверхностная идея - при вызове команды перемещения вызывается какой-то пост-процессор, который, знает номер нового положения строки. На основе этого номера вычисляет глубину блока, и соответствующим образом обрезает или добавляет отступ в начало вставляемой строки.
Attachments
cuda-text-move-lines.gif
main Alexey
Posts: 2807
Joined: 25.08.2021 18:15

Re: перемещение строк вверх-вниз с учетом синтаксиса

Post by main Alexey »

конечно же тут нужен плагин, т.к. делать такой замороченный и хрупкий код я не решусь. да и он может сбоить на каких-то отдельных лексерах. не очень трудозатратно сделать. плагин должен прочитать или весь файл или ближайшие строки (выше/ниже) и определить отступы. и применить их после движения строки. а можно поддержать и выделение в Н строк.

заменить 2 старые команды этот плаг не сможет. плаг должен дать 2 новые команды. а юзер уже может назначить хоткеи на новые команды.

если лексер без отступов то плаг может вызывать через ed.cmd() старые кмд из cudatext_cmd.py:
cCommand_MoveSelectionUp
cCommand_MoveSelectionDown
main Alexey
Posts: 2807
Joined: 25.08.2021 18:15

Re: перемещение строк вверх-вниз с учетом синтаксиса

Post by main Alexey »

чтобы узнать "поддерживает ли лексер ident-folding" надо вызывать lexer_proc(LEXER_GET_PROP, lexname) и смотреть ключ 'kinds'.
для Питона будет:
'kinds': ['Unknown', 'Comment', '^Id', 'Symbol', '^String', '^Number', 'Number2', '^Comment', '^Symbol', 'Usual :', '^Id keyword', '^Id tree', 'Ending :', 'Id func name', 'Id after .', '^Id=', '^Decor', '^Id tree class']

так как есть хоть одна строка начинающаяся с '^', то это indent based folding.
приписал этот факт в Вики в топик lexer_proc.
dimon40001
Posts: 41
Joined: 05.05.2022 18:52

Re: перемещение строк вверх-вниз с учетом синтаксиса

Post by dimon40001 »

Спасибо! Попробую что-то сделать.
Если выделено несколько строк, и они разного уровня вложенности, то надо подумать, действительно, какое поведение должно быть в таком случае.
Post Reply