Выбор кодировки по маске файла
- buniak_a_h
- Posts: 4268
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Выбор кодировки по маске файла
Хочу поделиться удобным (для меня, во всяком случае) скриптом, выбирающим кодировку в редакторе в зависимости от расширения файла. Причина: автоматическое определение не всегда срабатывает (особенно на коротких файлах); в то же время бывают предопределённые случаи. В предлагаемом скрипте заложено:
1. *.lua,*.fml,*.fmlua,*.lua.*,*.fb2 - всегда 65001
2. *.bat,*.cmd,*.prg,*.ch (программы на Харборе, командные файлы) - всегда 866
Расширять можно и дальше.
Условие выполнения скрипта: для вьюера требуется, чтобы нужная кодировка была видна в меню выбора кодировок. Т.е. это должна быть либо одна из основных (866, 1251), либо Unicode (65001, 1200, 1201), либо помеченная как Favorite, либо должны быть видны ВСЕ кодировки (переключение по CtrlH)
В версии 5 убрана зависимость от таблицы _G.BAX . Исправлены неточности, оптимизирован текст (спасибо John Doe). Соответственно, исправлена ошибка, описанная citRiks.
Модуль прилагается, но скрипт должен работать с практически любой версией этого модуля (если кто уже ставил). В модуль добавлен номер версии - на будущее для контроля совместимости.
Версия 1.1.6:
1. В начальную конфигурацию добавлены некоторые расширения (напр., *.moon)
2. require на "свалку" BaxUtils заменен на require DialogTools. Соответственно в архив вложены два "специализированных" модуля вместо одной кучи всего, что я написал
1. *.lua,*.fml,*.fmlua,*.lua.*,*.fb2 - всегда 65001
2. *.bat,*.cmd,*.prg,*.ch (программы на Харборе, командные файлы) - всегда 866
Расширять можно и дальше.
Условие выполнения скрипта: для вьюера требуется, чтобы нужная кодировка была видна в меню выбора кодировок. Т.е. это должна быть либо одна из основных (866, 1251), либо Unicode (65001, 1200, 1201), либо помеченная как Favorite, либо должны быть видны ВСЕ кодировки (переключение по CtrlH)
В версии 5 убрана зависимость от таблицы _G.BAX . Исправлены неточности, оптимизирован текст (спасибо John Doe). Соответственно, исправлена ошибка, описанная citRiks.
Модуль прилагается, но скрипт должен работать с практически любой версией этого модуля (если кто уже ставил). В модуль добавлен номер версии - на будущее для контроля совместимости.
Версия 1.1.6:
1. В начальную конфигурацию добавлены некоторые расширения (напр., *.moon)
2. require на "свалку" BaxUtils заменен на require DialogTools. Соответственно в архив вложены два "специализированных" модуля вместо одной кучи всего, что я написал
Last edited by buniak_a_h on Fri 15 Jan, 2021 07:54, edited 8 times in total.
- buniak_a_h
- Posts: 4268
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Выбор кодировки по маске файла
Latest post of the previous page:
Делал в основном для связи расширения с кодовой страницей. Остальное "родилось" по мере замечаний в этом обсуждении
- Как перспектива для добавления во вьюере параметров для установки WrapMode (Wrap/WWrap/Unwrap) и ViewMode (Text/Hex/Dump)
- Когда делалось, установка кодовой страницы вьюера была "экспериментальной" (собственно, она и появилась по результатам обсуждения в этой теме). Поэтому я просто побоялся включать перманентно (тем более, что там используется
far.MacroPost
, а это у меня, например, не всегда работает.
Жаль, у меня не повторяется. Есть подозрение, что проблема в составлении списка доступных кодовых страниц. Попробуйте заменить строки, начиная с 55-й по 7-ю (с
Keys"ShiftF4 AltC CtrlShiftC"
поKeys"Esc Esc"
) на следующее:Если не влом...Code: Select all
for _,v in ipairs(win.EnumSystemCodePages()) do tin(CpList, {text=v; Text=v;}) end
Выбор кодировки по маске файла
В принципе, годится, как аргумент. Но, на мой взгляд, правильнее, всё же, было бы всё же не делать две настройки кодовой страницы для одного и того же файлаbuniak_a_h wrote: ↑Tue 15 Jan, 2019 12:49 [*]
- Как перспектива для добавления во вьюере параметров для установки WrapMode (Wrap/WWrap/Unwrap) и ViewMode (Text/Hex/Dump)
Странно.buniak_a_h wrote: ↑Tue 15 Jan, 2019 12:49 [*]Когда делалось, установка кодовой страницы вьюера была "экспериментальной" (собственно, она и появилась по результатам обсуждения в этой теме). Поэтому я просто побоялся включать перманентно (тем более, что там используетсяfar.MacroPost
, а это у меня, например, не всегда работает.
far.MacroPost
у меня работает нормально всегда и везде, где должен.
Помогло.buniak_a_h wrote: ↑Tue 15 Jan, 2019 12:49 [/list][*]Жаль, у меня не повторяется. Есть подозрение, что проблема в составлении списка доступных кодовых страниц. Попробуйте заменить строки, начиная с 55-й по 7-ю (сKeys"ShiftF4 AltC CtrlShiftC"
поKeys"Esc Esc"
) на следующее:Если не влом...[/list]Code: Select all
for _,v in ipairs(win.EnumSystemCodePages()) do tin(CpList, {text=v; Text=v;}) end
P. S. Настройки по умолчанию - в двух экземплярах в двух местах!!! Это уже за гранью Добра и Зла!
- buniak_a_h
- Posts: 4268
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Выбор кодировки по маске файла
Да, ошибка, видимо, была в другом...
Спасибо. Осталось от старого. Забыл перетащить загрузку Settings в начало файла.
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Выбор кодировки по маске файла
Обратите внимание на существование
mf.postmacro
.Пример тут: http://forum.farmanager.com/viewtopic.p ... 94#p120694
win.EnumSystemCodePages
+ win.GetCPInfo
?
Last edited by John Doe on Tue 03 Dec, 2019 13:35, edited 2 times in total.
- buniak_a_h
- Posts: 4268
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Выбор кодировки по маске файла
Я знаю про mf.postmacro . Вроде, в данном случае нет разницы: формируется последовательность клавиш и вызывается либоJohn Doe wrote: ↑Tue 03 Dec, 2019 12:34Обратите внимание на существованиеmf.postmacro
.
Пример тут: http://forum.farmanager.com/viewtopic.p ... 94#p120694
far.MacroPost
, либо mf.postmacro(Keys, <та_же_последовательность>). Мне казалось, первый вариант короче.1. Всё это было написано когда в описании editor.SetParam(…, F.ESPT_CODEPAGE … ) было указано, что выбрать можно было только OEM или Ansi. тех пор описание (а, возможно, и функция) изменились, и там стало возможным указывать именно номер котовой страницы.
На самом деле очень сильно мешает отсутствие viewer.SetParam (аналогично editor.SetParam). приходится извращаться. В обсуждении встречал (и, вроде, кто-то писал на мантис), но руки у авторов не доходят. А жаль …
win.EnumSystemCodePages
- знал, но нужно было "человеческое" представление кодовых страниц. Про win.GetCPInfo
, конечно, не знал. Посмотрю.- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Выбор кодировки по маске файла
far.MacroPost - формировать строку из шаблона, пропускать её через Си-апи, принимать обратно в луамакро, превращать из строки в функцию.buniak_a_h wrote: ↑Tue 03 Dec, 2019 16:24 Я знаю про mf.postmacro . Вроде, в данном случае нет разницы: формируется последовательность клавиш и вызывается либо far.MacroPost, либо mf.postmacro(Keys, <та_же_последовательность>).
mf.postmacro - сразу функция.
Code: Select all
local function PostMacroStr(cp)
Keys((Area.Viewer or Area.QView) and "Tab","ShiftF8")
Keys(Menu.Select(cp,1) > 0 and "Enter" or "Esc")
end
--mf.postmacro(PostMacroStr,cp)
https://api.farmanager.com/ru/structure ... meter.htmlbuniak_a_h wrote: ↑Tue 03 Dec, 2019 16:24 Всё это было написано когда в описании editor.SetParam(…, F.ESPT_CODEPAGE … ) было указано, что выбрать можно было только OEM или Ansi.
Последний раз описание 5 лет назад менялось.
Last edited by John Doe on Tue 03 Dec, 2019 16:56, edited 1 time in total.
- buniak_a_h
- Posts: 4268
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Выбор кодировки по маске файла
Пишет, что нет поля _G.BAX.BaxUtils , что наводит на мысль о несоответствии модулей и макроса.
Можете убрать сам макрос, оставить только модули и после перезагрузки макросов позырить указанное поле?
Хотя я затеял глобальную переделку, чтоб не рассчитывать на _G.BAX … Ну и нормальную систему проверки соответствия версий модулей и скриптов.
На самом деле, рас интерес появился, я несколько переделаю и оптимизирую. У меня давно уже всё изменилось; хотя сам я пользуюсь, но не ожидал, что кто-нить будет смотреть… Т.е. сначала ожидал, а потом никто не скачивает, не смотрит … Я и забросил.
Можете убрать сам макрос, оставить только модули и после перезагрузки макросов позырить указанное поле?
Хотя я затеял глобальную переделку, чтоб не рассчитывать на _G.BAX … Ну и нормальную систему проверки соответствия версий модулей и скриптов.
На самом деле, рас интерес появился, я несколько переделаю и оптимизирую. У меня давно уже всё изменилось; хотя сам я пользуюсь, но не ожидал, что кто-нить будет смотреть… Т.е. сначала ожидал, а потом никто не скачивает, не смотрит … Я и забросил.
Last edited by buniak_a_h on Wed 04 Dec, 2019 00:30, edited 1 time in total.
Выбор кодировки по маске файла
А как именно можно корректно посмотреть наличие данного поля?buniak_a_h wrote: ↑Wed 04 Dec, 2019 00:25 Можете убрать сам макрос, оставить только модули и после перезагрузки макросов позырить указанное поле?
Причём, прилагаемые к сабжевому скрипту модули я намеренно не устанавливал. Поскольку уже установлены одноимённые значительно более поздние, приложенные Вами к другим Вашим скриптам.
- buniak_a_h
- Posts: 4268
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Выбор кодировки по маске файла
Если нету tableview, то можно просто набрать
lua:=_G.BAX (должно быть table… )
lua:=_G.BAX.BaxUtils (тоже д.б. таблица)
lua:=_G.BAX (должно быть table… )
lua:=_G.BAX.BaxUtils (тоже д.б. таблица)
- buniak_a_h
- Posts: 4268
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
- buniak_a_h
- Posts: 4268
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Выбор кодировки по маске файла
Ну да... Правда, обратного переключения нету. Но - спасибо. Давно писалось …
Я не помню, где видел, но в описании этой функции такое было (ну не сам же я придумал!). Я даже писал куда-то, что логично было бы не только ANSI и OEM, а также "умолчательное" и "автоматическое" значения указывать, а любой номер кодовой страницы. Было такое. Искать не буду.John Doe wrote: ↑Tue 03 Dec, 2019 16:51https://api.farmanager.com/ru/structure ... meter.htmlbuniak_a_h wrote: ↑Tue 03 Dec, 2019 16:24 Всё это было написано когда в описании editor.SetParam(…, F.ESPT_CODEPAGE … ) было указано, что выбрать можно было только OEM или Ansi.
Последний раз описание 5 лет назад менялось.
- buniak_a_h
- Posts: 4268
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Выбор кодировки по маске файла
Получилось. Спасибо.
При наличии скрипта новый lua-файл сохраняется в нужной кодировке, но без необходимой метки BOM.
Поэтому после строки 245
Code: Select all
editor.SetParam(nil, F.ESPT_CODEPAGE, v.Cp)
Code: Select all
editor.SetParam(nil, "ESPT_SETBOM", "TRUE")
- buniak_a_h
- Posts: 4268
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Выбор кодировки по маске файла
Я в курсе Делалось специально. Единственные файлы, которые я обязательно делаю с BOM - языковые (собственно, там так и написано). Для Lua-файлов BOM не обязателен.
Но Вы правы. Для UTF в настройках надо предусмотреть флаг "с BOM".
Видимо, одной такой строки недостаточно: должна быть привязка к расширению и, во всяком случае, зависеть от CP …
Выбор кодировки по маске файла
buniak_a_h,
Задумавшись над тем, почему такой полезной темой не занимались раньше, нашёл 2 макроса. И возможно Вам они тоже будут интересны (если Вы с ними ещё не знакомы).
shmuz 17:21 17-01-2017 и Shmuel Mon 11 Feb 2013 10:46
Задумавшись над тем, почему такой полезной темой не занимались раньше, нашёл 2 макроса. И возможно Вам они тоже будут интересны (если Вы с ними ещё не знакомы).
shmuz 17:21 17-01-2017 и Shmuel Mon 11 Feb 2013 10:46