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:

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: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

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

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 »

Wave wrote:...Скрипты подсвечивают, но не умеют прыгать к следующему ошибочному слову...
Добавил возможность перехода на следующее ошибочное слово.
В %FARPROFILE%\data\macros\LuaSpell.cfg добавьте строку с названием клавиши для нового действия, чтобы получилось
LuaSpell-3.2.1.0.7z
(11.99 KiB) Downloaded 175 times
User avatar
Wave
Posts: 1885
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 14 times
Been thanked: 26 times

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

Post by Wave »

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

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

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

P.S. Аналогично можно подключать дополнительные словари Hunspell (но пока не проверял, работает ли это).
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:Добавил поддержку подключения дополнительных пользовательских словарей.
Спасибо. А что значит дополнительных? В чём различие "User_Dict" и "Dict1", "Dict2"? Как они соотносятся?
Фар есть инструмент, а не нянька. © 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 »

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

В библиотеке Hunspell есть функция добавления дополнительного словаря. Скорее всего, эта возможность используется также для подключения специализированных словарей помимо основного словаря.
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: Более подробно можно посмотреть в LuaSpell.cfg.user.example.
Если на этот файл (предварительно переименовав его в .lua) натравить LuaCheck, то вылезает , в т.ч. одно, возможно свидетельствующее о логической ошибке.
PS
А в самом LuaSpell.lua этого добра .
Фар есть инструмент, а не нянька. © 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
Со второй попытки пользовательский словарь прикрутить удалось — спасибо!
Неочевидным моментом оказалось требуемое расположение файла LuaSpell.cfg. Сложно ли сделать, чтобы он искался также прямо в %FARPROFILE% рядом с FarMenu.ini?
И ещё желательно либо включить в документацию описание формата файлов UserDict (кодировка, заголовок, сортировка?), либо привести ссылку на имеющуюся. В частности, у меня работает и с lang: <none>.
Фар есть инструмент, а не нянька. © 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: Более подробно можно посмотреть в 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].
Post Reply

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