Дублирование строки

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Дублирование строки

Post by John Doe »

Latest post of the previous page:

Так это баг в фаре.

Code: Select all

Editor.InsStr(nil,Editor.Lines)
В моём представлении эта команда должна вставлять перенос строки, однако в режиме отображения пробельных символов видно что этого не происходит.
ccaid
Posts: 908
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 24 times
Been thanked: 6 times

Дублирование строки

Post by ccaid »

эта функция должна вставлять строку. согласно фиче фара строка редактора может и не иметь символов перевода (это используется в EditWrap). поэтому бага нет. но можно, как я уже писал, захотеть виш по расширению функционала.
Фар делают добрые люди
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Дублирование строки

Post by John Doe »

ccaid wrote: согласно фиче фара
У фара может фича и есть (не пользуюсь, но и ломать не предлагаю).
Но при чём тут макро апи?
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Дублирование строки

Post by Shmuel »

ccaid wrote: эта функция должна вставлять строку. согласно фиче фара строка редактора может и не иметь символов перевода (это используется в EditWrap). поэтому бага нет.
Ситуация, когда редактор работает по-разному с файлом до и после сохранения-переоткрытия и отображает разную информацию о количестве строк, не является нормальной. По моему скромному разумению, это как раз то, что принято называть баг.
ccaid
Posts: 908
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 24 times
Been thanked: 6 times

Дублирование строки

Post by ccaid »

Это можно трактовать как баг в макросе. «Компьютер делает то, что вы ему сказали, а не то, что вы хотели бы, чтобы он сделал.»
Фар делают добрые люди
ccaid
Posts: 908
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 24 times
Been thanked: 6 times

Дублирование строки

Post by ccaid »

продолжение истории. плагиновое апи не оказалось панацеей.
создаем файл, в нем вводим одну строку, да и ту без перевода строки, сохраняем, выходим, открываем файл, вызываем макрос – строка дублировалась, но без перевода строки.
вот эта ситуация ближе к сказанному.
Фар делают добрые люди
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Дублирование строки

Post by John Doe »

Действительно, в этой ситуации макрос работает неверно.
Интересно что проблема возникает только если открыть существующий файл, а во вновь созданном всё в порядке.
И проявляется только с первой строкой.
ladserg
Posts: 234
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 5 times
Been thanked: 6 times

Дублирование строки

Post by ladserg »

А вариант с использованием InsertText вместо SetString чем плох?
ccaid
Posts: 908
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 24 times
Been thanked: 6 times

Дублирование строки

Post by ccaid »

ladserg, да у этого варианта проблемы нет.

но интенсивное тестирование различных вариантов макроса дает результаты: обнаружено, что после дублирования строки и отмены теряется позиция курсора в строке. видимо что-то случилось с editor.UndoRedo (или всегда так было). это относится к обоим макросам на плагинном апи.
Фар делают добрые люди
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Дублирование строки

Post by John Doe »

ccaid wrote: (или всегда так было)
Вероятнее всего, т.к. нигде не сказано, что позиция должна восстанавливаться.
Я это могу и без макросов воспроизвести.
ladserg
Posts: 234
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 5 times
Been thanked: 6 times

Дублирование строки

Post by ladserg »

ccaid wrote:но интенсивное тестирование различных вариантов макроса дает результаты: обнаружено, что после дублирования строки и отмены теряется позиция курсора в строке. видимо что-то случилось с editor.UndoRedo (или всегда так было). это относится к обоим макросам на плагинном апи.
Хм, действительно теряется позиция при отмене действия. У ряда операций, кста, такая же ситуция. Например удаление строки комбинацией Ctrl+Y .

А по лоигке своей механизм UndoRedo должен поддерживать возврат позиции при отмене операций со строками?.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Дублирование строки

Post by John Doe »

ladserg wrote: А по лоигке своей механизм UndoRedo должен поддерживать возврат позиции при отмене операций со строками?.
В вашем макросе до операций со строками есть editor.SetPosition.
Вы считаете, что установка позиции тоже должна попадать в Undo?
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Дублирование строки

Post by John Doe »

В общем, это недостаток апи, ведь в функциях редактора не предусмотрена работа с произвольной позицией, а только с текущей.
Как минимум можно пожелать чтобы при EUR_BEGIN запоминалась текущая позиция (или завести для этого отдельную команду).

А пока можно извратиться, и переписать макрос как-то так:

Code: Select all

Macro {
  description="Duplicate current line";
  area="Editor"; key="CtrlD";
  action=function()
    local ei = editor.GetInfo()
    local id = ei.EditorID
    local str = editor.GetString(id, 0, 3)
    editor.UndoRedo(id,"EUR_BEGIN")
    Keys"Space BS End" -- trick needed to restore pos after undo
    editor.InsertString(id)
    editor.InsertText(id,str)
    editor.SetPosition(id,{CurPos=ei.CurPos})
    editor.UndoRedo(id,"EUR_END")
  end;
}
ladserg
Posts: 234
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 5 times
Been thanked: 6 times

Дублирование строки

Post by ladserg »

John Doe wrote:Вы считаете, что установка позиции тоже должна попадать в Undo?
Именно этот вопрос я и задал ccaid:-)
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Дублирование строки

Post by John Doe »

Вовсе нет, и ответы на них отличаются.
Да, при отмене операций редактирования позиция курсора должна возвращаться.
Нет, само по себе позиционирование курсора не меняет текст, и в буфер отмены попадать не должно.
Sikambr
Posts: 18
Joined: Fri 11 Apr, 2014 11:04

Дублирование строки

Post by Sikambr »

Подскажите, как решить такую проблему.
В настройках редактора стоит "Преобразовывать новые символы табуляции в пробелы".
Как продублировать строку, чтобы сохранилась табуляция, имеющаяся в строке?
С такой настройкой она преобразовывается в пробелы.
Post Reply

Return to “Обсуждение макросов”