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

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 12323
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 168 times

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

Post by John Doe » Tue 08 Jan, 2019 15:58

Latest post of the previous page:

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

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

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

Post by buniak_a_h » Tue 08 Jan, 2019 17:09

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

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

Post by buniak_a_h » Tue 08 Jan, 2019 17:16

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

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

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

Post by buniak_a_h » Tue 08 Jan, 2019 18:10

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: 5572
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 89 times
Contact:

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

Post by zg » Tue 08 Jan, 2019 18:19

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

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

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

Post by buniak_a_h » Tue 08 Jan, 2019 18:24

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: 5572
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 89 times
Contact:

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

Post by zg » Tue 08 Jan, 2019 18:32

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

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

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

Post by buniak_a_h » Tue 08 Jan, 2019 18:37

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

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

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

Post by buniak_a_h » Tue 08 Jan, 2019 20:17

Учёл QView. Исправленный вариант - в первом посте темы

Garrett
Posts: 148
Joined: Mon 01 Aug, 2005 10:23

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

Post by Garrett » Wed 09 Jan, 2019 06:41

buniak_a_h, всё супер! Спасибо.

IgorZ
Posts: 605
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 39 times

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

Post by IgorZ » Mon 14 Jan, 2019 11:17

Решил представить свой вариант скрипта. Часть кода в переработанном виде позаимствована у 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 29 times

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

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

Post by buniak_a_h » Mon 14 Jan, 2019 18:12

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

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

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

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

Post by buniak_a_h » Mon 14 Jan, 2019 19:39

Вдогонку.
Я совсем забыл, в версии 1.1.4 используются мои модули. Можно взять отсюда:
BAX.Modules.7z
(13 KiB) Downloaded 27 times

IgorZ
Posts: 605
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 39 times

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

Post by IgorZ » Tue 15 Jan, 2019 10:08

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

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

Post by buniak_a_h » Tue 15 Jan, 2019 12:49

  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: 605
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 39 times

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

Post by IgorZ » Wed 16 Jan, 2019 05:59

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

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

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

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

Post Reply

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