BlockIndent — Смещение блока

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

BlockIndent — Смещение блока

Post 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
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Решил тут я на луа пописать...

Post 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.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Решил тут я на луа пописать...

Post by Shmuel »

t-rex wrote:Переписал тут свой любимый плагин BlockIndent на луа, чтоб больше никогда не заниматься компиляцией.
Тока вот одно не пойму - editor.RealToTab() получает и возвращает 0 или 1 бэйс индексы?
Base 0. (Если документация неясна, смотри source).
Я уже этот плагин переписал на Lua года полтора назад (из спортивного интереса).
t-rex wrote:логично бы было чтоб fast режим editor.GetString() выставлял бы и CurPos в 0.
Может и логично, но изменение позиции в режиме fast является побочным эффектом, который не предполагалось использовать.
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Решил тут я на луа пописать...

Post 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?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Решил тут я на луа пописать...

Post 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.

Ты даже не интересуешься моей реализацией?
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Решил тут я на луа пописать...

Post by t-rex »

1. Спасибо.

2. Нужен один символ.

3. Показывай
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Решил тут я на луа пописать...

Post by t-rex »

И почему незя как то так far.Flags["BTYPE_NONE"] ?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Решил тут я на луа пописать...

Post by Shmuel »

t-rex wrote:2. Нужен один символ.

3. Показывай
2. str:sub(i,i)
3. Сейчас в личку пошлю.
И почему незя как то так far.Flags["BTYPE_NONE"] ?
Можно. Но некрасиво (на мой вкус).
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Решил тут я на луа пописать...

Post 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?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Решил тут я на луа пописать...

Post by Shmuel »

t-rex wrote:А это, чего ты тогда челу тут http://forum.farmanager.com/viewtopic.p ... 18#p103518 дал код:

Code: Select all

editor.SetParam(nil, "ESPT_TABSIZE", 3)
а нe far.Flags.ESPT_TABSIZE?
Следует различать, когда мы получаем флаги от LuaFAR'а и когда передаём ему.
Получаем как правило в исходном формате, т.е. число.
Передаём в любом из нескольких форматов (в каком захотим), это описано в доках луафара.
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Решил тут я на луа пописать...

Post 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;
}
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Решил тут я на луа пописать...

Post by Shmuel »

А что делает этот None, я что-то не врубаюсь?
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Решил тут я на луа пописать...

Post by t-rex »

Ну как сделать макрос чтоб был в файле но его незя было вызвать пока руками не назначить кнопку (вот как там у меня два нижних макроса которые мне лично не нужны но кому то могут понадобиться)?
Но key="None" в общем своё дело делает, даже если не намерено.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Решил тут я на луа пописать...

Post by Shmuel »

А, теперь понятно. Надо вместо Macro {...} писать NoMacro {...}.
Denis
Posts: 1444
Joined: Tue 05 Apr, 2005 18:12
Has thanked: 10 times
Been thanked: 5 times

Re: Решил тут я на луа пописать...

Post 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 ]                         ║
╚═══════════════════════════════════════════════════════════════════╝
Post Reply

Return to “Полезные макросы и скрипты”