Page 2 of 4

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

Posted: Mon 07 Jan, 2019 10:17
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

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

Posted: Tue 08 Jan, 2019 15:58
by John Doe

Latest post of the previous page:

2useven10 wrote:
Tue 08 Jan, 2019 11:15
И я не нашёл установку кодовой страницы вьювера через api...
Workaround (для немодального вьювера): переоткрыть с нужной кодировкой.

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

Posted: Tue 08 Jan, 2019 17:09
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.
Если у Вас остался первоначальный скрипт (через вызов меню выбора кодировок), то можно использовать аналогичный алгоритм. Я вьюером тоже практически не пользуюсь, но если надо - перепроверю...

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

Posted: Tue 08 Jan, 2019 17:16
by buniak_a_h
Garrett wrote:
Tue 08 Jan, 2019 07:21
buniak_a_h,
А что надо добавить, чтобы и во вьювере кодировка была верной?
Примерно такое добавить:

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

Posted: Tue 08 Jan, 2019 18:10
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 (точнее, тех файлов, которые обычно показываются в инфо-панели). С такими же фозможностями сокрытия разделов, как в инфо-панели... На мантис? Или бесполезно?

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

Posted: Tue 08 Jan, 2019 18:19
by zg
buniak_a_h wrote:
Tue 08 Jan, 2019 18:10
Наверно, (а) стоило бы и (б) хорошо бы ViewerEvent-ы распространялись не только на Area=Viewer, но и на Area=QView.
они распространяются.

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

Posted: Tue 08 Jan, 2019 18:24
by buniak_a_h
zg wrote:
Tue 08 Jan, 2019 18:19
они распространяются.
Я, перед тем, как запостить, проверил. На том скрипте,что здесь. Не работает.

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

Posted: Tue 08 Jan, 2019 18:32
by zg
buniak_a_h wrote:
Tue 08 Jan, 2019 18:24
Не работает.
ваш скрипт рассчитывает, что просмотр является активным окном (shiftf8 вызывает список кодировок), что в случае qview не всегда так.

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

Posted: Tue 08 Jan, 2019 18:37
by buniak_a_h
zg wrote:
Tue 08 Jan, 2019 18:32
ваш скрипт рассчитывает, что просмотр является активным окном
Да, точно. Забыл. Сам же, когда писал, думал об этом... Извините.

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

Posted: Tue 08 Jan, 2019 20:17
by buniak_a_h
Учёл QView. Исправленный вариант - в первом посте темы

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

Posted: Wed 09 Jan, 2019 06:41
by Garrett
buniak_a_h, всё супер! Спасибо.

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

Posted: Mon 14 Jan, 2019 11:17
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 на момент закрытия быстрого просмотра информация о файле уже недоступна.

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

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

CodePage.1_1_4.lua.7z
Версия 1.1.4 . Продублирована в первом посте темы
(3.98 KiB) Downloaded 29 times

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

Posted: Mon 14 Jan, 2019 19:39
by buniak_a_h
Вдогонку.
Я совсем забыл, в версии 1.1.4 используются мои модули. Можно взять отсюда:
BAX.Modules.7z
(13 KiB) Downloaded 38 times

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

Posted: Tue 15 Jan, 2019 10:08
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. Где-то что-то криво.

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

Posted: Tue 15 Jan, 2019 12:49
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
    
    Если не влом...

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

Posted: Wed 16 Jan, 2019 05:59
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. Настройки по умолчанию - в двух экземплярах в двух местах!!! Это уже за гранью Добра и Зла!