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

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

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

Post by t-rex » Fri 08 Feb, 2013 23:21

Переписал тут свой любимый плагин BlockIndent на луа, чтоб больше никогда не заниматься компиляцией.

Code: Select all

  - Смещение вправо или влево выделенного блока или текущей  строки  на  пробел
    или знак табуляции.
  - Каждая строка смещается относительно своей позиции, не зависимо  от  других
    строк.
  - Tab-смещение на подобии Borland Turbo  IDE,  текст  смещается  к  ближайшей
    Tab-позиции а не просто на размер табуляции.
  - Корректно работает для различных настроек редактора относительно  табуляции
    (вставляются реальные символы табуляции).
Скачать: http://evil-programmers.googlecode.com/ ... 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: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

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

Post by t-rex » Fri 08 Feb, 2013 23:26

Тока вот одно не пойму - 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: 5041
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Fri 08 Feb, 2013 23:38

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: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

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

Post by t-rex » Fri 08 Feb, 2013 23:44

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: 5041
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Fri 08 Feb, 2013 23:46

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: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

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

Post by t-rex » Fri 08 Feb, 2013 23:52

1. Спасибо.

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

3. Показывай

User avatar
t-rex
Страшный и ужасный
Posts: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

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

Post by t-rex » Fri 08 Feb, 2013 23:57

И почему незя как то так far.Flags["BTYPE_NONE"] ?

Shmuel
Posts: 5041
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Fri 08 Feb, 2013 23:58

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

3. Показывай
2. str:sub(i,i)
3. Сейчас в личку пошлю.
И почему незя как то так far.Flags["BTYPE_NONE"] ?
Можно. Но некрасиво (на мой вкус).

User avatar
t-rex
Страшный и ужасный
Posts: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

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

Post by t-rex » Sat 09 Feb, 2013 00:07

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

Code: Select all

editor.SetParam(nil, "ESPT_TABSIZE", 3)
а нe far.Flags.ESPT_TABSIZE?

Shmuel
Posts: 5041
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Sat 09 Feb, 2013 00:13

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: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

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

Post by t-rex » Sat 09 Feb, 2013 00:25

Вот финальная версия. 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: 5041
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Sat 09 Feb, 2013 00:33

А что делает этот None, я что-то не врубаюсь?

User avatar
t-rex
Страшный и ужасный
Posts: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

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

Post by t-rex » Sat 09 Feb, 2013 00:36

Ну как сделать макрос чтоб был в файле но его незя было вызвать пока руками не назначить кнопку (вот как там у меня два нижних макроса которые мне лично не нужны но кому то могут понадобиться)?
Но key="None" в общем своё дело делает, даже если не намерено.

Shmuel
Posts: 5041
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Sat 09 Feb, 2013 00:38

А, теперь понятно. Надо вместо Macro {...} писать NoMacro {...}.

Denis
Posts: 1389
Joined: Tue 05 Apr, 2005 18:12
Has thanked: 2 times
Been thanked: 2 times

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

Post by Denis » Sat 09 Feb, 2013 10:01

Попробовал макрос - при значительном перемещении блока влево/вправо сползает выделение.

Настройки редактора:

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

User avatar
t-rex
Страшный и ужасный
Posts: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

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

Post by t-rex » Sat 09 Feb, 2013 10:18

Это by design ещё со времён плагина, на работу не влияет

Post Reply

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

Who is online

Users browsing this forum: No registered users and 4 guests