Page 1 of 4
BlockIndent — Смещение блока
Posted: Fri 08 Feb, 2013 23:21
by t-rex
Переписал тут свой любимый плагин
BlockIndent на луа, чтоб больше никогда не заниматься компиляцией.
Code: Select all
- Смещение вправо или влево выделенного блока или текущей строки на пробел
или знак табуляции.
- Каждая строка смещается относительно своей позиции, не зависимо от других
строк.
- Tab-смещение на подобии Borland Turbo IDE, текст смещается к ближайшей
Tab-позиции а не просто на размер табуляции.
- Корректно работает для различных настроек редактора относительно табуляции
(вставляются реальные символы табуляции).
Скачать:
https://github.com/trexinc/evil-program ... Indent.lua
На плагринге:
http://plugring.farmanager.com/plugin.php?pid=382&l=ru
Примечание модератора
Альтернативный перевод в Lua от Shmuel: http://forum.farmanager.com/viewtopic.php?f=60&t=7853
Re: Решил тут я на луа пописать...
Posted: Fri 08 Feb, 2013 23:26
by t-rex
Тока вот одно не пойму - editor.RealToTab() получает и возвращает 0 или 1 бэйс индексы?
Code: Select all
local Indent = function (IndentByTabSize, Forward)
local ei = editor.GetInfo(nil);
local IndentSize = IndentByTabSize and ei.TabSize or 1
local IndentStr = IndentByTabSize and "\t" or " "
local line = ei.CurLine;
local loop = false;
if ei.BlockType ~= "BTYPE_NONE" then
local s = editor.GetString()
if s.SelStart ~= -1 then
loop = true;
line = ei.BlockStartLine;
end
end
editor.UndoRedo(nil, "EUR_BEGIN")
repeat
editor.SetPosition(nil, line, 0, -1, -1, 0, ei.Overtype)
local s = editor.GetString(nil, -1, 1)
if not s or (loop and ((s.SelStart == -1) or (s.SelStart == s.SelEnd))) then
break
end
local j = 1
while (string.sub(s.StringText, j, j)=="\t" or string.sub(s.StringText, j, j)==" ") and (j <= s.StringLength) do
j = j + 1
end
if (j>1 or Forward) and (j <= s.StringLength) then
local TabPos = editor.RealToTab(nil, -1, j) - 1
local x = math.floor(TabPos/IndentSize)
if ((TabPos%IndentSize) == 0) and not Forward then
x = x - 1
end
x = Forward and x + 1 or x
editor.SetString(nil, -1, string.sub(s.StringText, j), s.StringEOL)
if x then for i=0,x-1,1 do editor.InsertText(nil,IndentStr) end end
end
line = line + 1
until not loop
editor.SetPosition(nil, ei.CurLine, ei.CurPos, -1, ei.TopScreenLine, ei.LeftPos, ei.Overtype)
editor.UndoRedo(nil, "EUR_END")
end
Macro {
area="Editor"; key="ShiftTab"; flags="DisableOutput"; description="Indent right by tab size"; action = function()
Indent(true, true)
end;
}
Macro {
area="Editor"; key="ShiftBS"; flags="DisableOutput"; description="Indent left by tab size"; action = function()
Indent(true, false)
end;
}
И ещё вопрос, если поменять:
Code: Select all
editor.SetPosition(nil, line, 0, -1, -1, 0, ei.Overtype)
local s = editor.GetString(nil, -1, 0)
на
Code: Select all
local s = editor.GetString(nil, line, 1)
То editor.InsertText() будет вставлять текст не в начале строки а "где попало".
Т.е. логично бы было чтоб fast режим editor.GetString() выставлял бы и CurPos в 0.
Re: Решил тут я на луа пописать...
Posted: Fri 08 Feb, 2013 23:38
by Shmuel
t-rex wrote:Переписал тут свой любимый плагин BlockIndent на луа, чтоб больше никогда не заниматься компиляцией.
Тока вот одно не пойму - editor.RealToTab() получает и возвращает 0 или 1 бэйс индексы?
Base 0. (Если документация неясна, смотри source).
Я уже этот плагин переписал на Lua года полтора назад (из спортивного интереса).
t-rex wrote:логично бы было чтоб fast режим editor.GetString() выставлял бы и CurPos в 0.
Может и логично, но изменение позиции в режиме fast является побочным эффектом, который не предполагалось использовать.
Re: Решил тут я на луа пописать...
Posted: Fri 08 Feb, 2013 23:44
by t-rex
Shmuel wrote:t-rex wrote:Переписал тут свой любимый плагин BlockIndent на луа, чтоб больше никогда не заниматься компиляцией.
Тока вот одно не пойму - editor.RealToTab() получает и возвращает 0 или 1 бэйс индексы?
Base 0. (Если документация неясна, смотри source).
Я уже этот плагин переписал на Lua года полтора назад (из спортивного интереса).
Для всех элементов написано, а для SrcPos и return не написано, надо бы обновить доки.
В сорцы лазить мне пока не хочется.
Shmuel wrote:t-rex wrote:логично бы было чтоб fast режим editor.GetString() выставлял бы и CurPos в 0.
Может и логично, но изменение позиции в режиме fast является побочным эффектом, который не предполагалось использовать.
но побочный эффект есть, и задокументирован, почему бы не сделать его ещё предсказуемым и логичным?
Ещё вопрос, в луа как то модно индексировать строку - т.е. типа s[1] или тока sub?
Re: Решил тут я на луа пописать...
Posted: Fri 08 Feb, 2013 23:46
by Shmuel
Code: Select all
-- это ошибка
if ei.BlockType ~= "BTYPE_NONE" then
-- должно быть так:
local F=far.Flags
......
if ei.BlockType ~= F.BTYPE_NONE then
Ещё вопрос, в луа как то модно индексировать строку - т.е. типа s[1] или тока sub?
Если нужна подстрока, то sub.
Ты даже не интересуешься моей реализацией?
Re: Решил тут я на луа пописать...
Posted: Fri 08 Feb, 2013 23:52
by t-rex
1. Спасибо.
2. Нужен один символ.
3. Показывай
Re: Решил тут я на луа пописать...
Posted: Fri 08 Feb, 2013 23:57
by t-rex
И почему незя как то так far.Flags["BTYPE_NONE"] ?
Re: Решил тут я на луа пописать...
Posted: Fri 08 Feb, 2013 23:58
by Shmuel
t-rex wrote:2. Нужен один символ.
3. Показывай
2. str:sub(i,i)
3. Сейчас в личку пошлю.
И почему незя как то так far.Flags["BTYPE_NONE"] ?
Можно. Но некрасиво (на мой вкус).
Re: Решил тут я на луа пописать...
Posted: Sat 09 Feb, 2013 00:07
by t-rex
А это, чего ты тогда челу тут
http://forum.farmanager.com/viewtopic.p ... 18#p103518 дал код:
Code: Select all
editor.SetParam(nil, "ESPT_TABSIZE", 3)
а нe far.Flags.ESPT_TABSIZE?
Re: Решил тут я на луа пописать...
Posted: Sat 09 Feb, 2013 00:13
by Shmuel
Следует различать, когда мы получаем флаги от LuaFAR'а и когда передаём ему.
Получаем как правило в исходном формате, т.е. число.
Передаём в любом из нескольких форматов (в каком захотим), это описано в доках луафара.
Re: Решил тут я на луа пописать...
Posted: Sat 09 Feb, 2013 00:25
by t-rex
Вот финальная версия. key="None" это правильно? Где то в доках что то такое проскакивало но не могу найти, надо None или NoKey или KeyNone?
Code: Select all
local Indent = function (IndentByTabSize, Forward)
local F = far.Flags
local ei = editor.GetInfo(nil);
local IndentSize = IndentByTabSize and ei.TabSize or 1
local IndentStr = IndentByTabSize and "\t" or " "
local line = ei.CurLine;
local loop = false
if ei.BlockType ~= F.BTYPE_NONE then
local s = editor.GetString()
if s.SelStart ~= -1 then
loop = true;
line = ei.BlockStartLine;
end
end
editor.UndoRedo(nil, F.EUR_BEGIN)
repeat
editor.SetPosition(nil, line, 0, -1, -1, 0, ei.Overtype)
local s = editor.GetString(nil, -1, 0)
if not s or (loop and ((s.SelStart == -1) or (s.SelStart == s.SelEnd))) then
break
end
local j = s.StringText:find("[^ \t]")
if j and (j>1 or Forward) then
local TabPos = editor.RealToTab(nil, -1, j) - 1
local x = math.floor(TabPos/IndentSize)
if ((TabPos%IndentSize) == 0) and not Forward then
x = x - 1
end
x = Forward and x + 1 or x
editor.SetString(nil, -1, s.StringText:sub(j), s.StringEOL)
for i=1,x,1 do editor.InsertText(nil,IndentStr) end
end
line = line + 1
until not loop
editor.SetPosition(nil, ei.CurLine, ei.CurPos, -1, ei.TopScreenLine, ei.LeftPos, ei.Overtype)
editor.UndoRedo(nil, F.EUR_END)
end
Macro {
area="Editor"; key="ShiftTab"; flags="DisableOutput"; description="Indent right by tab size"; action = function()
Indent(true, true)
end;
}
Macro {
area="Editor"; key="ShiftBS"; flags="DisableOutput"; description="Indent left by tab size"; action = function()
Indent(true, false)
end;
}
Macro {
area="Editor"; key="None"; flags="DisableOutput"; description="Indent right by space"; action = function()
Indent(false, true)
end;
}
Macro {
area="Editor"; key="None"; flags="DisableOutput"; description="Indent left by space"; action = function()
Indent(false, false)
end;
}
Re: Решил тут я на луа пописать...
Posted: Sat 09 Feb, 2013 00:33
by Shmuel
А что делает этот None, я что-то не врубаюсь?
Re: Решил тут я на луа пописать...
Posted: Sat 09 Feb, 2013 00:36
by t-rex
Ну как сделать макрос чтоб был в файле но его незя было вызвать пока руками не назначить кнопку (вот как там у меня два нижних макроса которые мне лично не нужны но кому то могут понадобиться)?
Но key="None" в общем своё дело делает, даже если не намерено.
Re: Решил тут я на луа пописать...
Posted: Sat 09 Feb, 2013 00:38
by Shmuel
А, теперь понятно. Надо вместо Macro {...} писать NoMacro {...}.
Re: Решил тут я на луа пописать...
Posted: Sat 09 Feb, 2013 10:01
by Denis
Попробовал макрос - при значительном перемещении блока влево/вправо сползает выделение.
Настройки редактора:
Code: Select all
╔═════════════════════════════ Editor ══════════════════════════════╗
║ Expand tabs: ║
║ Expand newly entered tabs to spaces ↓║
║ [ ] Persistent blocks [x] Cursor beyond end of line ║
║ [x] Del removes blocks [x] Save file position ║
║ [x] Auto indent [x] Save bookmarks ║
║ 2 Tab size [x] Pick up the word ║
║ [ ] Show white space [x] Select found ║
║ [x] Show scrollbar [ ] Cursor at end ║
╟───────────────────────────────────────────────────────────────────╢
║ { OK } [ Cancel ] ║
╚═══════════════════════════════════════════════════════════════════╝