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

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

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

Post by Aidar » Thu 16 Jun, 2016 16:32

Latest post of the previous page:

Wave wrote:Интересно, получится ли найти Hunspellx86.dll, которая была бы совместима с обоими макросами проверки и с плагином...
Можно поступить так: в modules\hunspell.luaизменяете строку

Code: Select all

local lib_name = "hunspell"..(win.GetEnv("PROCESSOR_ARCHITECTURE"):gsub("AMD64","x64"))
например, на

Code: Select all

local lib_name = "hunspell_"..(win.GetEnv("PROCESSOR_ARCHITECTURE"):gsub("AMD64","x64"))
и переименовываете Hunspellx86.dll, нужный для LuaSpell, на Hunspell_x86.dll.
Но изменять строку придётся каждый раз при обновлении макроса.

User avatar
HaRT
Moderator
Posts: 8109
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 103 times

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

Post by HaRT » Thu 16 Jun, 2016 16:48

Wave wrote: с обоими макросами проверки и с плагином
Кстати, про какой плагин идёт речь? Что-то я не нашёл…
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
John Doe
Бюрократ
Posts: 11394
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Thu 16 Jun, 2016 17:02

viewtopic.php?f=11&t=7407
На плагринге нет

User avatar
Aidar
Posts: 533
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 6 times
Contact:

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

Post by Aidar » Thu 16 Jun, 2016 18:47

Wave wrote:...Скрипты подсвечивают, но не умеют прыгать к следующему ошибочному слову...
Добавил возможность перехода на следующее ошибочное слово.
В %FARPROFILE%\data\macros\LuaSpell.cfg добавьте строку с названием клавиши для нового действия, чтобы получилось
LuaSpell-3.2.1.0.7z
(11.99 KiB) Downloaded 32 times

User avatar
Wave
Posts: 1721
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 2 times
Been thanked: 10 times

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

Post by Wave » Thu 16 Jun, 2016 19:41

Aidar wrote:Можно поступить так: в modules\hunspell.lua изменяете строку
Но изменять строку придётся каждый раз при обновлении макроса.
Спасибо! Изменять каждый раз — не самая большая проблема — у меня профиль с макросами и всем таким лежит в Git-репозитории.
Aidar wrote:Добавил возможность перехода на следующее ошибочное слово.
В %FARPROFILE%\data\macros\LuaSpell.cfg добавьте строку с названием клавиши для нового действия, чтобы получилось
Опс! Спасибо!
Пользуюсь ФАРом больше 15 лет © собирательный.

User avatar
Aidar
Posts: 533
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 6 times
Contact:

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

Post by Aidar » Sat 18 Jun, 2016 09:27

Добавил поддержку подключения дополнительных пользовательских словарей.

Макрос выложил на PlugRing.

P.S. Аналогично можно подключать дополнительные словари Hunspell (но пока не проверял, работает ли это).

User avatar
HaRT
Moderator
Posts: 8109
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 103 times

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

Post by HaRT » Sat 18 Jun, 2016 12:44

Aidar wrote:Добавил поддержку подключения дополнительных пользовательских словарей.
Спасибо. А что значит дополнительных? В чём различие "User_Dict" и "Dict1", "Dict2"? Как они соотносятся?
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
Aidar
Posts: 533
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 6 times
Contact:

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

Post by Aidar » Sat 18 Jun, 2016 14:58

В случае UserDict они ничем не отличаются. В LibreOffice есть возможность подключать несколько словарей - для разных языков и разной тематики. Вместо подключения их в LuaSpell по одному можно использовать новый функционал.
Ну и проверка слова будет идти сразу по единой таблице слов, а не по нескольким (для каждого словаря).

В библиотеке Hunspell есть функция добавления дополнительного словаря. Скорее всего, эта возможность используется также для подключения специализированных словарей помимо основного словаря.

User avatar
HaRT
Moderator
Posts: 8109
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 103 times

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

Post by HaRT » Mon 20 Jun, 2016 17:14

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

User avatar
HaRT
Moderator
Posts: 8109
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 103 times

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

Post by HaRT » Mon 20 Jun, 2016 18:45

@Aidar
Со второй попытки пользовательский словарь прикрутить удалось — спасибо!
Неочевидным моментом оказалось требуемое расположение файла LuaSpell.cfg. Сложно ли сделать, чтобы он искался также прямо в %FARPROFILE% рядом с FarMenu.ini?
И ещё желательно либо включить в документацию описание формата файлов UserDict (кодировка, заголовок, сортировка?), либо привести ссылку на имеющуюся. В частности, у меня работает и с lang: <none>.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
Aidar
Posts: 533
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 6 times
Contact:

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

Post by Aidar » Mon 20 Jun, 2016 22:01

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: 533
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 6 times
Contact:

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

Post by Aidar » Mon 20 Jun, 2016 22:18

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: 533
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 6 times
Contact:

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

Post by Aidar » Thu 23 Jun, 2016 21:45

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: 8109
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 103 times

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

Post by HaRT » Tue 28 Jun, 2016 19:08

Предлагаю такие улучшения/изменения для версии 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: 8109
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 103 times

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

Post by HaRT » Tue 28 Jun, 2016 19:12

Aidar wrote: Добавил поддержку словарей в виде обычного списка слов (добавлен тип "WordList").
Спасибо!
Почему-то слово из первой строки не подхватывается — проще всего это выявить, запустив проверку в самом таком словаре. Ошибка?
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
Aidar
Posts: 533
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 6 times
Contact:

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

Post by Aidar » Tue 28 Jun, 2016 19:40

HaRT wrote:1. Файл конфигурации переименован в LuaSpell.cfg.lua, чтобы в нём ожидаемо работала подсветка синтаксиса, luacheck и вообще всё, что ориентируется на тип файла.
Добавьте в prototype name="lua" .
Постараюсь выложить используемые мной схемы для FarColorer. Старая версия схем здесь [от 2013-04-26].

User avatar
Aidar
Posts: 533
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 6 times
Contact:

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

Post by Aidar » Tue 28 Jun, 2016 19:42

HaRT wrote:...Почему-то слово из первой строки не подхватывается — проще всего это выявить, запустив проверку в самом таком словаре. Ошибка?
Использую WordList-словарь Stop_List из трёх слов: все слова раскрашиваются.
Приложите словарь и файл конфигурации.

Post Reply

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