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

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

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

Post by John Doe »

Latest post of the previous page:

Я ничего не хочу, но по этой команде последняя строка честно дублируется, создавая новую.
ccaid
Posts: 869
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 19 times
Been thanked: 5 times

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

Post by ccaid »

John Doe, а если сохранить файл, выйти и открыть заново?
а еще можно включить отображение пробельных символов.
Фар делают добрые люди
User avatar
John Doe
Бюрократ
Posts: 13061
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 41 times
Been thanked: 319 times

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

Post by John Doe »

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

Code: Select all

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

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

Post by ccaid »

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

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

Post by John Doe »

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

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

Post by Shmuel »

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

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

Post by ccaid »

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

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

Post by ccaid »

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

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

Post by John Doe »

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

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

Post by ladserg »

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

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

Post by ccaid »

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

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

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

Post by John Doe »

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

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

Post by ladserg »

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

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

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

Post by John Doe »

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

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

Post by John Doe »

В общем, это недостаток апи, ведь в функциях редактора не предусмотрена работа с произвольной позицией, а только с текущей.
Как минимум можно пожелать чтобы при 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: 229
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 5 times
Been thanked: 3 times

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

Post by ladserg »

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

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