LuaSpell — проверка орфографии в редакторе

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

LuaSpell — проверка орфографии в редакторе

Post by Aidar »

LuaSpell — пакет для проверки орфографии в редакторе.

Пакет поддерживает словари, используемые Hunspell, а также словари OOoUserDict1 (пользовательский словарь OpenOffice) и WordList (список слов).
Для Hunspell‑словарей используется библиотека hunspell из проекта luapower.

На PlugRing также выложены:
  • LuaSpell-hunspell-1.3.2.7z — библиотека hunspell v.1.3.2.
  • LuaSpell-Dictionaries.7z — русский (с "ё") и английский словари в кодировке UTF‑8.
Перед установкой прочтите LuaSpell\doc\Install.rus.

Последнюю версию библиотеки hunspell можно также скачать здесь.

Внимание:
Все файлы словарей должны быть в кодировке UTF-8 без BOM,
а в первой строке aff-файлов нужно прописать "SET UTF-8" (без кавычек).

Текущая версия: PlugRing.
Ссылки:
Описание, GitHub, tags, zipball, master.zip.
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

LuaSpell — проверка орфографии в редакторе

Post by Aidar »

Latest post of the previous page:

HaRT wrote:
Aidar wrote: Более подробно можно посмотреть в LuaSpell.cfg.user.example.
Если на этот файл (предварительно переименовав его в .lua) натравить LuaCheck, то вылезает ряд предупреждений..., в т.ч. одно, возможно свидетельствующее о логической ошибке.
Спасибо, я не успел повторно прогнать lua-файлы своих пакетов через ZBS. Среди предупреждений лишь одно полезное:

Code: Select all

unused variable 'NonesSet'
HaRT wrote:...А в самом LuaSpell.lua этого добра
А здесь важны следующие:

Code: Select all

setting non-standard global variable 'actprofiler'
setting non-standard global variable 'v'
unused variable 'h'
Эти ошибки я исправил, спасибо.
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

LuaSpell — проверка орфографии в редакторе

Post by Aidar »

HaRT wrote:Aidar...Неочевидным моментом оказалось требуемое расположение файла LuaSpell.cfg. Сложно ли сделать, чтобы он искался также прямо в %FARPROFILE% рядом с FarMenu.ini?
Достаточно поменять значение переменной CfgName в самом макросе. Пока все конфигурационные файлы для макросов хранятся в %FARPROFILE%\data\macros\, а для скриптов пакетов - в %FARPROFILE%\data\scripts\. Папку data можно заменить на свою, если задать переменную окружения %FARUSERDATADIR%. В следующей версии макроса добавлю поддержку этой перменной.
HaRT wrote:И ещё желательно либо включить в документацию описание формата файлов UserDict (кодировка, заголовок, сортировка?), либо привести ссылку на имеющуюся. В частности, у меня работает и с lang: <none>.
Хорошо. Сейчас заголовок словаря полностью игнорируется (все строки до "---" пропускаются).

P.S. Выложил макрос пока сюда.
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

LuaSpell — проверка орфографии в редакторе

Post by Aidar »

v.3.2.3.0
Добавил поддержку словарей в виде обычного списка слов (добавлен тип "WordList").
Добавил поддержку пользовательских словарей со списком запрещённых слов (поле WordType).
Подробнее см. LuaSpell.cfg.user.example.
Внимание: поле type из заголовка OOoUserDict-словаря не используется!

Исправил проблему с нелатинскими буквами в путях для пользовательских словарей (в отличие от словарей Hunspell, где нужно преобразование в ANSI). В %FARPROFILE%\data\macros\LuaSpell.cfg во все таблицы описания пользовательских словарей добавьте строку, чтобы получилось

P.S. Выложил макрос пока сюда.
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

LuaSpell — проверка орфографии в редакторе

Post by HaRT »

Предлагаю такие улучшения/изменения для версии 3.2.4.0:
1. Файл конфигурации переименован в LuaSpell.cfg.lua, чтобы в нём ожидаемо работала подсветка синтаксиса, luacheck и вообще всё, что ориентируется на тип файла.
2. Добавлена опция ShowEmptyList — показывать ли пустой список пред(по)ложений (чтобы не было иллюзии, будто макрос не сработал).
3. Выставлена скрытая прежде возможность вызвать перехода на предыдущее ошибочное слово (только при этом почему-то ничего не происходит).
4. Список пред(по)ложений расширен справа на одно знакоместо (чтобы самые длинные слова не упирались правым краем в рамку, будто усечённые).
5. Устранены почти все предупреждения luacheck, устранены некоторые избыточные идентификаторы, устранены глобальные блоки do-end (чтобы не засоряли Outline от Colorer), исправлены опечатки в комментариях, удалены концевые пробелы.
  1. diff --git a/scripts/LuaSpell/LuaSpell.lua b/scripts/LuaSpell/LuaSpell.lua
  2.  
  3. index 83e8856..21c08da 100644
  4.  
  5. --- a/scripts/LuaSpell/LuaSpell.lua
  6.  
  7. +++ b/scripts/LuaSpell/LuaSpell.lua
  8.  
  9. @@ -1,4 +1,5 @@
  10.  
  11. ---[[ LuaSpell ]]--
  12.  
  13. +-- Based on http:// forum.farmanager.com/viewtopic.php?p=118520#p118520
  14.  
  15. +--[[ LuaSpell ]]--
  16.  
  17.  
  18.  
  19.  ----------------------------------------
  20.  
  21.  --[[ description:
  22.  
  23. @@ -33,11 +34,11 @@
  24.  
  25.       По умолчанию макрос настроен на словари
  26.  
  27.       ru_RU_yo и en_US (нужны файлы aff и dic).
  28.  
  29.    3. Конфигурация:
  30.  
  31. -     файл конфигурации макроса — ~%FARPROFILE%\data\macros\LuaSpell.cfg~.
  32.  
  33. +     файл конфигурации макроса — ~%FARPROFILE%\data\macros\LuaSpell.cfg.lua~.
  34.  
  35.  --]]
  36.  
  37.  --------------------------------------------------------------------------------
  38.  
  39.  
  40.  
  41. -----------------------------------------
  42.  
  43. +--[[--------------------------------------
  44.  
  45.  local useprofiler = false
  46.  
  47.  --local useprofiler = true
  48.  
  49.  
  50.  
  51. @@ -46,12 +47,7 @@ if useprofiler then
  52.  
  53.    require "profiler" -- Lua Profiler
  54.  
  55.    actprofiler = false
  56.  
  57.  end
  58.  
  59. -
  60.  
  61. -----------------------------------------
  62.  
  63. -local tostring = tostring
  64.  
  65. -
  66.  
  67. -----------------------------------------
  68.  
  69. -local regex = regex
  70.  
  71. +]]----------------------------------------
  72.  
  73.  
  74.  
  75.  local F = far.Flags
  76.  
  77.  local Flag4BIT = bit64.bor(F.FCF_FG_4BIT, F.FCF_BG_4BIT)
  78.  
  79. @@ -78,7 +74,7 @@ local function ExpandEnv (s)
  80.  
  81.  end
  82.  
  83.  
  84.  
  85.  ---------------------------------------- config
  86.  
  87. -local CfgNameFmt = [[%%FARPROFILE%%\%s\%s\%s.cfg]]
  88.  
  89. +local CfgNameFmt = [[%%FARPROFILE%%\%s\%s\%s.cfg.lua]]
  90.  
  91.  local CfgName = CfgNameFmt:format(win.GetEnv("FARUSERDATADIR") or "data",
  92.  
  93.                                    "macros", unit.ScriptName)
  94.  
  95.  local DictionaryPath = [[%FARPROFILE%\Dictionaries\]]
  96.  
  97. @@ -99,17 +95,19 @@ local DefCfgData = {
  98.  
  99.  
  100.  
  101.    CharsSet = CharsSet,                  -- Множество допустимых символов
  102.  
  103.                                          -- для проверки на наличие слова:
  104.  
  105. -  InnerSet = CharsSet.."$",             -- - в конце строке
  106.  
  107. -  StartSet = "^"..CharsSet,             -- - в начале строке
  108.  
  109. +  InnerSet = CharsSet.."$",             -- - в конце строки
  110.  
  111. +  StartSet = "^"..CharsSet,             -- - в начале строки
  112.  
  113.    CheckSet = "/\\b"..CharsSet.."\\b/",  -- - в середине строки
  114.  
  115.    BoundSet = "\\S*",                    -- - с граничными символами
  116.  
  117.  
  118.  
  119.    ColorPrio = 199,                      -- Приоритет раскрашивания
  120.  
  121.  
  122.  
  123. +  ShowEmptyList = false,                -- Показывать ли пустой список предположений
  124.  
  125.    MacroKeys = {                         -- Клавиши для макросов:
  126.  
  127.      CheckSpell  = "CtrlF12",            -- - проверка текущего слова
  128.  
  129. -    Misspelling = "ShiftF12",           -- - переход на следующее ошибочное слово
  130.  
  131. -    SwitchCheck = "CtrlShiftF12",       -- - переключение подсветки ошибочных слов
  132.  
  133. +    NextMisspelling = "ShiftF12",       -- - переход на следующее ошибочное слово
  134.  
  135. +    PrevMisspelling = "LCtrlShiftF12",  -- - переход на предыдущее ошибочное слово
  136.  
  137. +    SwitchCheck = "LCtrlLAltF12",       -- - переключение подсветки ошибочных слов
  138.  
  139.      UnloadSpell = "LCtrlLAltShiftF12",  -- - завершение проверки (выгрузка)
  140.  
  141.    },
  142.  
  143.  
  144.  
  145. @@ -138,7 +136,7 @@ local DefCfgData = {
  146.  
  147.                                          -- при обнаружении слова в словаре
  148.  
  149.    },
  150.  
  151.    { -- Word list
  152.  
  153. -    Type = "WordList",                  -- Тип                                
  154.  
  155. +    Type = "WordList",                  -- Тип
  156.  
  157.      WordType = "disabled",              -- Тип слов: запрещённый
  158.  
  159.      StrToPath = false,
  160.  
  161.      path = UserDictPath,
  162.  
  163. @@ -212,6 +210,8 @@ local function CreateMain (ArgData)
  164.  
  165.    end
  166.  
  167.    if not config then config = {} end
  168.  
  169.  
  170.  
  171. +  local _,_ = ArgData,serror
  172.  
  173. +
  174.  
  175.    setmetatable(config, { __index = DefCfgData })
  176.  
  177.  
  178.  
  179.    local n = #config
  180.  
  181. @@ -261,24 +261,17 @@ function unit.StrToStr (s)
  182.  
  183.    return s
  184.  
  185.  end ---- StrToStr
  186.  
  187.  
  188.  
  189. -do
  190.  
  191. -  local AnsiCP
  192.  
  193. -  local WCtoMB = win.WideCharToMultiByte
  194.  
  195. -  local U8toU16 = win.Utf8ToUtf16
  196.  
  197. -
  198.  
  199.  function unit.StrToAnsi (s)
  200.  
  201. -  if not AnsiCP then AnsiCP = win.GetACP() end
  202.  
  203. -  return WCtoMB(U8toU16(s), AnsiCP)
  204.  
  205. +  return win.WideCharToMultiByte(win.Utf8ToUtf16(s), win.GetACP())
  206.  
  207.  end ---- StrToAnsi
  208.  
  209.  
  210.  
  211. -end -- do
  212.  
  213.  ---------------------------------------- Hunspell
  214.  
  215.  local hunspell = require "hunspell"
  216.  
  217.  
  218.  
  219. -local function NewHunspell (k, v)
  220.  
  221. +local function NewHunspell (k_, v_)
  222.  
  223.    if not hunspell then return false end
  224.  
  225. -  
  226.  
  227. -  local v = v
  228.  
  229. +
  230.  
  231. +  local _,v = k_,v_
  232.  
  233.    --local handle, text = hunspell.new(v.affpath, v.dicpath, nil)
  234.  
  235.    local handle, text = hunspell.new(v.StrToPath(v.affpath),
  236.  
  237.                                      v.StrToPath(v.dicpath), nil)
  238.  
  239. @@ -290,8 +283,8 @@ local function NewHunspell (k, v)
  240.  
  241.    return false
  242.  
  243.  end -- NewHunspell
  244.  
  245.  
  246.  
  247. -function unit.InitHunspell (k)
  248.  
  249. -  local k = k
  250.  
  251. +function unit.InitHunspell (k_)
  252.  
  253. +  local k = k_
  254.  
  255.    local v = config[k]
  256.  
  257.    local Path = v.path or config.Path
  258.  
  259.  
  260.  
  261. @@ -323,10 +316,10 @@ end ---- InitHunspell
  262.  
  263.  ---------------------------------------- UserDict
  264.  
  265.  local userdict = require "userdict"
  266.  
  267.  
  268.  
  269. -local function NewUserDict (k, v)
  270.  
  271. +local function NewUserDict (k_, v_)
  272.  
  273.    if not userdict then return false end
  274.  
  275. -  
  276.  
  277. -  local v = v
  278.  
  279. +
  280.  
  281. +  local _,v = k_,v_
  282.  
  283.    --local handle, text = hunspell.new(v.affpath, v.dicpath, nil)
  284.  
  285.    local handle, text = userdict.new(v)
  286.  
  287.    if handle then return handle end
  288.  
  289. @@ -337,8 +330,8 @@ local function NewUserDict (k, v)
  290.  
  291.    return false
  292.  
  293.  end -- NewUserDict
  294.  
  295.  
  296.  
  297. -function unit.InitUserDict (k)
  298.  
  299. -  local k = k
  300.  
  301. +function unit.InitUserDict (k_)
  302.  
  303. +  local k = k_
  304.  
  305.    local v = config[k]
  306.  
  307.    local Path = v.path or config.Path
  308.  
  309.  
  310.  
  311. @@ -373,8 +366,6 @@ end ---- InitUserDict
  312.  
  313.  
  314.  
  315.  ---------------------------------------- Dictionary
  316.  
  317.  
  318.  
  319. -local tostring = tostring
  320.  
  321. -
  322.  
  323.  function unit.InitDictionary (k)
  324.  
  325.    local v = config[k]
  326.  
  327.    --local Path = config.Path
  328.  
  329. @@ -430,8 +421,8 @@ function unit.FreeDictionary (k)
  330.  
  331.    end
  332.  
  333.  end ---- FreeDictionary
  334.  
  335.  
  336.  
  337. -function unit.Add_Dics (k)
  338.  
  339. -  local k = k
  340.  
  341. +function unit.Add_Dics (k_)
  342.  
  343. +  local k = k_
  344.  
  345.    local v = config[k]
  346.  
  347.  
  348.  
  349.    local h = v.handle
  350.  
  351. @@ -459,12 +450,12 @@ function unit.Add_Dics (k)
  352.  
  353.    end
  354.  
  355.  end -- Add_Dics
  356.  
  357.  
  358.  
  359. -function unit.Add_DirDics (k, path, mask, match, n)
  360.  
  361. +function unit.Add_DirDics (k_, path_, mask, match, n)
  362.  
  363.    if not mask then
  364.  
  365.      return
  366.  
  367.    end
  368.  
  369.  
  370.  
  371. -  local k = k
  372.  
  373. +  local k = k_
  374.  
  375.    local v = config[k]
  376.  
  377.  
  378.  
  379.    local h = v.handle
  380.  
  381. @@ -473,7 +464,7 @@ function unit.Add_DirDics (k, path, mask, match, n)
  382.  
  383.      return
  384.  
  385.    end
  386.  
  387.  
  388.  
  389. -  local path = ExpandEnv(path or v.path or config.Path)
  390.  
  391. +  local path = ExpandEnv(path_ or v.path or config.Path)
  392.  
  393.    return unit.Add_ByMask(path, mask, match, h, "", n)
  394.  
  395.  end ---- Add_DirDics
  396.  
  397.  
  398.  
  399. @@ -489,7 +480,7 @@ function unit.Add_ByMask (path, mask, match, handle, key, n)
  400.  
  401.      return
  402.  
  403.    end
  404.  
  405.  
  406.  
  407. -  local t = {}
  408.  
  409. +  --local t = {}
  410.  
  411.    local dics = {}
  412.  
  413.  
  414.  
  415.    local function HandleFile (item, fullname)
  416.  
  417. @@ -509,7 +500,7 @@ function unit.Add_ByMask (path, mask, match, handle, key, n)
  418.  
  419.    far.RecursiveSearch(path:gsub("\\$", ""), "*", HandleFile, F.FRS_SCANSYMLINK)
  420.  
  421.    --far.Show(unpack(t))
  422.  
  423.  
  424.  
  425. -  for i, dic in ipairs(dics) do
  426.  
  427. +  for _,dic in ipairs(dics) do
  428.  
  429.      --t[#t + 1] = dic.FullName
  430.  
  431.      h:add_dic(dic.FullName, key, n)
  432.  
  433.    end
  434.  
  435. @@ -517,9 +508,8 @@ function unit.Add_ByMask (path, mask, match, handle, key, n)
  436.  
  437.  end ---- Add_ByMask
  438.  
  439.  
  440.  
  441.  ---------------------------------------- Work
  442.  
  443. -do
  444.  
  445. -  local InitDictionary = unit.InitDictionary
  446.  
  447. -  local FreeDictionary = unit.FreeDictionary
  448.  
  449. +local InitDictionary = unit.InitDictionary
  450.  
  451. +local FreeDictionary = unit.FreeDictionary
  452.  
  453.  
  454.  
  455.  function unit.Init ()
  456.  
  457.    if unit.Enabled then return end
  458.  
  459. @@ -541,7 +531,6 @@ function unit.Free ()
  460.  
  461.    unit.Enabled = false
  462.  
  463.  end ---- Free
  464.  
  465.  
  466.  
  467. -end
  468.  
  469.  ---------------------------------------- Find
  470.  
  471.  -- from LF context (context\scripts\detectType.lua):
  472.  
  473.  
  474.  
  475. @@ -602,33 +591,28 @@ local function ShowMenu (strings, wordLen)
  476.  
  477.      y = r + 2
  478.  
  479.      h = info.WindowSizeY - y + 1 - menuOverheadHeight
  480.  
  481.      h = math.min(h, #strings)
  482.  
  483. -
  484.  
  485.    else
  486.  
  487.      -- сверху
  488.  
  489.      y = r - #strings - 1
  490.  
  491.      if y < 1 then y = 1 end
  492.  
  493.      h = r - y - 1
  494.  
  495. -
  496.  
  497.    end
  498.  
  499.  
  500.  
  501.    -- fix menu width
  502.  
  503.    if (x + w + menuOverheadWidth) > info.WindowSizeX then
  504.  
  505.      w = info.WindowSizeX - x - menuOverheadWidth
  506.  
  507. -
  508.  
  509.    end
  510.  
  511. +  w = w + 1  -- чтобы самые длинные слова не упирались правым краем в рамку, будто усечённые
  512.  
  513.  
  514.  
  515.    local Form = {
  516.  
  517.      { "DI_LISTBOX", 0, 0, w + 3, h + 1, Items, 0, 0, 0, "" }
  518.  
  519.    }
  520.  
  521.  
  522.  
  523. -  local function DlgProc (dlg, msg, param1, param2)
  524.  
  525. -  end -- DlgProc
  526.  
  527. -
  528.  
  529.    local hDlg = far.DialogInit(config.PopupGuid,
  530.  
  531.                                x, y,
  532.  
  533.                                x + w + 3,
  534.  
  535.                                y + h + 1,
  536.  
  537. -                              nil, Form, 0, DlgProc)
  538.  
  539. +                              nil, Form)
  540.  
  541.    local Index = far.DialogRun(hDlg) > 0 and
  542.  
  543.                  far.SendDlgMessage(hDlg, F.DM_LISTGETCURPOS, 1).SelectPos or nil
  544.  
  545.    far.DialogFree(hDlg)
  546.  
  547. @@ -713,12 +697,12 @@ function unit.CheckSpell ()
  548.  
  549.          if h.suggest and
  550.  
  551.             (not h.spell or not h:spell(w)) then
  552.  
  553.            local items = h:suggest(w)
  554.  
  555. -          if #items > 0 then
  556.  
  557. +          if config.ShowEmptyList or #items > 0 then
  558.  
  559.              local Index = ShowMenu(items, wLen)
  560.  
  561.              if Index then
  562.  
  563. -              local s = line:sub(1, spos - 1)..
  564.  
  565. -                        items[Index]..
  566.  
  567. -                        line:sub(spos + wLen)
  568.  
  569. +              s = line:sub(1, spos - 1)..
  570.  
  571. +                  items[Index]..
  572.  
  573. +                  line:sub(spos + wLen)
  574.  
  575.                EditorSetLine(-1, 0, s, eol)
  576.  
  577.              end
  578.  
  579.            end
  580.  
  581. @@ -761,29 +745,17 @@ local function RemoveColors (id)
  582.  
  583.  end -- RemoveColors
  584.  
  585.  unit.RemoveColors = RemoveColors
  586.  
  587.  
  588.  
  589. -do
  590.  
  591. -  local Far_WinCount    = F.ACTL_GETWINDOWCOUNT
  592.  
  593. -  local Far_WinInfo     = F.ACTL_GETWINDOWINFO
  594.  
  595. -  local WinType_Editor  = F.WTYPE_EDITOR
  596.  
  597. -
  598.  
  599.  function unit.RemoveAllColors ()
  600.  
  601. -  local Count = far.AdvControl(Far_WinCount, 0, 0)
  602.  
  603. +  local Count = far.AdvControl(F.ACTL_GETWINDOWCOUNT, 0, 0)
  604.  
  605.    for i = 1, Count do
  606.  
  607. -    local Info = far.AdvControl(Far_WinInfo, i, 0)
  608.  
  609. -    if Info and Info.Type == WinType_Editor then
  610.  
  611. +    local Info = far.AdvControl(F.ACTL_GETWINDOWINFO, i, 0)
  612.  
  613. +    if Info and Info.Type == F.WTYPE_EDITOR then
  614.  
  615.        RemoveColors(Info.Id)
  616.  
  617.      end
  618.  
  619.    end
  620.  
  621.  end ---- RemoveAllColors
  622.  
  623.  
  624.  
  625. -end -- do
  626.  
  627. -
  628.  
  629. -do
  630.  
  631. -  local AddColor = editor.AddColor
  632.  
  633. -  local Mark_Current = F.ECF_TABMARKCURRENT
  634.  
  635. -
  636.  
  637. -function unit.CheckSpellText (Info, action)
  638.  
  639. -  local Info = Info
  640.  
  641. +function unit.CheckSpellText (Info, action_)
  642.  
  643.    if not Info then return end
  644.  
  645.  
  646.  
  647.    unit.Init()
  648.  
  649. @@ -802,7 +774,7 @@ function unit.CheckSpellText (Info, action)
  650.  
  651.      v.masked = not v.masks or (checkValueOver(fname, v.masks) and true)
  652.  
  653.    end
  654.  
  655.  
  656.  
  657. -  local action = action or "all"
  658.  
  659. +  local action = action_ or "all"
  660.  
  661.    local data
  662.  
  663.    if action == "all" then
  664.  
  665.      data = RemoveColors(id)
  666.  
  667. @@ -859,7 +831,7 @@ function unit.CheckSpellText (Info, action)
  668.  
  669.                  brim = line:sub(bpos, bend)
  670.  
  671.                end
  672.  
  673.                if brim ~= "" then
  674.  
  675. -                local word = v.word
  676.  
  677. +                word = v.word
  678.  
  679.                  v.word = word..brim
  680.  
  681.                  matched = CheckMatch(v, fname, line, spos, l)
  682.  
  683.                  v.word = word
  684.  
  685. @@ -872,12 +844,11 @@ function unit.CheckSpellText (Info, action)
  686.  
  687.                if isError and brim ~= "" then
  688.  
  689.                  isError = not h:spell(v.word..brim)
  690.  
  691.                end
  692.  
  693. -              
  694.  
  695. +
  696.  
  697.                if isError then
  698.  
  699.                  if action == "all" then
  700.  
  701.                    if v.color then
  702.  
  703. -                    AddColor(id, l, spos, send,
  704.  
  705. -                             Mark_Current, v.color, prio, guid)
  706.  
  707. +                    editor.AddColor(id, l, spos, send, F.ECF_TABMARKCURRENT, v.color, prio, guid)
  708.  
  709.                    end
  710.  
  711.  
  712.  
  713.                  elseif action == "next" then
  714.  
  715. @@ -907,11 +878,12 @@ function unit.CheckSpellText (Info, action)
  716.  
  717.    return true
  718.  
  719.  end ---- CheckSpellText
  720.  
  721.  
  722.  
  723. -end -- do
  724.  
  725. -
  726.  
  727. -function unit.Misspelling ()
  728.  
  729. +function unit.NextMisspelling ()
  730.  
  731.    return unit.CheckSpellText(EditorGetInfo(), "next")
  732.  
  733. -end ---- Misspelling
  734.  
  735. +end
  736.  
  737. +function unit.PrevMisspelling ()
  738.  
  739. +  return unit.CheckSpellText(EditorGetInfo(), "prior")
  740.  
  741. +end
  742.  
  743.  
  744.  
  745.  function unit.SwitchCheck ()
  746.  
  747.    --far.Show"SwitchCheck"
  748.  
  749. @@ -932,14 +904,6 @@ end
  750.  
  751.  ---------------------------------------- Events
  752.  
  753.  local CheckSpellText = unit.CheckSpellText
  754.  
  755.  
  756.  
  757. -do
  758.  
  759. -  local EE_READ     = F.EE_READ
  760.  
  761. -  --local EE_SAVE     = F.EE_SAVE
  762.  
  763. -  local EE_CLOSE    = F.EE_CLOSE
  764.  
  765. -  local EE_GOTFOCUS = F.EE_GOTFOCUS
  766.  
  767. -  --local EE_CHANGE   = F.EE_CHANGE
  768.  
  769. -  local EE_REDRAW   = F.EE_REDRAW
  770.  
  771. -
  772.  
  773.  local function reloadEditorConfig (id, kind) --| editors
  774.  
  775.    --logShow({ "reset", editor.GetInfo() })
  776.  
  777.  
  778.  
  779. @@ -965,19 +929,19 @@ Event {
  780.  
  781.    group = "EditorEvent",
  782.  
  783.    description = "Check spell all",
  784.  
  785.  
  786.  
  787. -  action = function (id, event, param)
  788.  
  789. -    local eid = id
  790.  
  791. -    if event == EE_READ then
  792.  
  793. +  action = function (eid, event, param)
  794.  
  795. +    local _ = param
  796.  
  797. +    if event == F.EE_READ then
  798.  
  799.        reloadEditorConfig(eid, 'load')
  800.  
  801.  
  802.  
  803. -    elseif event == EE_GOTFOCUS then
  804.  
  805. +    elseif event == F.EE_GOTFOCUS then
  806.  
  807.        reloadEditorConfig(eid, 'focus')
  808.  
  809. -    
  810.  
  811. -    elseif event == EE_CLOSE then
  812.  
  813. +
  814.  
  815. +    elseif event == F.EE_CLOSE then
  816.  
  817.        editors.current, editors[eid] = nil, nil
  818.  
  819.        --if useprofiler and actprofiler then profiler.stop(); actprofiler = false end
  820.  
  821.  
  822.  
  823. -    elseif event == EE_REDRAW then
  824.  
  825. +    elseif event == F.EE_REDRAW then
  826.  
  827.        if config.Enabled then
  828.  
  829.          CheckSpellText(EditorGetInfo(), "all")
  830.  
  831.        end
  832.  
  833. @@ -993,7 +957,6 @@ Event {
  834.  
  835.    action = unit.UnloadSpell,
  836.  
  837.  } -- Event "ExitFAR"
  838.  
  839.  
  840.  
  841. -end -- do
  842.  
  843.  ---------------------------------------- Macros
  844.  
  845.  if config.MacroKeys.CheckSpell then
  846.  
  847.  Macro {
  848.  
  849. @@ -1013,12 +976,21 @@ Macro {
  850.  
  851.  } ---
  852.  
  853.  end
  854.  
  855.  
  856.  
  857. -if config.MacroKeys.Misspelling then
  858.  
  859. +if config.MacroKeys.NextMisspelling then
  860.  
  861.  Macro {
  862.  
  863.    area = "Editor",
  864.  
  865. -  key = config.MacroKeys.Misspelling,
  866.  
  867. +  key = config.MacroKeys.NextMisspelling,
  868.  
  869.    description = "LuaSpell: Next misspelling",
  870.  
  871. -  action = unit.Misspelling,
  872.  
  873. +  action = unit.NextMisspelling,
  874.  
  875. +} ---
  876.  
  877. +end
  878.  
  879. +
  880.  
  881. +if config.MacroKeys.PrevMisspelling then
  882.  
  883. +Macro {
  884.  
  885. +  area = "Editor",
  886.  
  887. +  key = config.MacroKeys.PrevMisspelling,
  888.  
  889. +  description = "LuaSpell: Previous misspelling",
  890.  
  891. +  action = unit.PrevMisspelling,
  892.  
  893.  } ---
  894.  
  895.  end
  896.  
  897.  
  898.  
  899. @@ -1030,4 +1002,3 @@ Macro {
  900.  
  901.    action = unit.UnloadSpell,
  902.  
  903.  } ---
  904.  
  905.  end
  906.  
  907. ---------------------------------------------------------------------------------
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

LuaSpell — проверка орфографии в редакторе

Post by HaRT »

Aidar wrote: Добавил поддержку словарей в виде обычного списка слов (добавлен тип "WordList").
Спасибо!
Почему-то слово из первой строки не подхватывается — проще всего это выявить, запустив проверку в самом таком словаре. Ошибка?
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

LuaSpell — проверка орфографии в редакторе

Post by Aidar »

HaRT wrote:1. Файл конфигурации переименован в LuaSpell.cfg.lua, чтобы в нём ожидаемо работала подсветка синтаксиса, luacheck и вообще всё, что ориентируется на тип файла.
Добавьте в prototype name="lua" .
Постараюсь выложить используемые мной схемы для FarColorer. Старая версия схем здесь [от 2013-04-26].
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

LuaSpell — проверка орфографии в редакторе

Post by Aidar »

HaRT wrote:...Почему-то слово из первой строки не подхватывается — проще всего это выявить, запустив проверку в самом таком словаре. Ошибка?
Использую WordList-словарь Stop_List из трёх слов: все слова раскрашиваются.
Приложите словарь и файл конфигурации.
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

LuaSpell — проверка орфографии в редакторе

Post by Aidar »

HaRT wrote:2. Добавлена опция ShowEmptyList — показывать ли пустой список пред(по)ложений (чтобы не было иллюзии, будто макрос не сработал).
Спасибо, опцию назвал EmptyList аналогично опции в WordComplete.
HaRT wrote:3. Выставлена скрытая прежде возможность вызвать перехода на предыдущее ошибочное слово (только при этом почему-то ничего не происходит).
1. Не тестировалось. 2. Будет работать странно: строки просматривает назад, а внутри строк — вперёд. 4. Предполагаю реализовать добавление в меню плагинов, чтобы можно было назначать макросы обычным образом. А текущие комбинации оставить как часто используемые.
HaRT wrote:4. Список пред(по)ложений расширен справа на одно знакоместо (чтобы самые длинные слова не упирались правым краем в рамку, будто усечённые).
Спасибо, добавил строку в макрос.
HaRT wrote:5. Устранены почти все предупреждения luacheck, устранены некоторые избыточные идентификаторы, устранены глобальные блоки do-end (чтобы не засоряли Outline от Colorer), исправлены опечатки в комментариях, удалены концевые пробелы.
Тогда из lua.hrc лучше убрать do-end-
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

LuaSpell — проверка орфографии в редакторе

Post by HaRT »

Aidar wrote: используемые мной схемы для FarColorer
Как добавить в Колорер отдельные файлы, я знаю, но мне не нравится сама идея делать такое для каждого нового файла конфигурации и для каждого редактора, в котором я захочу его открыть. На мой взгляд, если формат текста — код на Луа, то удобнее, чтобы и расширение у имени файла было соответствующее.
Aidar wrote: Использую WordList-словарь Stop_List
Я использую WordList в качестве положительного словаря.
Aidar wrote: Приложите словарь и файл конфигурации.
Вот почти минимальный пример: , .
Если открыть на редактирование сам custom.dic и включить подсветку неправильных слов, то «перваястрока» подсвечивается красным (от положения слова в тексте не зависит).
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

LuaSpell — проверка орфографии в редакторе

Post by HaRT »

Aidar wrote: опцию назвал EmptyList аналогично опции в WordComplete.
Это не очень удачно, ибо может быть понято как „опустошить список“, т.к. “empty” — ещё и глагол. Впрочем, не принципиально.
Aidar wrote: 2. Будет работать странно: строки просматривает назад, а внутри строк — вперёд.
А сложно ли сделать, чтобы оно работало ожидаемо? ;)
Aidar wrote: 4. Предполагаю реализовать добавление в меню плагинов, чтобы можно было назначать макросы обычным образом. А текущие комбинации оставить как часто используемые.
В принципе не возражаю, но не хотелось бы иметь каждое действие отдельным пунктом верхнего уровня, чтобы не раздувать меню попусту.
Aidar wrote: Тогда из lua.hrc лучше убрать do-end
Это отдельный вопрос. В коде LuaSpell.lua использование этой конструкции мне показалось неоправданным — потому и предлагаю их оттуда удалить.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

LuaSpell — проверка орфографии в редакторе

Post by Aidar »

HaRT wrote:
Aidar wrote: опцию назвал EmptyList...
Это не очень удачно, ибо может быть понято как „опустошить список“, т.к. “empty” — ещё и глагол.
Ясно.
HaRT wrote:
Aidar wrote: 2. Будет работать странно: строки просматривает назад, а внутри строк — вперёд.
А сложно ли сделать, чтобы оно работало ожидаемо? ;)
Ну, если есть или будет реализована поддержка поиска назад в регулярных выражениях.
HaRT wrote:...не хотелось бы иметь каждое действие отдельным пунктом верхнего уровня, чтобы не раздувать меню попусту.
Планировал один пункт с отображением меню с возможными действиями (как в UM_Adapter).
HaRT wrote:
Aidar wrote: Тогда из lua.hrc лучше убрать do-end
Это отдельный вопрос. В коде LuaSpell.lua использование этой конструкции мне показалось неоправданным — потому и предлагаю их оттуда удалить.
Ну, это у меня такой стиль выработался. Поэтому и добавил этот блок как outline в lua.hrc. Думаю, можно обсудить это в ветке FarColorer.
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

LuaSpell — проверка орфографии в редакторе

Post by HaRT »

Aidar wrote: если есть или будет реализована поддержка поиска назад в регулярных выражениях
Не знаю насчёт FAR API, но в пользовательском интерфейсе Фара поиск назад по регулярному выражению вполне себе работает.
Aidar wrote: это у меня такой стиль выработался
Не смею настаивать на изменении Вами выработанного стиля, однако считаю, что исключение этой конструкции (а также нескольких не добавляющих ясности идентификаторов) только упростило код LuaSpell.lua.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

LuaSpell — проверка орфографии в редакторе

Post by Aidar »

HaRT wrote:... Я использую WordList в качестве положительного словаря...
У меня всё нормально: обе строки неподкрашенные. Создал файл словаря в кодировке UTF-8 без BOM.
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

LuaSpell — проверка орфографии в редакторе

Post by HaRT »

Aidar wrote: в кодировке UTF-8 без BOM
Да, если без BOM, то всё в порядке.
Сложно ли сделать, чтобы BOM не влиял столь пагубно? Ведь BOM — это совершенно штатная, полезная и очень распространённая вещь…
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

LuaSpell — проверка орфографии в редакторе

Post by Aidar »

HaRT wrote:...Сложно ли сделать, чтобы BOM не влиял столь пагубно? Ведь BOM — это совершенно штатная, полезная и очень распространённая вещь…
В modules\userdict.lua сделайте
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

LuaSpell — проверка орфографии в редакторе

Post by John Doe »

Aidar wrote: 4. Предполагаю реализовать добавление в меню плагинов, чтобы можно было назначать макросы обычным образом.
Вместо пункта в меню плагинов можно читать комбинации из файла конфигурации, или из БД.
Или сделать скрипт модулем, и в макросах обращаться через require
Post Reply

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