Некогда был написан скрипт, позволяющий редактировать переменные среды (aka окружения) значения которых находятся в реестре. Скрипт пребывал в состоянии перманентной альфы/беты и никуда не выкладывался, так как требовался редко и довести до ума руки так и не доходили. Однако, к появлением конкурирующего EnvManager собрал волю в кулак и решил доделать. Так что, это не плагиат , хотя кое что от конкурента позаимстововано, например, первоначально с переменными процесса работа не велась.
Скрипт показывает три списка переменных среды: для процесса, для пользователя из HKCU\Environment, для системы из HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment. Можно настроить, с чего начинать показ.
Переменные показываются as is, т.е. то, что вернула система, никакого специального раскрытия переменных среды не делается.
Поддерживаются только переменные REG_SZ и REG_EXPAND_SZ (остальные типы всё равно не используются самой системой).
Если при редактировании имя переменной будет изменено, будет задан вопрос, что подразумевается сделать - переименовать переменную или скопировать под другим именем.
Если при переименовании, копировании, вставке, восстановлении окажется, что переменная с таким же именем уже существует, будет задан вопрос с подтверждением перезаписи.
Персональные настройки могут храниться в отдельном файле, на случай обновления скрипта. Файл настроек должен иметь то же имя, что и скрипт с расширеним cfg и размещаться в той же папке, что и скрипт. Пример прилагается. Описание в примере.
Клавиши:
AltShiftE
- Вызов макроса по умолчанию. Эта же комбинация по умолчанию используется для переключения списков переменных, аналогично Tab.Tab
и ShiftTab
- Переключение списков переменных.Enter
- Редактирование переменной.F4
или ShiftF4
- Редактирование переменной во встроенном редакторе.Ins
или Num0
- Добавление новой переменной.Del
или NumDel
- Удаление переменной.F12
или ShiftF12
- Восстановление последней удалённой переменной. Для каждого из трёх списков запоминается своя последняя удалённая переменная. После перезагрузки макросов эти сохранённые значения теряются.F4
или ShiftF4
в диалоге редактирования вызывают встроенный редактор ФАРа. Предполагается, что делается это для переменных типа PATH, где несколько частей разделены точкой с запятой. Поэтому, при вызове редактора точки с запятой заменяются на переводы строк, а по окончании редактирования всё собирается обратно, лишние переводы строк и точки с запятой удаляются.Уделение переменных из реестра и правильная запись их в реестр работает только с luafar/luamacro build >= 552 (или FAR 3.0 build 4491)
Для работы скрипта требуется модуль DialogClass ver>=1.11
EnvEdit 1.10
- --[=[--[=[ ------------------------------------------------------------------------------------------------------------------
- Редактор переменных среды
- v. 1.10 (C) 2014-2019 Smitis
- TODO:
- - Восстановление фильтра после редактирования переменной
- Обсуждение:
- http://forum.farmanager.com/viewtopic.php?t=9982
- Для работы требуется модуль DialogClass v.>=1.11
- http://forum.farmanager.com/viewtopic.php?t=8523
- --]=] ------------------------------------------------------------------------------------------------------------------
- ------------------------------------------------------------------------------------------------------------------------
- -- Конфигурация
- -- Пользовательские настройки можно поместить в файл с именем тем же, что и у скрипта и расширением cfg.
- ------------------------------------------------------------------------------------------------------------------------
- local cfg = {}
- cfg.DialogWidth = 100 -- ширина диалога редактирования
- cfg.NameWidth = 30 -- ширина поля под имя переменной в списке
- cfg.ValueWidth = 80 -- ширина поля под значение переменной в списке
- -- общая ширина окна списка = NameWidth+ValueWidth+12
- -- --║--NNNNNNNNNNNNNNNNNNNNNNNNNNNNNN-│-VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV-║--
- cfg.MenuHeight = 40 -- максимальная высота списка, высота окна списка = MenuHeight+4
- cfg.MacroKey = "AltShiftE" -- клавиши для вызова макроса, если пустая строка, макрос будет отключен
- cfg.ModeSwitch = "AS+E" -- для быстрого переключения списков после вызова макроса "не отрываясь от клавиатуры"
- cfg.StartMode = 1 -- с чего начинаем: 1 - для процесса, 2 - для пользователя, 3 - для системы
- cfg.NameHistory = "" -- имя истории для имён переменных, если пустая строка, история отключена
- cfg.ValueHistory = "" -- имя истории для значения переменных, если пустая строка, история отключена
- cfg.PluginMenu = true -- добавлять или нет вызов из меню плагинов
- cfg.Favorites = {"PATH","PATHEXT","INCLUDE","LIB"} -- переменные, которые без сортировки будут показаны в начале списка
- ------------------------------------------------------------------------------------------------------------------------
- -- Загрузка персональных настроек
- ------------------------------------------------------------------------------------------------------------------------
- do local f,m=loadfile((...):gsub("[^.]+$","cfg"))
- if f then setfenv(f,{cfg=cfg}) if not pcall(f) then msgbox("EnvEdit","\nCONFIG ERROR\n ",1)
- end end end
- ------------------------------------------------------------------------------------------------------------------------
- -- Локализация
- ------------------------------------------------------------------------------------------------------------------------
- local langs = {
- english = {
- MenuTitle = {"Process Environment Variables","User Environment Variables","System Environment Variables"},
- MenuBottom = "F1:Help",
- DialogTitle = {"Edit Environment Variable","Insert Environment Variable","Restore Environment Variable"},
- DeleteTitle = "DELETE",
- DeleteMsg = "Delete variable\n\n%s",
- OverwriteTitle = "OVERWRITE",
- OverwriteMsg = "Overwrite variable\n\n%s",
- RenameCopyTitle = "RENAME/COPY",
- RenameCopyMsg = "Rename or copy variable\n\n%s\n\nto\n\n%s",
- NamePrompt = "&Variable:",
- TypePrompt = "&Type:",
- ValuePrompt = "&Value:",
- OkButton = "Ok",
- RenameButton = "Rename",
- CopyButton = "Copy",
- CancelButton = "Cancel",
- EditButton = "F4:Editor",
- PluginMenuDesc = "Edit Environment Variables",
- NewName = "* input new name *",
- NewValue = "* input new value *",
- NoRestore = "No data to restore",
- EditorTitle = "Edit variable: ",
- MenuHelpTitle = "HELP",
- MenuHelpMsg = [=[
- Tab, ShiftTab - Switch varialbe list (process, user, system)
- Enter - Edit variable
- F4, ShiftF4 - Edit variable in editor
- Ins, Num0 - Insert new variable
- Del, NumDel - Delete variable
- F12, ShiftF12 - Restore last deleted variable
- ]=],
- },
- russian = {
- MenuTitle = {"Переменые окружения процесса","Пользовательские переменные окружения","Системные переменные окружения"},
- MenuBottom = "F1:Помощь",
- DialogTitle = {"Редактирование переменной среды","Вставка переменной среды","Восстановление переменной среды"},
- DeleteTitle = "УДАЛЕНИЕ",
- DeleteMsg = "Удалить переменную\n\n%s",
- OverwriteTitle = "ПЕРЕПИСАТЬ",
- OverwriteMsg = "Переписать переменную\n\n%s",
- RenameCopyTitle = "ПЕРЕИМЕНОВАТЬ/КОПИРОВАТЬ",
- RenameCopyMsg = "Переименовать или копировать переменную\n\n%s\n\nв\n\n%s",
- NamePrompt = "&Переменная:",
- TypePrompt = "&Тип:",
- ValuePrompt = "&Значение:",
- OkButton = "Подтвердить",
- RenameButton = "Переименовать",
- CopyButton = "Копировать",
- CancelButton = "Отменить",
- EditButton = "F4:Редактор",
- PluginMenuDesc = "Редактирование переменных окружения",
- NewName = "* введите новое имя *",
- NewValue = "* введите новое значение *",
- NoRestore = "Нет данных для восстановления",
- EditorTitle = "Редактирование переменной: ",
- MenuHelpTitle = "ПОМОЩЬ",
- MenuHelpMsg = [=[
- Tab, ShiftTab - Переключение списков переменных (процесса, пользователя, системы)
- Enter - Редактирование переменной
- F4, ShiftF4 - Редактирование переменной в редакторе
- Ins, Num0 - Добавление новой переменной
- Del, NumDel - Удаление переменной
- F12, ShiftF12 - Восстановление последней удалённой переменной
- ]=],
- }
- }
- local lang = langs[win.GetEnv("FARLANG"):lower()] or langs.english
- ------------------------------------------------------------------------------------------------------------------------
- local EnvEditMenuId = win.Uuid("09814E7E-CBA7-43A4-9F65-0222E72CFADA")
- local EnvEditHelpId = win.Uuid("F9EDF605-EC94-4216-8353-A96E8BB7F42D")
- local EnvEditDeleteId = win.Uuid("1AA4D9CC-3173-43C2-9FB7-57842CD93EBC")
- local EnvEditRestoreId = win.Uuid("634F82F7-32F5-4BF8-BF5A-9469FD9E3124")
- local EnvEditRenameCopyId = win.Uuid("0A0A426D-EB4F-403C-B5F1-584B4507CE2D")
- local EnvEditOverwriteId = win.Uuid("8E58D881-339C-4274-9CBA-58BD3CF00BA4")
- local EnvEditPluginMenuId = "9F0AB063-515E-4E74-8214-5B801BA4B789"
- local EnvEditMacroId = "9C60576F-38F0-4974-A03D-2FF851343B20"
- local EnvEditChangeId = "5D2D74B0-B1CC-4091-AAA2-1C5789B14E01"
- local EnvEditEditorId = "D5D70290-C316-45F1-9EA1-5CF4188FB2C3"
- local F = far.Flags
- local dialog = require "DialogClass"
- local ffi = require "ffi"
- local C = ffi.C
- ffi.cdef [=[
- wchar_t* GetEnvironmentStringsW();
- void FreeEnvironmentStringsW(wchar_t*);
- size_t wcslen(const wchar_t*);
- int SendMessageA(HWND, UINT, WPARAM, LPARAM);
- int SendMessageTimeoutA(HWND, UINT, WPARAM, LPARAM, UINT, UINT, DWORD_PTR*);
- ]=]
- --local farbuild = select(4,far.AdvControl(F.ACTL_GETFARMANAGERVERSION,true))
- --local wrenable = farbuild >= 4491
- local vtypes = {string="REG_SZ", expandstring="REG_EXPAND_SZ", REG_SZ="string", REG_EXPAND_SZ="expandstring"}
- local vtindex = {string=1, expandstring=2, REG_SZ=1, REG_EXPAND_SZ=2}
- ------------------------------------------------------------------------------------------------------------------------
- local mode = 1 -- что редактируем: 0:выходим, 1:для процесса, 2:для пользователя, 3:для системы
- local RootKey, PathKey
- local backup = {{Name="",Value="",Type=""},{Name="",Value="",Type=""},{Name="",Value="",Type=""}} -- сохранение предыдущего значения переменной для восстановления
- ------------------------------------------------------------------------------------------------------------------------
- local function Message(msg,...)
- return far.Message(" \n"..msg.."\n ",...)
- end
- ------------------------------------------------------------------------------------------------------------------------
- local environment, favorites, envmenu
- local function FindVar(name) -- поиск переменной в меню для восстановления позиции
- name = name:lower()
- for i,var in ipairs(envmenu) do
- if var.Name:lower()==name then
- return i
- end
- end
- return 0
- end
- ------------------------------------------------------------------------------------------------------------------------
- local HWND_BROADCAST = ffi.cast("HWND",0xffff)
- local WM_SETTINGCHANGE = 0x001A
- local SMTO_ABORTIFHUNG = 0x0002
- local MSG_TIMEOUT = 5000
- local function SendSettingChange(mode)
- if mode==nil or mode~=1 then -- для локальных переменных обновлять не надо
- --C.SendMessageA(HWND_BROADCAST,WM_SETTINGCHANGE,0,ffi.cast("LPARAM","Environment"))
- C.SendMessageTimeoutA(HWND_BROADCAST,WM_SETTINGCHANGE,0,ffi.cast("LPARAM","Environment"),SMTO_ABORTIFHUNG,MSG_TIMEOUT,ffi.cast("DWORD_PTR*",0))
- end
- end
- ------------------------------------------------------------------------------------------------------------------------
- local function ModalEdit(text,title)
- text = text:gsub(';','\n')
- text = text:gsub('%b""',function(x) return x:gsub('\n',';') end) -- точки с запятой в кавычках
- text = text:gsub('\n+','\n') -- лишние переводы строк
- text = text.."\n"
- local tmpfile = far.MkTemp()
- local hfile = io.open(tmpfile,"w") hfile:write(text) hfile:close()
- editor.Editor(tmpfile,title or " ",0,0,-1,-1,bor(F.EF_DISABLEHISTORY,F.EF_DISABLESAVEPOS),0,0,65001)
- hfile = io.open(tmpfile,"r") text = hfile:read("*a") hfile:close()
- win.DeleteFile(tmpfile)
- return text:gsub('[\n;]+',';'):gsub('[; ]+$',''):gsub('^[; ]+','')
- end
- ------------------------------------------------------------------------------------------------------------------------
- local function EditVar(var,op)
- op = op or 1 -- 1:edit, 2:insert, 3:restore
- local prev = {Name=var.Name,Value=var.Value,Type=var.Type}
- local new = {Name=var.Name,Value=var.Value,Type=var.Type}
- local D,DI = dialog.New {
- Guid = EnvEditChangeId,
- Title = lang.DialogTitle[op],
- W = cfg.DialogWidth,
- H = mode==1 and 10 or 12,
- DlgProc = function(hDlg,Msg,Param1,Param2,D,DI)
- if Msg==F.DN_CLOSE and Param1==DI.OkButton.Id then
- new.Name = DI.Name:GetText()
- new.Value = DI.Value:GetText()
- if mode~=1 then new.Type = DI.Type:GetText() end
- -- При пустом имени или пустом значении вернёмся к редактированию
- if new.Name=="" or new.Value=="" then
- return false
- end
- -- Спрашиваем переименовать, копировать или отменить при изменение имени при редактированиее.
- -- При отмене вернёмся к редактированию.
- local rc = 1 -- 0:cancel, 1:change, 2:rename, 3:copy
- if op==1 and new.Name:lower()~=prev.Name:lower() then
- rc = (Message(lang.RenameCopyMsg:format(prev.Name,new.Name),lang.RenameCopyTitle,lang.RenameButton..";"..lang.CopyButton..";"..lang.CancelButton,"","",EnvEditRenameCopyId)+1)%4
- if rc==0 then return true end
- end
- -- Спрашиваем при переименовании, копировании, вставке или восстановлении если уже существует такая переменная
- if (rc>1 or op>1) and FindVar(new.Name)>0 then
- if Message(lang.OverwriteMsg:format(new.Name),lang.OverwriteTitle,";OkCancel","","",EnvEditOverwriteId)~=1 then
- return true
- end
- end
- -- Если дошли сюда, значит наконец можно установить переменную
- if mode==1 then
- win.SetEnv(new.Name,new.Value)
- if rc==2 then -- при переименовании удалить старую переменную
- win.SetEnv(prev.Name,nil)
- end
- else
- win.SetRegKey(RootKey,PathKey,new.Name,vtypes[new.Type],new.Value)
- if rc==2 then -- при переименовании удалить старую переменную
- win.DeleteRegValue(RootKey,PathKey,prev.Name)
- end
- SendSettingChange()
- end
- var.Name,var.Value,var.Type = new.Name,new.Value,new.Type
- end
- -- Вызов модального редактора
- local key = (Msg==F.DN_CONTROLINPUT and Param2.EventType==F.KEY_EVENT and Param2.KeyDown) and far.InputRecordToName(Param2) or ""
- if (Msg==F.DN_BTNCLICK and Param1==DI.EditButton.Id) or key=="F4" or key=="ShiftF4" then
- DI.Value:SetText(ModalEdit(DI.Value:GetText(),lang.EditorTitle..DI.Name:GetText()))
- return true
- end
- end,
- }
- DI {"t+", Text=lang.NamePrompt}
- DI {"e+", Name="Name", Text=var.Name, History=cfg.NameHistory}
- if mode~=1 then
- DI {"t+", Text=lang.TypePrompt}
- DI {"xd+", Name="Type", W=14, LI={{Flags=0,Text="REG_SZ"},{Flags=0,Text="REG_EXPAND_SZ"},SelectIndex=vtindex[var.Type]}, Text=""}
- end
- DI {"t+", Text=lang.ValuePrompt}
- DI {"e+", Name="Value", Text=var.Value, Flags=(op==1 and F.DIF_FOCUS or 0), History=cfg.ValueHistory}
- DI {"s+"}
- DI {"b=!+", Name="OkButton", Text=lang.OkButton}
- DI {"b=", Name="CancelButton", Text=lang.CancelButton}
- DI {"b=;", Name="EditButton", Text=lang.EditButton}
- return D()==DI.OkButton.Id
- end
- ------------------------------------------------------------------------------------------------------------------------
- local function EditEnvironment()
- lang = langs[win.GetEnv("FARLANG"):lower()] or langs.english
- local items, item
- local pos = {0,0,0} -- текущая позиция в меню по каждому типу переменных
- local jump -- переменная, если требуется изменение текущей pos
- local MenuHotKeys = {
- {BreakKey="F1"},
- {BreakKey="F4"},{BreakKey="S+F4"},
- {BreakKey="F12"},{BreakKey="S+F12"},
- {BreakKey="INSERT"},{BreakKey="NUMPAD0"},
- {BreakKey="DELETE"},{BreakKey="DECIMAL"},{BreakKey="F8"},
- {BreakKey="TAB"},{BreakKey="C+TAB"},
- {BreakKey="S+TAB"},{BreakKey="CS+TAB"},
- }
- if cfg.ModeSwitch and cfg.ModeSwitch~="" then
- MenuHotKeys[#MenuHotKeys+1] = {BreakKey=cfg.ModeSwitch}
- end
- local name, value, vtype, filter
- mode = cfg.StartMode
- while mode>0 do -- цикл переключения списка отображаемых переменных 1/2/3 - процесс/пользователь/система
- environment = {}
- favorites = {}
- envmenu = {}
- if mode==1 then -- переменные процесса
- local envstrings = C.GetEnvironmentStringsW()
- local envptr = envstrings -- указатель на очередную переменную
- local envlen = C.wcslen(envptr)
- while envlen > 0 do
- value = win.Utf16ToUtf8(ffi.string(ffi.cast("char*",envptr),2*envlen))
- if value:sub(1,1)~="=" then -- кроме "=<диск>=<путь>"
- name,value = value:match("^(.-)=(.*)$")
- if name and value then
- environment[#environment+1] = {Name=name,Value=value}
- end
- end
- envptr = envptr+envlen+1 -- указатель на следующую строку
- envlen = C.wcslen(envptr)
- end
- C.FreeEnvironmentStringsW(envstrings)
- else
- local index = 0
- if mode==2 then -- пользовательские переменные
- RootKey = "HKCU"
- PathKey = "Environment"
- elseif mode==3 then -- системные переменные
- RootKey = "HKLM"
- PathKey = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"
- else
- return
- end
- name = win.EnumRegValue(RootKey,PathKey,index)
- while name do
- value,vtype = win.GetRegKey(RootKey,PathKey,name)
- if vtypes[vtype] then
- environment[#environment+1] = {Name=name,Value=value,Type=vtypes[vtype]}
- end
- index = index+1
- name = win.EnumRegValue(RootKey,PathKey,index)
- end
- end
- table.sort(environment,function(a,b) return(a.Name:lower()<b.Name:lower()) end)
- for _,f in ipairs(cfg.Favorites) do -- формируем список избраного
- for _,e in ipairs(environment) do
- if f:upper()==e.Name:upper() then
- e.Fav = true -- помечаем как избранное
- envmenu[#envmenu+1] = e
- break
- end
- end
- end
- if #envmenu>0 and #envmenu<#environment then -- Разделитель между избранным и остальным
- envmenu[#envmenu+1] = {Name="",separator=true}
- end
- for _,e in ipairs(environment) do -- Перенос оставшегося списка
- if e.Name~="" and not e.Fav then
- envmenu[#envmenu+1] = e
- end
- end
- for _,e in ipairs(envmenu) do -- Форматируем для far.Menu
- if not e.separator then
- e.text = ("%%-%is │ %%-%is"):format(cfg.NameWidth,cfg.ValueWidth):format(e.Name:sub(1,cfg.NameWidth),e.Value:sub(1,cfg.ValueWidth))
- end
- end
- if jump then -- определяем позицию для перехода (после вставки, переименования и т.п.)
- pos[mode] = FindVar(jump)
- jump = nil
- end
- while true do -- цикл - показываем меню / обрабатываем клавиши
- local res
- res,pos[mode] = far.Menu(
- {
- Title=lang.MenuTitle[mode],
- Bottom=lang.MenuBottom,
- SelectIndex=pos[mode],
- Id=EnvEditMenuId,
- Flags=bor(F.FMENU_SHOWAMPERSAND,F.FMENU_WRAPMODE),
- MaxHeight=cfg.MenuHeight,
- },
- envmenu, MenuHotKeys
- )
- if res==nil then -- Esc
- mode = 0
- break
- --elseif not res.BreakKey or (res.BreakKey and (res.BreakKey=="F4" or res.BreakKey=="S+F4")) then -- Enter, F4
- elseif not res.BreakKey then -- Enter
- local var = envmenu[pos[mode]]
- if EditVar(var) then
- jump = var.Name
- break
- end
- elseif res.BreakKey=="F4" or res.BreakKey=="S+F4" then -- модальный редактор
- local var = envmenu[pos[mode]]
- var.Value = ModalEdit(var.Value,lang.EditorTitle..var.Name)
- if var.Value=="" then var.Value=nil end -- пустое значение - удаляем переменую
- if mode==1 then
- win.SetEnv(var.Name,var.Value)
- jump = var.Name
- break
- elseif var.Value then
- win.SetRegKey(RootKey,PathKey,var.Name,vtypes[var.Type],var.Value)
- jump = var.Name
- SendSettingChange()
- break
- else
- backup[mode] = {Name=var.Name,Value=var.Value,Type=var.Type}
- win.DeleteRegValue(RootKey,PathKey,prev.Name)
- SendSettingChange()
- break
- end
- elseif res.BreakKey=="F12" or res.BreakKey=="S+F12" then -- восстановление
- local var = {Name=backup[mode].Name,Value=backup[mode].Value,Type=backup[mode].Type}
- if var.Name=="" then
- Message(lang.NoRestore,lang.RestoreTitle,";Ok","","",EnvEditRestoreId)
- elseif EditVar(var,3) then
- jump = var.Name
- SendSettingChange(mode)
- break
- end
- elseif res.BreakKey=="INSERT" or res.BreakKey=="NUMPAD0" then
- local var = {Name=lang.NewName,Value=lang.NewValue}
- if mode~=1 then var.Type="REG_SZ" end
- if EditVar(var,2) then
- jump = var.Name
- SendSettingChange(mode)
- break
- end
- elseif res.BreakKey=="DELETE" or res.BreakKey=="DECIMAL" then
- local var = envmenu[pos[mode]]
- if Message(lang.DeleteMsg:format(var.Name),lang.DeleteTitle,";OkCancel","","",EnvEditDeleteId) == 1 then
- backup[mode] = {Name=var.Name,Value=var.Value,Type=var.Type}
- if mode==1 then
- win.SetEnv(var.Name,nil)
- else
- win.DeleteRegValue(RootKey,PathKey,var.Name)
- SendSettingChange()
- end
- if pos[mode]==#envmenu then pos[mode]=pos[mode]-1 end
- break
- end
- elseif res.BreakKey=="TAB" or res.BreakKey=="C+TAB" or res.BreakKey==cfg.ModeSwitch then
- mode = mode + 1
- if mode>3 then mode = 1 end
- break
- elseif res.BreakKey=="S+TAB" or res.BreakKey=="CS+TAB" then
- mode = mode - 1
- if mode<1 then mode = 3 end
- break
- elseif res.BreakKey=="F1" then
- Message(lang.MenuHelpMsg:gsub('%s*\n%s*','\n'):gsub('^%s+',''):gsub('[%s%c]+$',''),lang.MenuHelpTitle,";Ok","l",nil,EnvEditHelpId)
- end
- end
- end
- end;
- ------------------------------------------------------------------------------------------------------------------------
- if cfg.MacroKey and cfg.MacroKey~="" then
- Macro {
- description = "EnvEdit";
- area = "Shell Search QView Info Tree Editor Viewer";
- id = EnvEditMacroId;
- key = "AltShiftE";
- action = EditEnvironment;
- }
- end
- ------------------------------------------------------------------------------------------------------------------------
- if cfg.PluginMenu then
- MenuItem {
- description = "EnvEdit";
- menu = "Plugins";
- area = "Shell Search QView Info Tree Editor Viewer";
- guid = EnvEditPluginMenuId;
- text = function(menu,area)
- lang = langs[win.GetEnv("FARLANG"):lower()] or langs.english
- return lang.PluginMenuDesc
- end;
- action = EditEnvironment;
- }
- end
- ------------------------------------------------------------------------------------------------------------------------
GeSHi © Codebox Plus Extension