Выбор кодировки по маске файла

Здесь обсуждается всё, что касается макросов.
buniak_a_h
Posts: 1241
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 79 times
Contact:

Выбор кодировки по маске файла

Post by buniak_a_h » Mon 07 Jan, 2019 10:17

Хочу поделиться удобным (для меня, во всяком случае) скриптом, выбирающим кодировку в редакторе в зависимости от расширения файла. Причина: автоматическое определение не всегда срабатывает (особенно на коротких файлах); в то же время бывают предопределённые случаи. В предлагаемом скрипте заложено:
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.
Модуль прилагается, но скрипт должен работать с практически любой версией этого модуля (если кто уже ставил). В модуль добавлен номер версии - на будущее для контроля совместимости.
modules.7z
Модуль BaxUtils версии 1.1.1
(13.58 KiB) Downloaded 8 times
CodePage.1_1_5.lua.7z
CodePage.lua версии 1.1.5
(3.86 KiB) Downloaded 8 times
Last edited by buniak_a_h on Wed 04 Dec, 2019 06:04, edited 7 times in total.

buniak_a_h
Posts: 1241
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 79 times
Contact:

Выбор кодировки по маске файла

Post by buniak_a_h » Wed 16 Jan, 2019 07:17

Latest post of the previous page:

IgorZ wrote:
Wed 16 Jan, 2019 05:59
far.MacroPost у меня работает нормально всегда и везде, где должен.
Да, ошибка, видимо, была в другом...
IgorZ wrote:
Wed 16 Jan, 2019 05:59
P. S. Настройки по умолчанию - в двух экземплярах в двух местах!!! Это уже за гранью Добра и Зла!
Спасибо. Осталось от старого. Забыл перетащить загрузку Settings в начало файла.

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

Выбор кодировки по маске файла

Post by John Doe » Tue 03 Dec, 2019 12:34

buniak_a_h wrote:
Mon 07 Jan, 2019 10:17
far.MacroPost(PostMacroStr('866'))
Обратите внимание на существование mf.postmacro.

Пример тут: http://forum.farmanager.com/viewtopic.p ... 94#p120694
buniak_a_h wrote:
Mon 07 Jan, 2019 10:17
Составляю список доступных кодировок
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: 1241
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 79 times
Contact:

Выбор кодировки по маске файла

Post by buniak_a_h » Tue 03 Dec, 2019 16:24

John Doe wrote:
Tue 03 Dec, 2019 12:34
buniak_a_h wrote:
Mon 07 Jan, 2019 10:17
far.MacroPost(PostMacroStr('866'))
Обратите внимание на существование mf.postmacro.
Пример тут: http://forum.farmanager.com/viewtopic.p ... 94#p120694
Я знаю про mf.postmacro . Вроде, в данном случае нет разницы: формируется последовательность клавиш и вызывается либо far.MacroPost, либо mf.postmacro(Keys, <та_же_последовательность>). Мне казалось, первый вариант короче.
1. Всё это было написано когда в описании editor.SetParam(…, F.ESPT_CODEPAGE … ) было указано, что выбрать можно было только OEM или Ansi. тех пор описание (а, возможно, и функция) изменились, и там стало возможным указывать именно номер котовой страницы.
На самом деле очень сильно мешает отсутствие viewer.SetParam (аналогично editor.SetParam). приходится извращаться. В обсуждении встречал (и, вроде, кто-то писал на мантис), но руки у авторов не доходят. А жаль …
John Doe wrote:
Tue 03 Dec, 2019 12:34
buniak_a_h wrote:
Mon 07 Jan, 2019 10:17
Составляю список доступных кодировок
win.EnumSystemCodePages + win.GetCPInfo?
win.EnumSystemCodePages - знал, но нужно было "человеческое" представление кодовых страниц. Про win.GetCPInfo, конечно, не знал. Посмотрю.

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

Выбор кодировки по маске файла

Post by John Doe » Tue 03 Dec, 2019 16:51

buniak_a_h wrote:
Tue 03 Dec, 2019 16:24
Я знаю про mf.postmacro . Вроде, в данном случае нет разницы: формируется последовательность клавиш и вызывается либо far.MacroPost, либо mf.postmacro(Keys, <та_же_последовательность>).
far.MacroPost - формировать строку из шаблона, пропускать её через Си-апи, принимать обратно в луамакро, превращать из строки в функцию.
mf.postmacro - сразу функция.
buniak_a_h wrote:
Tue 03 Dec, 2019 16:24
Мне казалось, первый вариант короче.

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)
А я вот вижу что второй короче, раза в 3 наверно?
buniak_a_h wrote:
Tue 03 Dec, 2019 16:24
Всё это было написано когда в описании editor.SetParam(…, F.ESPT_CODEPAGE … ) было указано, что выбрать можно было только OEM или Ansi.
https://api.farmanager.com/ru/structure ... meter.html
Последний раз описание 5 лет назад менялось.
Last edited by John Doe on Tue 03 Dec, 2019 16:56, edited 1 time in total.

citRiks
Posts: 79
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 8 times
Been thanked: 5 times

Выбор кодировки по маске файла

Post by citRiks » Tue 03 Dec, 2019 18:11

buniak_a_h,

Попытался я ознакомиться с 1.1.4, но пока что-то .

buniak_a_h
Posts: 1241
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 79 times
Contact:

Выбор кодировки по маске файла

Post by buniak_a_h » Wed 04 Dec, 2019 00:25

Пишет, что нет поля _G.BAX.BaxUtils , что наводит на мысль о несоответствии модулей и макроса.
Можете убрать сам макрос, оставить только модули и после перезагрузки макросов позырить указанное поле?
Хотя я затеял глобальную переделку, чтоб не рассчитывать на _G.BAX … Ну и нормальную систему проверки соответствия версий модулей и скриптов.
На самом деле, рас интерес появился, я несколько переделаю и оптимизирую. У меня давно уже всё изменилось; хотя сам я пользуюсь, но не ожидал, что кто-нить будет смотреть… Т.е. сначала ожидал, а потом никто не скачивает, не смотрит … Я и забросил.
Last edited by buniak_a_h on Wed 04 Dec, 2019 00:30, edited 1 time in total.

citRiks
Posts: 79
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 8 times
Been thanked: 5 times

Выбор кодировки по маске файла

Post by citRiks » Wed 04 Dec, 2019 01:14

buniak_a_h wrote:
Wed 04 Dec, 2019 00:25
Можете убрать сам макрос, оставить только модули и после перезагрузки макросов позырить указанное поле?
А как именно можно корректно посмотреть наличие данного поля?

Причём, прилагаемые к сабжевому скрипту модули я намеренно не устанавливал. Поскольку уже установлены одноимённые значительно более поздние, приложенные Вами к другим Вашим скриптам.

buniak_a_h
Posts: 1241
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 79 times
Contact:

Выбор кодировки по маске файла

Post by buniak_a_h » Wed 04 Dec, 2019 01:28

Если нету tableview, то можно просто набрать
lua:=_G.BAX (должно быть table… )
lua:=_G.BAX.BaxUtils (тоже д.б. таблица)

buniak_a_h
Posts: 1241
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 79 times
Contact:

Выбор кодировки по маске файла

Post by buniak_a_h » Wed 04 Dec, 2019 01:29

citRiks wrote:
Wed 04 Dec, 2019 01:14
Причём, прилагаемые к сабжевому скрипту модули я намеренно не устанавливал. Поскольку уже установлены одноимённые значительно более поздние, приложенные Вами к другим Вашим скриптам.
Ясно, спасибо.
Да, несовместимость … Исправлю.

buniak_a_h
Posts: 1241
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 79 times
Contact:

Выбор кодировки по маске файла

Post by buniak_a_h » Wed 04 Dec, 2019 06:13

John Doe wrote:
Tue 03 Dec, 2019 16:51
А я вот вижу что второй короче, раза в 3 наверно?
Ну да... Правда, обратного переключения нету. Но - спасибо. Давно писалось …
John Doe wrote:
Tue 03 Dec, 2019 16:51
buniak_a_h wrote:
Tue 03 Dec, 2019 16:24
Всё это было написано когда в описании editor.SetParam(…, F.ESPT_CODEPAGE … ) было указано, что выбрать можно было только OEM или Ansi.
https://api.farmanager.com/ru/structure ... meter.html
Последний раз описание 5 лет назад менялось.
Я не помню, где видел, но в описании этой функции такое было (ну не сам же я придумал!). Я даже писал куда-то, что логично было бы не только ANSI и OEM, а также "умолчательное" и "автоматическое" значения указывать, а любой номер кодовой страницы. Было такое. Искать не буду.

buniak_a_h
Posts: 1241
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 79 times
Contact:

Выбор кодировки по маске файла

Post by buniak_a_h » Wed 04 Dec, 2019 06:15

citRiks wrote:
Tue 03 Dec, 2019 18:11
buniak_a_h,
Попытался я ознакомиться с 1.1.4, но пока что-то .
Ознакомьтесь с 1.1.5 :-) Должно получиться.

citRiks
Posts: 79
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 8 times
Been thanked: 5 times

Выбор кодировки по маске файла

Post by citRiks » Wed 04 Dec, 2019 14:18

buniak_a_h wrote:
Wed 04 Dec, 2019 06:15
Ознакомьтесь с 1.1.5
Получилось. Спасибо.

При наличии скрипта новый lua-файл сохраняется в нужной кодировке, но без необходимой метки BOM.
Поэтому после строки 245

Code: Select all

editor.SetParam(nil, F.ESPT_CODEPAGE, v.Cp)
я у себя добавил в скрипт строку 246 (взял её содержание из энциклопедии):

Code: Select all

editor.SetParam(nil, "ESPT_SETBOM", "TRUE")

buniak_a_h
Posts: 1241
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 79 times
Contact:

Выбор кодировки по маске файла

Post by buniak_a_h » Wed 04 Dec, 2019 14:39

citRiks wrote:
Wed 04 Dec, 2019 14:18
При наличии скрипта новый lua-файл сохраняется в нужной кодировке, но без необходимой метки BOM.
Я в курсе :-) Делалось специально. Единственные файлы, которые я обязательно делаю с BOM - языковые (собственно, там так и написано). Для Lua-файлов BOM не обязателен.
Но Вы правы. Для UTF в настройках надо предусмотреть флаг "с BOM".
Видимо, одной такой строки недостаточно: должна быть привязка к расширению и, во всяком случае, зависеть от CP …

citRiks
Posts: 79
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 8 times
Been thanked: 5 times

Выбор кодировки по маске файла

Post by citRiks » Wed 04 Dec, 2019 19:51

buniak_a_h,

Задумавшись над тем, почему такой полезной темой не занимались раньше, нашёл 2 макроса. И возможно Вам они тоже будут интересны (если Вы с ними ещё не знакомы).

shmuz 17:21 17-01-2017 и Shmuel Mon 11 Feb 2013 10:46

buniak_a_h
Posts: 1241
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 79 times
Contact:

Выбор кодировки по маске файла

Post by buniak_a_h » Wed 04 Dec, 2019 22:48

citRiks wrote:
Wed 04 Dec, 2019 19:51
buniak_a_h,

Задумавшись над тем, почему такой полезной темой не занимались раньше, нашёл 2 макроса. И возможно Вам они тоже будут интересны (если Вы с ними ещё не знакомы).

shmuz 17:21 17-01-2017 и Shmuel Mon 11 Feb 2013 10:46
Посмотрел…
Первый макрос - читает BOM и выставляет CP, ему соответствующий. Насколько я понимаю, это делает (теперь?) автоопределение.
Второй - входит в мой скрипт в части собственно установки CP для редактора. кроме этого куска моё ещё предусматривает настройку , а ГЛАВНОЕ (!!!) - для вьюера тоже делает. Просто у вьюера нет SetParam, что сильно усложняет процесс …
У меня ещё и (били? надо бы проверить) "связаны по данным" этот макрос и Find & Go . Во всяком случае так было, пока я не стал "бороться" с глобальной таблицей _G.BAX (сказали, что порочная практика)

Post Reply

Return to “Обсуждение макросов”