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

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

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

Post by John Doe » Mon 13 Jul, 2015 14:00

Latest post of the previous page:

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

Code: Select all

Editor.InsStr(nil,Editor.Lines)
В моём представлении эта команда должна вставлять перенос строки, однако в режиме отображения пробельных символов видно что этого не происходит.

ccaid
Posts: 844
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 17 times
Been thanked: 5 times

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

Post by ccaid » Mon 13 Jul, 2015 15:15

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

User avatar
John Doe
Бюрократ
Posts: 12208
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Mon 13 Jul, 2015 15:20

ccaid wrote: согласно фиче фара
У фара может фича и есть (не пользуюсь, но и ломать не предлагаю).
Но при чём тут макро апи?

Shmuel
Posts: 5713
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 201 times

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

Post by Shmuel » Mon 13 Jul, 2015 15:58

ccaid wrote: эта функция должна вставлять строку. согласно фиче фара строка редактора может и не иметь символов перевода (это используется в EditWrap). поэтому бага нет.
Ситуация, когда редактор работает по-разному с файлом до и после сохранения-переоткрытия и отображает разную информацию о количестве строк, не является нормальной. По моему скромному разумению, это как раз то, что принято называть баг.

ccaid
Posts: 844
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 17 times
Been thanked: 5 times

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

Post by ccaid » Mon 13 Jul, 2015 17:48

Это можно трактовать как баг в макросе. «Компьютер делает то, что вы ему сказали, а не то, что вы хотели бы, чтобы он сделал.»
Фар делают добрые люди

ccaid
Posts: 844
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 17 times
Been thanked: 5 times

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

Post by ccaid » Tue 21 Jul, 2015 09:35

продолжение истории. плагиновое апи не оказалось панацеей.
создаем файл, в нем вводим одну строку, да и ту без перевода строки, сохраняем, выходим, открываем файл, вызываем макрос – строка дублировалась, но без перевода строки.
вот эта ситуация ближе к сказанному.
Фар делают добрые люди

User avatar
John Doe
Бюрократ
Posts: 12208
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Tue 21 Jul, 2015 10:30

Действительно, в этой ситуации макрос работает неверно.
Интересно что проблема возникает только если открыть существующий файл, а во вновь созданном всё в порядке.
И проявляется только с первой строкой.

ladserg
Posts: 215
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 1 time
Been thanked: 1 time

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

Post by ladserg » Tue 21 Jul, 2015 11:41

А вариант с использованием InsertText вместо SetString чем плох?

ccaid
Posts: 844
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 17 times
Been thanked: 5 times

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

Post by ccaid » Tue 21 Jul, 2015 13:39

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

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

User avatar
John Doe
Бюрократ
Posts: 12208
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Tue 21 Jul, 2015 13:47

ccaid wrote: (или всегда так было)
Вероятнее всего, т.к. нигде не сказано, что позиция должна восстанавливаться.
Я это могу и без макросов воспроизвести.

ladserg
Posts: 215
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 1 time
Been thanked: 1 time

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

Post by ladserg » Tue 21 Jul, 2015 13:57

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

А по лоигке своей механизм UndoRedo должен поддерживать возврат позиции при отмене операций со строками?.

User avatar
John Doe
Бюрократ
Posts: 12208
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Tue 21 Jul, 2015 14:17

ladserg wrote: А по лоигке своей механизм UndoRedo должен поддерживать возврат позиции при отмене операций со строками?.
В вашем макросе до операций со строками есть editor.SetPosition.
Вы считаете, что установка позиции тоже должна попадать в Undo?

User avatar
John Doe
Бюрократ
Posts: 12208
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Tue 21 Jul, 2015 15:07

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

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

Code: Select all

Macro {
  description="Duplicate current line";
  area="Editor"; key="CtrlD";
  action=function()
    local Info = editor.GetInfo()
    local Line = editor.GetString(Info.EditorID, 0, 2)
    local str1,str2 = Line:sub(1,Info.CurPos-1),Line:sub(Info.CurPos,-1)
    editor.UndoRedo(nil,"EUR_BEGIN")
    editor.InsertText(Info.EditorID,str2)
    editor.InsertString(Info.EditorID)
    editor.InsertText(Info.EditorID,str1)
    editor.UndoRedo(nil,"EUR_END")
  end;
}

ladserg
Posts: 215
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 1 time
Been thanked: 1 time

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

Post by ladserg » Tue 21 Jul, 2015 15:25

John Doe wrote:Вы считаете, что установка позиции тоже должна попадать в Undo?
Именно этот вопрос я и задал ccaid:-)

User avatar
John Doe
Бюрократ
Posts: 12208
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

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

Post by John Doe » Tue 21 Jul, 2015 15:30

Вовсе нет, и ответы на них отличаются.
Да, при отмене операций редактирования позиция курсора должна возвращаться.
Нет, само по себе позиционирование курсора не меняет текст, и в буфер отмены попадать не должно.

Sikambr
Posts: 16
Joined: Fri 11 Apr, 2014 11:04

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

Post by Sikambr » Fri 08 Feb, 2019 11:43

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

Shmuel
Posts: 5713
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 201 times

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

Post by Shmuel » Fri 08 Feb, 2019 11:52


Post Reply

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