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 »

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: 9239
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 94 times
Been thanked: 197 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. index 83e8856..21c08da 100644
  3. --- a/scripts/LuaSpell/LuaSpell.lua
  4. +++ b/scripts/LuaSpell/LuaSpell.lua
  5. @@ -1,4 +1,5 @@
  6. ---[[ LuaSpell ]]--
  7. +-- Based on http:// forum.farmanager.com/viewtopic.php?p=118520#p118520
  8. +--[[ LuaSpell ]]--
  9.  
  10.  ----------------------------------------
  11.  --[[ description:
  12. @@ -33,11 +34,11 @@
  13.       По умолчанию макрос настроен на словари
  14.       ru_RU_yo и en_US (нужны файлы aff и dic).
  15.    3. Конфигурация:
  16. -     файл конфигурации макроса — ~%FARPROFILE%\data\macros\LuaSpell.cfg~.
  17. +     файл конфигурации макроса — ~%FARPROFILE%\data\macros\LuaSpell.cfg.lua~.
  18.  --]]
  19.  --------------------------------------------------------------------------------
  20.  
  21. -----------------------------------------
  22. +--[[--------------------------------------
  23.  local useprofiler = false
  24.  --local useprofiler = true
  25.  
  26. @@ -46,12 +47,7 @@ if useprofiler then
  27.    require "profiler" -- Lua Profiler
  28.    actprofiler = false
  29.  end
  30. -
  31. -----------------------------------------
  32. -local tostring = tostring
  33. -
  34. -----------------------------------------
  35. -local regex = regex
  36. +]]----------------------------------------
  37.  
  38.  local F = far.Flags
  39.  local Flag4BIT = bit64.bor(F.FCF_FG_4BIT, F.FCF_BG_4BIT)
  40. @@ -78,7 +74,7 @@ local function ExpandEnv (s)
  41.  end
  42.  
  43.  ---------------------------------------- config
  44. -local CfgNameFmt = [[%%FARPROFILE%%\%s\%s\%s.cfg]]
  45. +local CfgNameFmt = [[%%FARPROFILE%%\%s\%s\%s.cfg.lua]]
  46.  local CfgName = CfgNameFmt:format(win.GetEnv("FARUSERDATADIR") or "data",
  47.                                    "macros", unit.ScriptName)
  48.  local DictionaryPath = [[%FARPROFILE%\Dictionaries\]]
  49. @@ -99,17 +95,19 @@ local DefCfgData = {
  50.  
  51.    CharsSet = CharsSet,                  -- Множество допустимых символов
  52.                                          -- для проверки на наличие слова:
  53. -  InnerSet = CharsSet.."$",             -- - в конце строке
  54. -  StartSet = "^"..CharsSet,             -- - в начале строке
  55. +  InnerSet = CharsSet.."$",             -- - в конце строки
  56. +  StartSet = "^"..CharsSet,             -- - в начале строки
  57.    CheckSet = "/\\b"..CharsSet.."\\b/",  -- - в середине строки
  58.    BoundSet = "\\S*",                    -- - с граничными символами
  59.  
  60.    ColorPrio = 199,                      -- Приоритет раскрашивания
  61.  
  62. +  ShowEmptyList = false,                -- Показывать ли пустой список предположений
  63.    MacroKeys = {                         -- Клавиши для макросов:
  64.      CheckSpell  = "CtrlF12",            -- - проверка текущего слова
  65. -    Misspelling = "ShiftF12",           -- - переход на следующее ошибочное слово
  66. -    SwitchCheck = "CtrlShiftF12",       -- - переключение подсветки ошибочных слов
  67. +    NextMisspelling = "ShiftF12",       -- - переход на следующее ошибочное слово
  68. +    PrevMisspelling = "LCtrlShiftF12",  -- - переход на предыдущее ошибочное слово
  69. +    SwitchCheck = "LCtrlLAltF12",       -- - переключение подсветки ошибочных слов
  70.      UnloadSpell = "LCtrlLAltShiftF12",  -- - завершение проверки (выгрузка)
  71.    },
  72.  
  73. @@ -138,7 +136,7 @@ local DefCfgData = {
  74.                                          -- при обнаружении слова в словаре
  75.    },
  76.    { -- Word list
  77. -    Type = "WordList",                  -- Тип                                
  78. +    Type = "WordList",                  -- Тип
  79.      WordType = "disabled",              -- Тип слов: запрещённый
  80.      StrToPath = false,
  81.      path = UserDictPath,
  82. @@ -212,6 +210,8 @@ local function CreateMain (ArgData)
  83.    end
  84.    if not config then config = {} end
  85.  
  86. +  local _,_ = ArgData,serror
  87. +
  88.    setmetatable(config, { __index = DefCfgData })
  89.  
  90.    local n = #config
  91. @@ -261,24 +261,17 @@ function unit.StrToStr (s)
  92.    return s
  93.  end ---- StrToStr
  94.  
  95. -do
  96. -  local AnsiCP
  97. -  local WCtoMB = win.WideCharToMultiByte
  98. -  local U8toU16 = win.Utf8ToUtf16
  99. -
  100.  function unit.StrToAnsi (s)
  101. -  if not AnsiCP then AnsiCP = win.GetACP() end
  102. -  return WCtoMB(U8toU16(s), AnsiCP)
  103. +  return win.WideCharToMultiByte(win.Utf8ToUtf16(s), win.GetACP())
  104.  end ---- StrToAnsi
  105.  
  106. -end -- do
  107.  ---------------------------------------- Hunspell
  108.  local hunspell = require "hunspell"
  109.  
  110. -local function NewHunspell (k, v)
  111. +local function NewHunspell (k_, v_)
  112.    if not hunspell then return false end
  113. -  
  114. -  local v = v
  115. +
  116. +  local _,v = k_,v_
  117.    --local handle, text = hunspell.new(v.affpath, v.dicpath, nil)
  118.    local handle, text = hunspell.new(v.StrToPath(v.affpath),
  119.                                      v.StrToPath(v.dicpath), nil)
  120. @@ -290,8 +283,8 @@ local function NewHunspell (k, v)
  121.    return false
  122.  end -- NewHunspell
  123.  
  124. -function unit.InitHunspell (k)
  125. -  local k = k
  126. +function unit.InitHunspell (k_)
  127. +  local k = k_
  128.    local v = config[k]
  129.    local Path = v.path or config.Path
  130.  
  131. @@ -323,10 +316,10 @@ end ---- InitHunspell
  132.  ---------------------------------------- UserDict
  133.  local userdict = require "userdict"
  134.  
  135. -local function NewUserDict (k, v)
  136. +local function NewUserDict (k_, v_)
  137.    if not userdict then return false end
  138. -  
  139. -  local v = v
  140. +
  141. +  local _,v = k_,v_
  142.    --local handle, text = hunspell.new(v.affpath, v.dicpath, nil)
  143.    local handle, text = userdict.new(v)
  144.    if handle then return handle end
  145. @@ -337,8 +330,8 @@ local function NewUserDict (k, v)
  146.    return false
  147.  end -- NewUserDict
  148.  
  149. -function unit.InitUserDict (k)
  150. -  local k = k
  151. +function unit.InitUserDict (k_)
  152. +  local k = k_
  153.    local v = config[k]
  154.    local Path = v.path or config.Path
  155.  
  156. @@ -373,8 +366,6 @@ end ---- InitUserDict
  157.  
  158.  ---------------------------------------- Dictionary
  159.  
  160. -local tostring = tostring
  161. -
  162.  function unit.InitDictionary (k)
  163.    local v = config[k]
  164.    --local Path = config.Path
  165. @@ -430,8 +421,8 @@ function unit.FreeDictionary (k)
  166.    end
  167.  end ---- FreeDictionary
  168.  
  169. -function unit.Add_Dics (k)
  170. -  local k = k
  171. +function unit.Add_Dics (k_)
  172. +  local k = k_
  173.    local v = config[k]
  174.  
  175.    local h = v.handle
  176. @@ -459,12 +450,12 @@ function unit.Add_Dics (k)
  177.    end
  178.  end -- Add_Dics
  179.  
  180. -function unit.Add_DirDics (k, path, mask, match, n)
  181. +function unit.Add_DirDics (k_, path_, mask, match, n)
  182.    if not mask then
  183.      return
  184.    end
  185.  
  186. -  local k = k
  187. +  local k = k_
  188.    local v = config[k]
  189.  
  190.    local h = v.handle
  191. @@ -473,7 +464,7 @@ function unit.Add_DirDics (k, path, mask, match, n)
  192.      return
  193.    end
  194.  
  195. -  local path = ExpandEnv(path or v.path or config.Path)
  196. +  local path = ExpandEnv(path_ or v.path or config.Path)
  197.    return unit.Add_ByMask(path, mask, match, h, "", n)
  198.  end ---- Add_DirDics
  199.  
  200. @@ -489,7 +480,7 @@ function unit.Add_ByMask (path, mask, match, handle, key, n)
  201.      return
  202.    end
  203.  
  204. -  local t = {}
  205. +  --local t = {}
  206.    local dics = {}
  207.  
  208.    local function HandleFile (item, fullname)
  209. @@ -509,7 +500,7 @@ function unit.Add_ByMask (path, mask, match, handle, key, n)
  210.    far.RecursiveSearch(path:gsub("\\$", ""), "*", HandleFile, F.FRS_SCANSYMLINK)
  211.    --far.Show(unpack(t))
  212.  
  213. -  for i, dic in ipairs(dics) do
  214. +  for _,dic in ipairs(dics) do
  215.      --t[#t + 1] = dic.FullName
  216.      h:add_dic(dic.FullName, key, n)
  217.    end
  218. @@ -517,9 +508,8 @@ function unit.Add_ByMask (path, mask, match, handle, key, n)
  219.  end ---- Add_ByMask
  220.  
  221.  ---------------------------------------- Work
  222. -do
  223. -  local InitDictionary = unit.InitDictionary
  224. -  local FreeDictionary = unit.FreeDictionary
  225. +local InitDictionary = unit.InitDictionary
  226. +local FreeDictionary = unit.FreeDictionary
  227.  
  228.  function unit.Init ()
  229.    if unit.Enabled then return end
  230. @@ -541,7 +531,6 @@ function unit.Free ()
  231.    unit.Enabled = false
  232.  end ---- Free
  233.  
  234. -end
  235.  ---------------------------------------- Find
  236.  -- from LF context (context\scripts\detectType.lua):
  237.  
  238. @@ -602,33 +591,28 @@ local function ShowMenu (strings, wordLen)
  239.      y = r + 2
  240.      h = info.WindowSizeY - y + 1 - menuOverheadHeight
  241.      h = math.min(h, #strings)
  242. -
  243.    else
  244.      -- сверху
  245.      y = r - #strings - 1
  246.      if y < 1 then y = 1 end
  247.      h = r - y - 1
  248. -
  249.    end
  250.  
  251.    -- fix menu width
  252.    if (x + w + menuOverheadWidth) > info.WindowSizeX then
  253.      w = info.WindowSizeX - x - menuOverheadWidth
  254. -
  255.    end
  256. +  w = w + 1  -- чтобы самые длинные слова не упирались правым краем в рамку, будто усечённые
  257.  
  258.    local Form = {
  259.      { "DI_LISTBOX", 0, 0, w + 3, h + 1, Items, 0, 0, 0, "" }
  260.    }
  261.  
  262. -  local function DlgProc (dlg, msg, param1, param2)
  263. -  end -- DlgProc
  264. -
  265.    local hDlg = far.DialogInit(config.PopupGuid,
  266.                                x, y,
  267.                                x + w + 3,
  268.                                y + h + 1,
  269. -                              nil, Form, 0, DlgProc)
  270. +                              nil, Form)
  271.    local Index = far.DialogRun(hDlg) > 0 and
  272.                  far.SendDlgMessage(hDlg, F.DM_LISTGETCURPOS, 1).SelectPos or nil
  273.    far.DialogFree(hDlg)
  274. @@ -713,12 +697,12 @@ function unit.CheckSpell ()
  275.          if h.suggest and
  276.             (not h.spell or not h:spell(w)) then
  277.            local items = h:suggest(w)
  278. -          if #items > 0 then
  279. +          if config.ShowEmptyList or #items > 0 then
  280.              local Index = ShowMenu(items, wLen)
  281.              if Index then
  282. -              local s = line:sub(1, spos - 1)..
  283. -                        items[Index]..
  284. -                        line:sub(spos + wLen)
  285. +              s = line:sub(1, spos - 1)..
  286. +                  items[Index]..
  287. +                  line:sub(spos + wLen)
  288.                EditorSetLine(-1, 0, s, eol)
  289.              end
  290.            end
  291. @@ -761,29 +745,17 @@ local function RemoveColors (id)
  292.  end -- RemoveColors
  293.  unit.RemoveColors = RemoveColors
  294.  
  295. -do
  296. -  local Far_WinCount    = F.ACTL_GETWINDOWCOUNT
  297. -  local Far_WinInfo     = F.ACTL_GETWINDOWINFO
  298. -  local WinType_Editor  = F.WTYPE_EDITOR
  299. -
  300.  function unit.RemoveAllColors ()
  301. -  local Count = far.AdvControl(Far_WinCount, 0, 0)
  302. +  local Count = far.AdvControl(F.ACTL_GETWINDOWCOUNT, 0, 0)
  303.    for i = 1, Count do
  304. -    local Info = far.AdvControl(Far_WinInfo, i, 0)
  305. -    if Info and Info.Type == WinType_Editor then
  306. +    local Info = far.AdvControl(F.ACTL_GETWINDOWINFO, i, 0)
  307. +    if Info and Info.Type == F.WTYPE_EDITOR then
  308.        RemoveColors(Info.Id)
  309.      end
  310.    end
  311.  end ---- RemoveAllColors
  312.  
  313. -end -- do
  314. -
  315. -do
  316. -  local AddColor = editor.AddColor
  317. -  local Mark_Current = F.ECF_TABMARKCURRENT
  318. -
  319. -function unit.CheckSpellText (Info, action)
  320. -  local Info = Info
  321. +function unit.CheckSpellText (Info, action_)
  322.    if not Info then return end
  323.  
  324.    unit.Init()
  325. @@ -802,7 +774,7 @@ function unit.CheckSpellText (Info, action)
  326.      v.masked = not v.masks or (checkValueOver(fname, v.masks) and true)
  327.    end
  328.  
  329. -  local action = action or "all"
  330. +  local action = action_ or "all"
  331.    local data
  332.    if action == "all" then
  333.      data = RemoveColors(id)
  334. @@ -859,7 +831,7 @@ function unit.CheckSpellText (Info, action)
  335.                  brim = line:sub(bpos, bend)
  336.                end
  337.                if brim ~= "" then
  338. -                local word = v.word
  339. +                word = v.word
  340.                  v.word = word..brim
  341.                  matched = CheckMatch(v, fname, line, spos, l)
  342.                  v.word = word
  343. @@ -872,12 +844,11 @@ function unit.CheckSpellText (Info, action)
  344.                if isError and brim ~= "" then
  345.                  isError = not h:spell(v.word..brim)
  346.                end
  347. -              
  348. +
  349.                if isError then
  350.                  if action == "all" then
  351.                    if v.color then
  352. -                    AddColor(id, l, spos, send,
  353. -                             Mark_Current, v.color, prio, guid)
  354. +                    editor.AddColor(id, l, spos, send, F.ECF_TABMARKCURRENT, v.color, prio, guid)
  355.                    end
  356.  
  357.                  elseif action == "next" then
  358. @@ -907,11 +878,12 @@ function unit.CheckSpellText (Info, action)
  359.    return true
  360.  end ---- CheckSpellText
  361.  
  362. -end -- do
  363. -
  364. -function unit.Misspelling ()
  365. +function unit.NextMisspelling ()
  366.    return unit.CheckSpellText(EditorGetInfo(), "next")
  367. -end ---- Misspelling
  368. +end
  369. +function unit.PrevMisspelling ()
  370. +  return unit.CheckSpellText(EditorGetInfo(), "prior")
  371. +end
  372.  
  373.  function unit.SwitchCheck ()
  374.    --far.Show"SwitchCheck"
  375. @@ -932,14 +904,6 @@ end
  376.  ---------------------------------------- Events
  377.  local CheckSpellText = unit.CheckSpellText
  378.  
  379. -do
  380. -  local EE_READ     = F.EE_READ
  381. -  --local EE_SAVE     = F.EE_SAVE
  382. -  local EE_CLOSE    = F.EE_CLOSE
  383. -  local EE_GOTFOCUS = F.EE_GOTFOCUS
  384. -  --local EE_CHANGE   = F.EE_CHANGE
  385. -  local EE_REDRAW   = F.EE_REDRAW
  386. -
  387.  local function reloadEditorConfig (id, kind) --| editors
  388.    --logShow({ "reset", editor.GetInfo() })
  389.  
  390. @@ -965,19 +929,19 @@ Event {
  391.    group = "EditorEvent",
  392.    description = "Check spell all",
  393.  
  394. -  action = function (id, event, param)
  395. -    local eid = id
  396. -    if event == EE_READ then
  397. +  action = function (eid, event, param)
  398. +    local _ = param
  399. +    if event == F.EE_READ then
  400.        reloadEditorConfig(eid, 'load')
  401.  
  402. -    elseif event == EE_GOTFOCUS then
  403. +    elseif event == F.EE_GOTFOCUS then
  404.        reloadEditorConfig(eid, 'focus')
  405. -    
  406. -    elseif event == EE_CLOSE then
  407. +
  408. +    elseif event == F.EE_CLOSE then
  409.        editors.current, editors[eid] = nil, nil
  410.        --if useprofiler and actprofiler then profiler.stop(); actprofiler = false end
  411.  
  412. -    elseif event == EE_REDRAW then
  413. +    elseif event == F.EE_REDRAW then
  414.        if config.Enabled then
  415.          CheckSpellText(EditorGetInfo(), "all")
  416.        end
  417. @@ -993,7 +957,6 @@ Event {
  418.    action = unit.UnloadSpell,
  419.  } -- Event "ExitFAR"
  420.  
  421. -end -- do
  422.  ---------------------------------------- Macros
  423.  if config.MacroKeys.CheckSpell then
  424.  Macro {
  425. @@ -1013,12 +976,21 @@ Macro {
  426.  } ---
  427.  end
  428.  
  429. -if config.MacroKeys.Misspelling then
  430. +if config.MacroKeys.NextMisspelling then
  431.  Macro {
  432.    area = "Editor",
  433. -  key = config.MacroKeys.Misspelling,
  434. +  key = config.MacroKeys.NextMisspelling,
  435.    description = "LuaSpell: Next misspelling",
  436. -  action = unit.Misspelling,
  437. +  action = unit.NextMisspelling,
  438. +} ---
  439. +end
  440. +
  441. +if config.MacroKeys.PrevMisspelling then
  442. +Macro {
  443. +  area = "Editor",
  444. +  key = config.MacroKeys.PrevMisspelling,
  445. +  description = "LuaSpell: Previous misspelling",
  446. +  action = unit.PrevMisspelling,
  447.  } ---
  448.  end
  449.  
  450. @@ -1030,4 +1002,3 @@ Macro {
  451.    action = unit.UnloadSpell,
  452.  } ---
  453.  end
  454. ---------------------------------------------------------------------------------
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
HaRT
Moderator
Posts: 9239
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 94 times
Been thanked: 197 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: 9239
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 94 times
Been thanked: 197 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: 9239
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 94 times
Been thanked: 197 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: 9239
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 94 times
Been thanked: 197 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: 9239
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 94 times
Been thanked: 197 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: 12602
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 260 times

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

Post by John Doe »

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

Post Reply

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