Скрипт/плагин для генерирования случайных строк (random strings)

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Novosedoff
Posts: 69
Joined: Wed 02 Mar, 2011 19:31
Has thanked: 43 times

Скрипт/плагин для генерирования случайных строк (random strings)

Post by Novosedoff »

Приветствую.

Подскажите пжста существует ли плагин под Far который позволяет генерировать строки заданной длины из заданного алфавита символов?
Например, для паролей. Типа вот такого чтоб был, но локально.

Самое простое доступное решение, что я нашёл за минуту поисков - это вот этот bat-скрипт

Заранее благодарю.
Last edited by HaRT on Tue 23 Feb, 2021 18:35, edited 3 times in total.
Reason: Улучшен Заголовок Темы
Покажи мне список твоих плагинов, и я скажу кто ты...
Yegor
Posts: 1326
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

Плагин для генерирования random strings

Post by Yegor »

Ну если уже есть bat файл, добавьте просто его в меню, замените константы на спец символы типа

Code: Select all

!?<title>?<init>!
и в полет...

EDIT: Сам пользуюсь самописным консольным приложением, плагин из него делать не вижу смысла.
Last edited by Yegor on Mon 22 Feb, 2021 06:04, edited 1 time in total.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Плагин для генерирования random strings

Post by buniak_a_h »

Yegor wrote: Mon 22 Feb, 2021 06:03 Сам пользуюсь самописным консольным приложением, плагин из него делать не вижу смысла.
Интересно… Наверно, у каждого есть собственный генератор ;-)
Плагин - нет, а макрос простенький. Самое сложное - диалог задания параметров :-)
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Плагин для генерирования random strings

Post by buniak_a_h »

Вот Вам скрипт. По-моему, генерит. Что делать знаете?
PassGenerate.lua
(2.37 KiB) Downloaded 98 times
User avatar
Ann
Posts: 478
Joined: Tue 26 Jun, 2007 11:05
Has thanked: 141 times
Been thanked: 45 times

Плагин для генерирования random strings

Post by Ann »

buniak_a_h wrote: Mon 22 Feb, 2021 07:41PassGenerate.lua
И хотя в моей практике PassGenerate.lua как таковой и не требуется, мне было полезно попробовать облачить скрипт в форму макроса. И тот, который у меня получился, работает.

Но, будьте добры, посмотрите, пожалуйста, достаточно ли правильно я сделал? А именно, достаточно ли верно я определил позицию в скрипте, в которую поместил конструкцию Macro?

Обновлённый Luacheck к макросу не придирается.

Code: Select all

local F = far.Flags
local function Fill(From, To)
 local res = ''
 for i=utf8.byte(From), utf8.byte(To) do
  res = res .. utf8.char(i)
 end
 return res
end -- Fill
local function cInc(c,i)
 return utf8.char(utf8.byte(c) + i)
end

local alp ={Fill(cInc(' ',1), cInc('0',-1) ), -- Cpc -- 1
            Fill('A','Z');                           -- 2
            Fill( 'a', 'z' );                        -- 3
            Fill( 'А', 'Я' );                        -- 4
            Fill( 'а', 'я' );                        -- 5
            Fill( '0', '9' );                        -- 6
           }
local function PassGener(aPar)
 local len, Spc, Num, Cyr, CaseSens, FirstAlpha = aPar.len, aPar.Spc, aPar.Num, aPar.Cyr, aPar.CaseSens, aPar.FirstAlpha
 local set = alp[2]
 if CaseSens then set = set .. alp[3] end
 if Cyr then
  set = set .. alp[4]
  if CaseSens then set = set .. alp[5] end
 end
 if Spc then set = set .. alp[1] end
 if Num then set = set .. alp[6] end
 local n,res, i = set:len(),''
 math.randomseed(Far.UpTime)
 if FirstAlpha then
  i = math.random(alp[2]:len())
  res = alp[2]:sub(i,i)
 end
 while res:len() < len do
  i = math.random(n)
  res = res .. set:sub(i,i)
 end
 return res
end -- PassGener

local aDlg =
{
 {"DI_DOUBLEBOX"; 3; 0; 64; 8; 0; 0; 0; 0; "Генерация пароля"};
 {"DI_TEXT"; 15; 2; 0; 0; 0; 0; 0; 0; "Длина"};
 {"DI_EDIT"; 22; 2; 25; 0; 0,[10]='20'};
 {"DI_CHECKBOX"; 5; 4; 0; 0; 1; 0; 0; F.DIF_DISABLE; "Латиница"};
 {"DI_CHECKBOX"; 27; 4; 0; 0; 0; 0; 0; 0; "Кириллица"};
 {"DI_CHECKBOX"; 45; 4; 0; 0; 0; 0; 0; 0; "Цифры"};
 {"DI_CHECKBOX"; 5; 5; 0; 0; 0; 0; 0; 0; "Регистрозависимый"};
 {"DI_CHECKBOX"; 27; 5; 0; 0; 0; 0; 0; 0; "Спец.символы"};
 {"DI_CHECKBOX"; 45; 5; 0; 0; 0; 0; 0; 0; "Первый - буква"};
 {"DI_TEXT"; 0; 6; 0; 0; 0; 0; 0; F.DIF_SEPARATOR};
 {"DI_BUTTON"; 0; 7; 0; 0; 0; 0; 0; bor(F.DIF_CENTERGROUP, F.DIF_DEFAULTBUTTON); "Ok"};
 {"DI_BUTTON"; 0; 7; 0; 0; 0; 0; 0; F.DIF_CENTERGROUP; "Cancel"}
}
Macro{
  id="75B0FED7-7722-4B68-ADEC-00F2E41FF0ED";
  area="Common";
  key="CtrlAltShiftP";
  description="test: создать пароль заданной длины из заданного алфавита символов (bax)";
  flags="";
  condition=function()
    return Menu.Id~="165AA6E3-C89B-4F82-A0C5-C309243FD21B" -- исключает работу макроса в Меню выбора макроса
  end;
  action=function()
    while far.Dialog('',-1,-1,68,9,nil,aDlg) == #aDlg-1 do
     local aPars =
     {len=tonumber(aDlg[3][10]) or 6;
              CaseSens= aDlg[7][6] == 1;
              Spc = aDlg[8][6] == 1;
              Num = aDlg[6][6] == 1;
              Cyr = aDlg[5][6] == 1;
              FirstAlpha = aDlg[9][6] == 1;
     }
     far.Show(PassGener(aPars))
    end
  end
}
Last edited by Ann on Mon 22 Feb, 2021 21:01, edited 3 times in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Плагин для генерирования random strings

Post by John Doe »

А что на Луа или Питоне нет готовой библиотечки?
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Плагин для генерирования random strings

Post by buniak_a_h »

Ann wrote: Mon 22 Feb, 2021 09:56 Luacheck выдаёт следующую картинку:
У Вас старый LuaCheck.
--
На самом деле я не знаю, зачем он (этот макрос) Вам нужен. Если для вставки сгенерированного пароля в поле ввода, то (а) надо указать в condition тип элемента (and (Dlg.ItemType == 4 or Dlg.ItemType == 5) ); убрать цикл while, а вместо far.Show(PassGenerate…) написать print(PassGenerate…). Правда, тут ловушка: пароль сгеерите, в поле вставите, но не увидите! И как Вы потом будете читать архив (например) - это для меня загадка. ;-)
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Плагин для генерирования random strings

Post by buniak_a_h »

John Doe wrote: Mon 22 Feb, 2021 10:18 А что на Луа или Питоне нет готовой библиотечки?
Я не настолько знаю lua. Тем более - Питон.
Novosedoff
Posts: 69
Joined: Wed 02 Mar, 2011 19:31
Has thanked: 43 times

Плагин для генерирования random strings

Post by Novosedoff »

buniak_a_h wrote: Mon 22 Feb, 2021 07:41 Вот Вам скрипт. По-моему, генерит. Что делать знаете?
PassGenerate.lua
Я положил ваш скрипт в созданную мной папочку PassGenerate внутри Profile\Macros\scripts и он стал зачем-то запускаться автоматически при запуске Far :) Было бы удобней из меню конечно запускать

Скрипт уважаемого Ann из меню не запускается тоже

PS. Очень кстати предусмотрительно, что первый символ можно сделать буквенным - то, что мне и нужно. И чтоб сразу в клипборд его копировал как в батничке выше.
Last edited by Novosedoff on Mon 22 Feb, 2021 12:10, edited 2 times in total.
Покажи мне список твоих плагинов, и я скажу кто ты...
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Плагин для генерирования random strings

Post by buniak_a_h »

Novosedoff wrote: Mon 22 Feb, 2021 12:07 Я положил ваш скрипт в созданную мной папочку PassGenerate внутри Profile\Macros\scripts и он стал зачем-то запускаться автоматически при запуске Far Было бы удобней из меню конечно запускать
1. Положите куда угодно кроме подпапок %FarProfile%\macros\scripts: это - не макрос, его не надо загружать.
2. В меню сделайте пункт с таким содержанием:
lua:@путь_к_файлу
Или (раз Вы хотели плагин) положите в %FarProfile%\macros\scripts такой:
  1. local F = far.Flags
  2.  
  3. local function Fill(From, To)
  4.  
  5.  local res = ''
  6.  
  7.  for i=utf8.byte(From), utf8.byte(To) do
  8.  
  9.   res = res .. utf8.char(i)
  10.  
  11.  end
  12.  
  13.  return res
  14.  
  15. end -- Fill
  16.  
  17. local function cInc(c,i)
  18.  
  19.  return utf8.char(utf8.byte(c) + i)
  20.  
  21. end
  22.  
  23.  
  24.  
  25. local alp ={Fill(cInc(' ',1), cInc('0',-1) ), -- Cpc -- 1
  26.  
  27.             Fill('A','Z');                           -- 2
  28.  
  29.             Fill( 'a', 'z' );                        -- 3
  30.  
  31.             Fill( 'А', 'Я' );                        -- 4
  32.  
  33.             Fill( 'а', 'я' );                        -- 5
  34.  
  35.             Fill( '0', '9' );                        -- 6
  36.  
  37.            }
  38.  
  39. local function PassGener(aPar)
  40.  
  41.  local len, Spc, Num, Cyr, CaseSens, FirstAlpha = aPar.len, aPar.Spc, aPar.Num, aPar.Cyr, aPar.CaseSens, aPar.FirstAlpha
  42.  
  43.  local set = alp[2]
  44.  
  45.  if CaseSens then set = set .. alp[3] end
  46.  
  47.  if Cyr then
  48.  
  49.   set = set .. alp[4]
  50.  
  51.   if CaseSens then set = set .. alp[5] end
  52.  
  53.  end
  54.  
  55.  if Spc then set = set .. alp[1] end
  56.  
  57.  if Num then set = set .. alp[6] end
  58.  
  59.  local n,res, i = set:len(),''
  60.  
  61.  math.randomseed(Far.UpTime)
  62.  
  63.  if FirstAlpha then
  64.  
  65.   i = math.random(alp[2]:len())
  66.  
  67.   res = alp[2]:sub(i,i)
  68.  
  69.  end
  70.  
  71.  while res:len() < len do
  72.  
  73.   i = math.random(n)
  74.  
  75.   res = res .. set:sub(i,i)
  76.  
  77.  end
  78.  
  79.  return res
  80.  
  81. end -- PassGener
  82.  
  83.  
  84.  
  85. local aDlg =
  86.  
  87.  {
  88.  
  89.   {"DI_DOUBLEBOX"; 3; 0; 64; 8; 0; 0; 0; 0; "Генерация пароля"};
  90.  
  91.   {"DI_TEXT"; 15; 2; 0; 0; 0; 0; 0; 0; "Длина"};
  92.  
  93.   {"DI_EDIT"; 22; 2; 25; 0; 0,[10]='20'};
  94.  
  95.   {"DI_CHECKBOX"; 5; 4; 0; 0; 1; 0; 0; F.DIF_DISABLE; "Латиница"};
  96.  
  97.   {"DI_CHECKBOX"; 27; 4; 0; 0; 0; 0; 0; 0; "Кириллица"};
  98.  
  99.   {"DI_CHECKBOX"; 45; 4; 0; 0; 0; 0; 0; 0; "Цифры"};
  100.  
  101.   {"DI_CHECKBOX"; 5; 5; 0; 0; 0; 0; 0; 0; "Регистрозависимый"};
  102.  
  103.   {"DI_CHECKBOX"; 27; 5; 0; 0; 0; 0; 0; 0; "Спец.символы"};
  104.  
  105.   {"DI_CHECKBOX"; 45; 5; 0; 0; 0; 0; 0; 0; "Первый - буква"};
  106.  
  107.   {"DI_TEXT"; 0; 6; 0; 0; 0; 0; 0; F.DIF_SEPARATOR};
  108.  
  109.   {"DI_BUTTON"; 0; 7; 0; 0; 0; 0; 0; bor(F.DIF_CENTERGROUP, F.DIF_DEFAULTBUTTON); "Ok"};
  110.  
  111.   {"DI_BUTTON"; 0; 7; 0; 0; 0; 0; 0; F.DIF_CENTERGROUP; "Cancel"}
  112.  
  113.  }
  114.  
  115. MenuItem {
  116.  
  117.  description = 'Генерация пароля';
  118.  
  119.  menu = 'Plugins';
  120.  
  121.  area = 'Shell Dialog';
  122.  
  123.  guid = '71A5BEB9-5150-4316-B580-AA1F1A748D9E';
  124.  
  125.  text = 'BAX - Сгенерировать пароль';
  126.  
  127.  action = function()
  128.  
  129.   while far.Dialog(win.Uuid'A9D9BD9D-F0C6-4CFD-911B-268BDE54A4BD',-1,-1,68,9,nil,aDlg) == #aDlg-1 do
  130.  
  131.    local aPars =
  132.  
  133.    {len=tonumber(aDlg[3][10]) or 6;
  134.  
  135.             CaseSens= aDlg[7][6] == 1;
  136.  
  137.             Spc = aDlg[8][6] == 1;
  138.  
  139.             Num = aDlg[6][6] == 1;
  140.  
  141.             Cyr = aDlg[5][6] == 1;
  142.  
  143.             FirstAlpha = aDlg[9][6] == 1;
  144.  
  145.    }
  146.  
  147.    far.Show(PassGener(aPars))
  148.  
  149.   end
  150.  
  151.  end;
  152.  
  153. }
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Плагин для генерирования random strings

Post by buniak_a_h »

Если не поджимает время, подождите пару часов (просто сейчас мне некогда) - сделаю, чтоб в диалоге сгенерированный пароль вставлялся сразу в поле ввода, а в панелях - заносился в буфер
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Плагин для генерирования random strings

Post by buniak_a_h »

Ну вот. Вызывается из меню плагинов (как Вы и хотели). Если вызван из диалога, и при этом активно поле ввода, то результат можно поместить в поле ввода; также всегда можно запихнуть в буфер обмена.
  1. local F = far.Flags
  2.  
  3. local function Fill(From, To)
  4.  
  5.  local res = ''
  6.  
  7.  for i=utf8.byte(From), utf8.byte(To) do
  8.  
  9.   res = res .. utf8.char(i)
  10.  
  11.  end
  12.  
  13.  return res
  14.  
  15. end -- Fill
  16.  
  17. local function cInc(c,i)
  18.  
  19.  return utf8.char(utf8.byte(c) + i)
  20.  
  21. end
  22.  
  23.  
  24.  
  25. local alp ={Fill(cInc(' ',1), cInc('0',-1) ), -- Cpc -- 1
  26.  
  27.             Fill('A','Z');                           -- 2
  28.  
  29.             Fill( 'a', 'z' );                        -- 3
  30.  
  31.             Fill( 'А', 'Я' );                        -- 4
  32.  
  33.             Fill( 'а', 'я' );                        -- 5
  34.  
  35.             Fill( '0', '9' );                        -- 6
  36.  
  37.            }
  38.  
  39. local function PassGener(aPar)
  40.  
  41.  local len, Spc, Num, Cyr, CaseSens, FirstAlpha = aPar.len, aPar.Spc, aPar.Num, aPar.Cyr, aPar.CaseSens, aPar.FirstAlpha
  42.  
  43.  local set = alp[2]
  44.  
  45.  if CaseSens then set = set .. alp[3] end
  46.  
  47.  if Cyr then
  48.  
  49.   set = set .. alp[4]
  50.  
  51.   if CaseSens then set = set .. alp[5] end
  52.  
  53.  end
  54.  
  55.  if Spc then set = set .. alp[1] end
  56.  
  57.  if Num then set = set .. alp[6] end
  58.  
  59.  local n,res, i = set:len(),''
  60.  
  61.  math.randomseed(Far.UpTime)
  62.  
  63.  if FirstAlpha then
  64.  
  65.   i = math.random(alp[2]:len())
  66.  
  67.   res = alp[2]:sub(i,i)
  68.  
  69.  end
  70.  
  71.  while res:len() < len do
  72.  
  73.   i = math.random(n)
  74.  
  75.   res = res .. set:sub(i,i)
  76.  
  77.  end
  78.  
  79.  return res
  80.  
  81. end -- PassGener
  82.  
  83.  
  84.  
  85. local aDlg =
  86.  
  87.  {
  88.  
  89.   {"DI_DOUBLEBOX"; 3; 0; 64; 8; 0; 0; 0; 0; "Генерация пароля"};
  90.  
  91.   {"DI_TEXT"; 15; 2; 0; 0; 0; 0; 0; 0; "Длина"};
  92.  
  93.   {"DI_EDIT"; 22; 2; 25; 0; 0,[10]='20'};
  94.  
  95.   {"DI_CHECKBOX"; 5; 4; 0; 0; 1; 0; 0; F.DIF_DISABLE; "Латиница"};
  96.  
  97.   {"DI_CHECKBOX"; 27; 4; 0; 0; 0; 0; 0; 0; "Кириллица"};
  98.  
  99.   {"DI_CHECKBOX"; 45; 4; 0; 0; 0; 0; 0; 0; "Цифры"};
  100.  
  101.   {"DI_CHECKBOX"; 5; 5; 0; 0; 0; 0; 0; 0; "Регистрозависимый"};
  102.  
  103.   {"DI_CHECKBOX"; 27; 5; 0; 0; 0; 0; 0; 0; "Спец.символы"};
  104.  
  105.   {"DI_CHECKBOX"; 45; 5; 0; 0; 0; 0; 0; 0; "Первый - буква"};
  106.  
  107.   {"DI_TEXT"; 0; 6; 0; 0; 0; 0; 0; F.DIF_SEPARATOR};
  108.  
  109.   {"DI_BUTTON"; 0; 7; 0; 0; 0; 0; 0; bor(F.DIF_CENTERGROUP, F.DIF_DEFAULTBUTTON); "Ok"};
  110.  
  111.   {"DI_BUTTON"; 0; 7; 0; 0; 0; 0; 0; F.DIF_CENTERGROUP; "Cancel"}
  112.  
  113.  }
  114.  
  115. MenuItem {
  116.  
  117.  description = 'Генерация пароля';
  118.  
  119.  menu = 'Plugins';
  120.  
  121.  area = 'Shell Dialog';
  122.  
  123.  guid = '71A5BEB9-5150-4316-B580-AA1F1A748D9E';
  124.  
  125.  text = 'BAX - Сгенерировать пароль';
  126.  
  127.  action = function()
  128.  
  129.   while far.Dialog(win.Uuid'A9D9BD9D-F0C6-4CFD-911B-268BDE54A4BD',-1,-1,68,9,nil,aDlg) == #aDlg-1 do
  130.  
  131.    local aPars =
  132.  
  133.    {len=tonumber(aDlg[3][10]) or 6;
  134.  
  135.             CaseSens= aDlg[7][6] == 1;
  136.  
  137.             Spc = aDlg[8][6] == 1;
  138.  
  139.             Num = aDlg[6][6] == 1;
  140.  
  141.             Cyr = aDlg[5][6] == 1;
  142.  
  143.             FirstAlpha = aDlg[9][6] == 1;
  144.  
  145.    }
  146.  
  147.    local Pass = PassGener(aPars)
  148.  
  149.    local aButt = {'Повторить';'В буфер';'Выйти'}
  150.  
  151.    if Area.Dialog and Dlg.ItemType == 4 or Dlg.ItemType == 5 then
  152.  
  153.     table.insert(aButt, 3, 'В поле ввода')
  154.  
  155.    end
  156.  
  157.    local iChoice = far.Message('Сгенерирован пароль:\n'..Pass, 'PassGenerate', table.concat(aButt, ';'))
  158.  
  159.    if iChoice == -1 or iChoice == #aButt then break end
  160.  
  161.    if iChoice == 2 then
  162.  
  163.     far.CopyToClipboard(Pass)
  164.  
  165.    elseif iChoice == 3 then
  166.  
  167.     local hDlg = far.AdvControl(F.ACTL_GETWINDOWINFO).Id
  168.  
  169.     hDlg:send(F.DM_SETTEXT, Dlg.CurPos, Pass)
  170.  
  171.    end
  172.  
  173.    if iChoice ~= 1 then break end
  174.  
  175.   end
  176.  
  177.  end;
  178.  
  179. }
Novosedoff
Posts: 69
Joined: Wed 02 Mar, 2011 19:31
Has thanked: 43 times

Плагин для генерирования random strings

Post by Novosedoff »

Большое спасибо. Хотя, честно говоря, батничком быстрее получается, если его преднастроить заранее: нет при каждом запуске диалоговых окон..
Покажи мне список твоих плагинов, и я скажу кто ты...
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Плагин для генерирования random strings

Post by buniak_a_h »

Novosedoff wrote: Mon 22 Feb, 2021 19:55 Большое спасибо. Хотя, честно говоря, батничком быстрее получается, если его преднастроить заранее: нет при каждом запуске диалоговых окон..
Ну, Вы некорректно поставили задачу, а я исходил из своего опыта. Мне встречались разные требования к паролю. От длины до состава символов (то всё в верхнем регистре, то только латиница и цифры и т.п.). Потому и сделал диалог. Решить проблему легко: диалог вынести в настройку, а вызывать с последней настройкой без выбора. Надо?
P/S. Ну и за Вашу задачу взялся Ann, я ему пару советов дал … Он на какой-то хоткей макрос повесил… Обещал результат сюда поместить.
Novosedoff
Posts: 69
Joined: Wed 02 Mar, 2011 19:31
Has thanked: 43 times

Плагин для генерирования random strings

Post by Novosedoff »

buniak_a_h wrote: Tue 23 Feb, 2021 06:54 Ну, Вы некорректно поставили задачу, а я исходил из своего опыта. Мне встречались разные требования к паролю. От длины до состава символов (то всё в верхнем регистре, то только латиница и цифры и т.п.). Потому и сделал диалог. Решить проблему легко: диалог вынести в настройку, а вызывать с последней настройкой без выбора. Надо?
То есть вызов тогда будет по-прежнему через меню плагинов или как-то иначе?

Ещё в этом отношении тогда было б здоров, если первый буквенный символ в строке можно было заранее тоже задавать..
Покажи мне список твоих плагинов, и я скажу кто ты...
Post Reply

Return to “Нужна помощь”