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

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

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

Post by buniak_a_h »

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

buniak_a_h
Posts: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

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

Post by buniak_a_h »

Latest post of the previous page:

  1. IgorZ wrote:
    Tue 15 Jan, 2019 10:08
    Не вижу смысла. Это не те настройки, которые меняются в зависимости от условий. Они делаются раз и навсегда.
    Делал в основном для связи расширения с кодовой страницей. Остальное "родилось" по мере замечаний в этом обсуждении
  2. IgorZ wrote:
    Tue 15 Jan, 2019 10:08
    А смысл? Кодовая страница файла при просмотре и редактировании различается? Или есть смысл просматривать/редактировать файл в заведомо неверной кодировке?
    1. Как перспектива для добавления во вьюере параметров для установки WrapMode (Wrap/WWrap/Unwrap) и ViewMode (Text/Hex/Dump)
    2. Когда делалось, установка кодовой страницы вьюера была "экспериментальной" (собственно, она и появилась по результатам обсуждения в этой теме). Поэтому я просто побоялся включать перманентно (тем более, что там используется far.MacroPost, а это у меня, например, не всегда работает.
  3. IgorZ wrote:
    Tue 15 Jan, 2019 10:08
    при попытке вызвать диалог настройки подвешивает Far. Где-то что-то криво.
    Жаль, у меня не повторяется. Есть подозрение, что проблема в составлении списка доступных кодовых страниц. Попробуйте заменить строки, начиная с 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
    
    Если не влом...

IgorZ
Posts: 660
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 12 times
Been thanked: 52 times

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

Post by IgorZ »

buniak_a_h wrote:
Tue 15 Jan, 2019 12:49
[*]
IgorZ wrote:
Tue 15 Jan, 2019 10:08
А смысл? Кодовая страница файла при просмотре и редактировании различается? Или есть смысл просматривать/редактировать файл в заведомо неверной кодировке?
  1. Как перспектива для добавления во вьюере параметров для установки 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][*]
IgorZ wrote:
Tue 15 Jan, 2019 10:08
при попытке вызвать диалог настройки подвешивает Far. Где-то что-то криво.
Жаль, у меня не повторяется. Есть подозрение, что проблема в составлении списка доступных кодовых страниц. Попробуйте заменить строки, начиная с 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
Если не влом...[/list]
Помогло.

P. S. Настройки по умолчанию - в двух экземплярах в двух местах!!! Это уже за гранью Добра и Зла!

buniak_a_h
Posts: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

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

Post by buniak_a_h »

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: 12601
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 260 times

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

Post by John Doe »

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: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

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

Post by buniak_a_h »

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: 12601
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 260 times

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

Post by John Doe »

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: 174
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 28 times
Been thanked: 21 times

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

Post by citRiks »

buniak_a_h,

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

buniak_a_h
Posts: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

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

Post by buniak_a_h »

Пишет, что нет поля _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: 174
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 28 times
Been thanked: 21 times

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

Post by citRiks »

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

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

buniak_a_h
Posts: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

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

Post by buniak_a_h »

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

buniak_a_h
Posts: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

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

Post by buniak_a_h »

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

buniak_a_h
Posts: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

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

Post by buniak_a_h »

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: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

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

Post by buniak_a_h »

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

citRiks
Posts: 174
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 28 times
Been thanked: 21 times

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

Post by citRiks »

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: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

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

Post by buniak_a_h »

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

citRiks
Posts: 174
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 28 times
Been thanked: 21 times

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

Post by citRiks »

buniak_a_h,

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

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

Post Reply

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