"Умное" преобразование табов

Здесь обсуждается всё, что касается макросов.
User avatar
SUSim
Posts: 1633
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 25 times

"Умное" преобразование табов

Post by SUSim »

Теперь по делу:
Посоветуйте или поделитесь простым макросом/функцией - преобразование строки взятой из редактора с табами в строку с адекватными пробелами в зависимости от настроек текущего редактора, текст в редакторе менять не надо!
Чтобы можно было сделать:
a=editor.getstring -- получили строку с \t
b=expandtab(a) -- получили строку внешне не отличимую от исходной, но вместо табов соответствующее число пробелов.
SimSU ··· ·· -- ··· ··-
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Набор макросов от SimSU v2014.10

Post by John Doe »

SUSim wrote: Посоветуйте или поделитесь простым макросом/функцией
В чём собственно проблема? Размер табуляции известен: http://api.farmanager.com/ru/macro/macr ... editor.set
User avatar
SUSim
Posts: 1633
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 25 times

Набор макросов от SimSU v2014.10

Post by SUSim »

Размер табуляции то известен, я даже его сохраняю/меняю для конкретных файлов, а вот преобразовать строку в которой несколько табов просто не получается, таб то разной длинны в зависимости от позиции - весь текст в редакторе легко преобразовать в файл без табов, и он внешне не изменится, а надо преобразовать только одну строку и в редактор её может и не придётся вставлять...
SimSU ··· ·· -- ··· ··-
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Набор макросов от SimSU v2014.10

Post by John Doe »

editor.TabToReal
User avatar
SUSim
Posts: 1633
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 25 times

Набор макросов от SimSU v2014.10

Post by SUSim »

И я думаю, что проблемы не должно быть:
размер таба = 8
есть строка - \t2\t4\t8\t16\t32\t64\t128
если просто заменить \t на 8 пробелов, то фигня получается -
SimSU ··· ·· -- ··· ··-
User avatar
SUSim
Posts: 1633
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 25 times

Набор макросов от SimSU v2014.10

Post by SUSim »

С использованием tabtoreal функция очень не простая у меня получается - проще открыть новый редактор, выставить ему размер табуляции, вставить строку (с табами), преобразовать весь текст в текст без табов, забрать получившуюся строку!
SimSU ··· ·· -- ··· ··-
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Набор макросов от SimSU v2014.10

Post by John Doe »

editor.RealToTab
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Набор макросов от SimSU v2014.10

Post by Shmuel »

(Не тестировалось):

Code: Select all

function Detabify (str, tabsize)
  str = str:gsub("()\t", function(pos) return (" "):rep(tabsize-(pos-1)%tabsize) end)
  return str;
end
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Набор макросов от SimSU v2014.10

Post by John Doe »

Shmuel, экспериментально не оно, очевидно надо учитывать размеры предыдущих замен.
И () возвращает позицию без учёта utf-8
User avatar
SUSim
Posts: 1633
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 25 times

Набор макросов от SimSU v2014.10

Post by SUSim »

John Doe, Издеваешься? я знаю и editor.RealToTab, и editor.TabToReal, но очень громоздко у меня получается...
повторю задачу (для наглядности чуть изменю):
надо преобразовать строку:
\t1\t12\t123\t1234\t12345\t!
в строку без табов,которая при вставке в редактор будет выглядеть точно также!
SimSU ··· ·· -- ··· ··-
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Набор макросов от SimSU v2014.10

Post by John Doe »

SUSim wrote: Издеваешься?
Да.
Вот сделал в лоб:

А вариант 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
User avatar
SUSim
Posts: 1633
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 25 times

Набор макросов от SimSU v2014.10

Post by SUSim »

Спасибо!
SimSU ··· ·· -- ··· ··-
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

Набор макросов от SimSU v2014.10

Post by HaRT »

SUSim wrote: просто заменить \t на 8 пробелов
Не надо так…
Надо вместо каждого таба вставлять не фиксированное кол-во пробелов, а добивать пробелами до следующей позиции табуляции — в данном случае (если нумеровать с 1) до 9, 17, 25, 33, …
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Набор макросов от SimSU v2014.10

Post by John Doe »

Спасибо, кэп!
:wink:
User avatar
SUSim
Posts: 1633
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 25 times

"Умное" преобразование табов

Post by SUSim »

Пока вот такое получается

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 ··· ·· -- ··· ··-
Post Reply

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