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

Здесь обсуждается всё, что касается макросов.
buniak_a_h
Posts: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 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 22 times
CodePage.1_1_5.lua.7z
CodePage.lua версии 1.1.5
(3.86 KiB) Downloaded 24 times
Last edited by buniak_a_h on Wed 04 Dec, 2019 06:04, edited 7 times in total.
2useven10
Posts: 4072
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 5 times
Been thanked: 189 times

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

Post by 2useven10 »

Latest post of the previous page:

Не поможет. Ошибка показывает то что уже написал Shmuel - нет ф-ии viewer.SetParam().
User avatar
John Doe
Бюрократ
Posts: 12872
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 times

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

Post by John Doe »

2useven10 wrote: Tue 08 Jan, 2019 11:15 И я не нашёл установку кодовой страницы вьювера через api...
Workaround (для немодального вьювера): переоткрыть с нужной кодировкой.
buniak_a_h
Posts: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 times
Contact:

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

Post by buniak_a_h »

Garrett wrote: Tue 08 Jan, 2019 11:02 2useven10, скрипт падает с вашими подсказками на
viewer.SetParam(nil, far.Flags.ESPT_CODEPAGE, 28595)
Shmuel wrote: Tue 08 Jan, 2019 11:06 Нет такой функции viewer.SetParam.
Если у Вас остался первоначальный скрипт (через вызов меню выбора кодировок), то можно использовать аналогичный алгоритм. Я вьюером тоже практически не пользуюсь, но если надо - перепроверю...
buniak_a_h
Posts: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 times
Contact:

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

Post by buniak_a_h »

Garrett wrote: Tue 08 Jan, 2019 07:21 buniak_a_h,
А что надо добавить, чтобы и во вьювере кодировка была верной?
Примерно такое добавить:
buniak_a_h
Posts: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 times
Contact:

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

Post by buniak_a_h »

2useven10 wrote: Tue 08 Jan, 2019 11:15 И я не нашёл установку кодовой страницы вьювера через api...
Может надо сделать?
Наверно, (а) стоило бы и (б) хорошо бы ViewerEvent-ы распространялись не только на Area=Viewer, но и на Area=QView. А то (применительно к кодировке) получается странная вещь: если файл ранее открывался во вьюере, то выбранная там кодировка действует и на QView; и при этом евент для ViewerEvent на QView-просмотровщик не распространяется. Ну, нелогично!.. Ну, или надо вводить группу QViewEvent (я бы навесил на это показ DirInfo в случае, если на другой панели - каталог). Впрочем, возможно, такая фишка была бы удобна как штатная: сейчас отображаются некие summary по каталогу, и остаётся довольно много места для показа DirInfo (точнее, тех файлов, которые обычно показываются в инфо-панели). С такими же фозможностями сокрытия разделов, как в инфо-панели... На мантис? Или бесполезно?
User avatar
zg
zero-gravity
Posts: 5866
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 155 times
Contact:

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

Post by zg »

buniak_a_h wrote: Tue 08 Jan, 2019 18:10Наверно, (а) стоило бы и (б) хорошо бы ViewerEvent-ы распространялись не только на Area=Viewer, но и на Area=QView.
они распространяются.
buniak_a_h
Posts: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 times
Contact:

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

Post by buniak_a_h »

zg wrote: Tue 08 Jan, 2019 18:19они распространяются.
Я, перед тем, как запостить, проверил. На том скрипте,что здесь. Не работает.
Last edited by buniak_a_h on Tue 08 Jan, 2019 18:24, edited 1 time in total.
User avatar
zg
zero-gravity
Posts: 5866
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 155 times
Contact:

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

Post by zg »

buniak_a_h wrote: Tue 08 Jan, 2019 18:24Не работает.
ваш скрипт рассчитывает, что просмотр является активным окном (shiftf8 вызывает список кодировок), что в случае qview не всегда так.
buniak_a_h
Posts: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 times
Contact:

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

Post by buniak_a_h »

zg wrote: Tue 08 Jan, 2019 18:32 ваш скрипт рассчитывает, что просмотр является активным окном
Да, точно. Забыл. Сам же, когда писал, думал об этом... Извините.
buniak_a_h
Posts: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 times
Contact:

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

Post by buniak_a_h »

Учёл QView. Исправленный вариант - в первом посте темы
Garrett
Posts: 186
Joined: Mon 01 Aug, 2005 10:23
Been thanked: 1 time

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

Post by Garrett »

buniak_a_h, всё супер! Спасибо.
IgorZ
Posts: 700
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 65 times

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

Post by IgorZ »

Решил представить свой вариант скрипта. Часть кода в переработанном виде позаимствована у buniak_a_h.
  1. local Info = package.loaded.regscript or function(...) return ... end
  2. local nfo = Info {_filename or ...,
  3.   name          = "AutoSetCodePage";
  4.   description   = "Автоматическая установка кодовой страницы по имени файла";
  5.   version       = "0.9"; --http://semver.org/lang/ru/
  6.   author        = "IgorZ";
  7. --  url           = "";
  8.   id            = "31A681B8-B744-4C56-BD44-CDBED83950FA";
  9.   minfarversion = {3,0,0,4000,0};
  10. --  files         = "*Eng.hlf;*Rus.hlf;*Eng.lng;*Rus.lng";
  11.   helptxt       = [[
  12.   Автоматически устанавливает кодовую страницу для файла.
  13.   Таблица Masks определяет, каким маскам соответствует какая кодовая страница по умолчанию.
  14.     Каждый элемент таблицы является таблицей из двух значений:
  15.       - значение 1: маска имени файла в стиле Far;
  16.       - значение 2: номер кодовой страницы.
  17.     Параметры перебираются в порядке следования.
  18.   Если файл уже открывался в текущей сессии, для него запоминается кодовая страница,
  19.   с которой он был закрыт, если есть возможность.
  20. ]];
  21.   history       = [[
  22. 2019/01/14 v0.9   - Публичная бета.
  23. ]];
  24. --  disabled      = false;
  25.   options       = {
  26.     Masks = { -- пары вида {<маска имени файла в стиле Far>,<кодовая страница по умолчанию>}
  27.       {"*.bat",866},
  28.       {"*.lua,*.moon",65001},
  29.     }
  30.   };
  31. }
  32. if not nfo then return end
  33. --
  34. local F = far.Flags
  35. -- кодовые страницы для каждого файла
  36. local CPs = {}
  37. --
  38. local function GetDef(fn) -- получить для файла кодовую страницу по умолчанию
  39. for _,m in pairs(nfo.options.Masks) do if mf.fmatch(fn,m[1])==1 then CPs[fn] = m[2] break end end return CPs[fn]
  40. end
  41. --
  42. local function PostMacroStr(cp) -- установить кодовую страницу в просмотрщике
  43. local tab = (Area.Current == 'Viewer' or Area.Current == 'QView') and "" or "Tab "
  44. return [[Keys("]]..tab..[[ShiftF8") if Menu.Select(]]..cp..[[,1) > 0 then Keys("Enter") else Keys("Esc") end Keys("]]..tab..[[")]]
  45. end
  46. --
  47. Event{ -- выбор правильной кодовой страницы при открытии редактора
  48.   description="Set right codepage in editor"; group="EditorEvent"; condition=function(_,Event) return Event==F.EE_READ end;
  49.   action=function(Id) local fn,cp = (editor.GetFileName(Id)) cp = CPs[fn] or GetDef(fn) if cp then editor.SetParam(Id,F.ESPT_CODEPAGE,cp) end end;
  50. }
  51. --
  52. Event{ -- запоминание выбранной кодовой страницы при выходе из редактора
  53.   description="Save current codepage in editor"; group="EditorEvent"; condition=function(_,Event) return Event==F.EE_CLOSE end;
  54.   action=function(Id) CPs[editor.GetFileName(Id)] = editor.GetInfo(Id).CodePage end;
  55. }
  56. --
  57. Event{ -- выбор правильной кодовой страницы при открытии просмотрщика
  58.   description="Set right codepage in viewer"; group="ViewerEvent"; condition=function(_,Event) return Event==F.VE_READ end;
  59.   action=function(Id) local fn,cp = (viewer.GetFileName(Id)) cp = CPs[fn] or GetDef(fn) if cp then far.MacroPost(PostMacroStr(cp)) end end;
  60. }
  61. --
  62. Event{ -- запоминание выбранной кодовой страницы при выходе из просмотрщика
  63.   description="Save current codepage in viewer"; group="ViewerEvent"; condition=function(_,Event) return Event==F.VE_CLOSE end;
  64.   action=function(Id) local fn = viewer.GetFileName(Id) if fn then CPs[fn] = viewer.GetInfo(Id).CurMode.CodePage end end;
  65. }
Отличия:
  1. Лучшая масштабируемость. Для обработки нового типа файлов достаточно добавить одну строчку в параметры скрипта (таблица Masks) в случае новой кодовой страницы или просто отредактировать маску в случае уже обрабатываемой.
  2. После первого просмотра/редактирования кодовая страница сохраняется для каждого файла персонально (бывает, что конкретный файл записан не в той же кодовой странице, что и остальные того же типа). Данные хранятся до перезагрузки макросов/LuaMacro или выключения Far. Единственное обнаруженное исключение - быстрый просмотр: в текущей версии Far на момент закрытия быстрого просмотра информация о файле уже недоступна.
Attachments
AutoSetCodePage.lua.0.9.0.7z
(1.57 KiB) Downloaded 38 times
buniak_a_h
Posts: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 times
Contact:

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

Post by buniak_a_h »

IgorZ, ну, раз уж пошла такая пьянка...
Вот скрипт, который сейчас стоит у меня. В нём реализована настройка с диалогом. Настройка, кроме связи маски файла с кодовой с страницей, предусматривает указание, надо ли применять к редактору/вюеру; для редактора - только для нового файла, или при любом открытии.
P/S.
1. Не сразу выложил этот вариант, т.к. поначалу работал странно. Потом, вроде, моим требованиям стал удовлетворять в полной мере.
2. Полного тестирования не проводил. Если есть желающие - буду благодарен.

CodePage.1_1_4.lua.7z
Версия 1.1.4 . Продублирована в первом посте темы
(3.98 KiB) Downloaded 29 times
buniak_a_h
Posts: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 times
Contact:

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

Post by buniak_a_h »

Вдогонку.
Я совсем забыл, в версии 1.1.4 используются мои модули. Можно взять отсюда:
BAX.Modules.7z
(13 KiB) Downloaded 38 times
IgorZ
Posts: 700
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 13 times
Been thanked: 65 times

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

Post by IgorZ »

buniak_a_h wrote: Mon 14 Jan, 2019 18:12 IgorZ, ну, раз уж пошла такая пьянка...
Вот скрипт, который сейчас стоит у меня. В нём реализована настройка с диалогом.
Не вижу смысла. Это не те настройки, которые меняются в зависимости от условий. Они делаются раз и навсегда.
buniak_a_h wrote: Mon 14 Jan, 2019 18:12 Настройка, кроме связи маски файла с кодовой с страницей, предусматривает указание, надо ли применять к редактору/вюеру; для редактора - только для нового файла, или при любом открытии.
А смысл? Кодовая страница файла при просмотре и редактировании различается? Или есть смысл просматривать/редактировать файл в заведомо неверной кодировке?
buniak_a_h wrote: Mon 14 Jan, 2019 18:12 2. Полного тестирования не проводил. Если есть желающие - буду благодарен.
Полного тестирования также не проводил, но при попытке вызвать диалог настройки подвешивает Far. Где-то что-то криво.
buniak_a_h
Posts: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 times
Contact:

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

Post by buniak_a_h »

  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
    
    Если не влом...
Post Reply

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