"Умное" преобразование табов
"Умное" преобразование табов
Теперь по делу:
Посоветуйте или поделитесь простым макросом/функцией - преобразование строки взятой из редактора с табами в строку с адекватными пробелами в зависимости от настроек текущего редактора, текст в редакторе менять не надо!
Чтобы можно было сделать:
a=editor.getstring -- получили строку с \t
b=expandtab(a) -- получили строку внешне не отличимую от исходной, но вместо табов соответствующее число пробелов.
Посоветуйте или поделитесь простым макросом/функцией - преобразование строки взятой из редактора с табами в строку с адекватными пробелами в зависимости от настроек текущего редактора, текст в редакторе менять не надо!
Чтобы можно было сделать:
a=editor.getstring -- получили строку с \t
b=expandtab(a) -- получили строку внешне не отличимую от исходной, но вместо табов соответствующее число пробелов.
SimSU ··· ·· -- ··· ··-
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Набор макросов от SimSU v2014.10
В чём собственно проблема? Размер табуляции известен: http://api.farmanager.com/ru/macro/macr ... editor.set
Набор макросов от SimSU v2014.10
Размер табуляции то известен, я даже его сохраняю/меняю для конкретных файлов, а вот преобразовать строку в которой несколько табов просто не получается, таб то разной длинны в зависимости от позиции - весь текст в редакторе легко преобразовать в файл без табов, и он внешне не изменится, а надо преобразовать только одну строку и в редактор её может и не придётся вставлять...
SimSU ··· ·· -- ··· ··-
Набор макросов от SimSU v2014.10
И я думаю, что проблемы не должно быть:
размер таба = 8
есть строка - \t2\t4\t8\t16\t32\t64\t128
если просто заменить \t на 8 пробелов, то фигня получается -
размер таба = 8
есть строка - \t2\t4\t8\t16\t32\t64\t128
если просто заменить \t на 8 пробелов, то фигня получается -
SimSU ··· ·· -- ··· ··-
Набор макросов от SimSU v2014.10
С использованием tabtoreal функция очень не простая у меня получается - проще открыть новый редактор, выставить ему размер табуляции, вставить строку (с табами), преобразовать весь текст в текст без табов, забрать получившуюся строку!
SimSU ··· ·· -- ··· ··-
-
- Posts: 6836
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Набор макросов от SimSU v2014.10
(Не тестировалось):
Code: Select all
function Detabify (str, tabsize)
str = str:gsub("()\t", function(pos) return (" "):rep(tabsize-(pos-1)%tabsize) end)
return str;
end
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Набор макросов от SimSU v2014.10
Shmuel, экспериментально не оно, очевидно надо учитывать размеры предыдущих замен.
И
И
()
возвращает позицию без учёта utf-8Набор макросов от SimSU v2014.10
John Doe, Издеваешься? я знаю и editor.RealToTab, и editor.TabToReal, но очень громоздко у меня получается...
повторю задачу (для наглядности чуть изменю):
надо преобразовать строку:
\t1\t12\t123\t1234\t12345\t!
в строку без табов,которая при вставке в редактор будет выглядеть точно также!
повторю задачу (для наглядности чуть изменю):
надо преобразовать строку:
\t1\t12\t123\t1234\t12345\t!
в строку без табов,которая при вставке в редактор будет выглядеть точно также!
SimSU ··· ·· -- ··· ··-
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Набор макросов от SimSU v2014.10
Да.
Вот сделал в лоб:
А вариант Shmuel конечно лучше, но его надо ещё допилить, а мне уже надоело.
Update:
Доработанная версия скрипта Shmuel здесь: http://forum.farmanager.com/viewtopic.p ... 93#p126493
А вот самый быстрый из вариантов, что я протестировал:
Code: Select all
local function Detabify (str, tabsize)
local s,start = "",1
repeat
local pos = string.find(str,"\t",start)
local s1 = string.sub(str,start,(pos or 0)-1)
if not pos then return s..s1 end
s = s..s1..(" "):rep(tabsize-(s1:len())%tabsize)
start = pos+1
until false
end
- HaRT
- Moderator
- Posts: 10863
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 221 times
- Been thanked: 358 times
Набор макросов от SimSU v2014.10
Не надо так…
Надо вместо каждого таба вставлять не фиксированное кол-во пробелов, а добивать пробелами до следующей позиции табуляции — в данном случае (если нумеровать с 1) до 9, 17, 25, 33, …
Фар есть инструмент, а не нянька. © 2009 DrKnS
"Умное" преобразование табов
Пока вот такое получается
или так по скорости разницы не ощутил, ОСОБЕННО на длииных строках оба макроса сильно тормозят...
Но всё равно громоздко - весь файл антабить можно одной командой, а вот строку...
Code: Select all
local function Detabify (str, tabsize)
local s,t = 0,0
return str:gsub("([^\t]*)\t", function(val) s=s+val:len(); t=tabsize-s%tabsize; s=s+t; return val..(" "):rep(t) end)
end
Code: Select all
local function Detabify (str, tabsize)
repeat
s1=str:match("([^\t]*)") or ""
s2=str:match("\t(.*)") or ""
str=s1..(" "):rep(tabsize-s1:len()%tabsize)..s2
until s2==""
return str
end
Но всё равно громоздко - весь файл антабить можно одной командой, а вот строку...
SimSU ··· ·· -- ··· ··-