Last active
August 22, 2024 20:40
-
-
Save johnd0e/252e6a3ad7c68ee9d7f31d987f86813f to your computer and use it in GitHub Desktop.
Far Manager Script: Import environment
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--[[ | |
.Language=Russian,Russian (Русский) | |
.PluginContents=Import environment | |
.Options CtrlStartPosChar=§¦ | |
@Contents | |
$ Import environment — загрузка *.env файлов | |
#Функции скрипта# | |
#*# §¦Запуск из командной строки по префиксу #env:#. | |
§¦Рекомендуется назначить ассоциацию на #*.env#. | |
#*# §¦При загрузке макросов, может автоматически загружать файл #autoload.env# из | |
пользовательской директории (см.) | |
#*# §¦Макрос, позволяющий выбрать файл для импорта из списка. | |
Файлы читаются из пользовательской директории. | |
§¦Клавиатурную комбинацию для вызова нужно определить через опцию #macrokey# | |
(по умолчанию не задана). | |
#Пользовательская директория# | |
По умолчанию: | |
#*# §¦Windows: #%FARPROFILE%\.env# | |
#*# §¦Linux (far2m): #far.InMyConfig(".env")# | |
Если эта директория отсутствует, то ищется директория #.env# рядом со скриптом. | |
Значение может быть переопределено через опцию #envdir# | |
(поддерживается #cfgscript#/~ScriptsBrowser~@https://forum.farmanager.com/viewtopic.php?f=15&t=10418@). | |
#Командная строка# | |
#env:file.env# | |
§¦Импорт окружения из заданного файла. | |
#env:directory# | |
§¦Чтение списка *.env-файлов из #заданной# директории, | |
и выбор файла для импорта из списка. | |
#env:/envdir# | |
§¦Чтение списка *.env-файлов из #пользовательской# директории, | |
и выбор файла для импорта из списка. | |
#env:<command# | |
§¦Запуск команды и импорт изменений из её окружения. | |
#env:# | |
§¦При запуске без параметров выводится эта справка. | |
Примечания: | |
#*# §¦При запуске через префикс имя файла/директории ожидаются #без кавычек#. | |
#*# §¦Возможен также запуск без установки: | |
#-# §¦#lua:@@impenv.lua "file.env"#. | |
#-# §¦Аналогично через ~LuaShell~@https://forum.farmanager.com/viewtopic.php?f=15&t=10907@. | |
§¦Внимание: в этом случае использование кавычек обязательно. | |
§¦При необходимости указания символа #<#, он также помещается внутрь кавычек: | |
§¦#lua:@@impenv.lua "<command"# | |
#Формат *.env файлов# | |
# ##comment# | |
# var=value# | |
@ | |
--]] | |
local isWindows = not far.InMyConfig | |
local Info = Info or package.loaded.regscript or function(...) return ... end --luacheck: ignore 113/Info | |
local nfo = Info { _filename or ..., | |
name = "Import environment"; | |
description = "Choose / import *.env files"; | |
version = "0.3"; --https://semver.org/lang/ru/ | |
author = "jd"; | |
url = "https://forum.farmanager.com/viewtopic.php?t=13400"; | |
id = "D23D1FA0-043F-4B77-84FF-6967F87AF481"; | |
minfarversion = {3,0,0,6311,0}; -- win.JoinPath (LuaMacro 823) | |
--disabled = false; | |
options = { | |
envdir = isWindows | |
and win.JoinPath(win.GetEnv("FARPROFILE"), ".env") | |
or far.InMyConfig(".env"), | |
macrokey = "none", | |
}; | |
} | |
if not nfo or nfo.disabled then return end | |
local O = nfo.options | |
local blacklist = {ProgramFiles=true, CommonProgramFiles=true, PROCESSOR_ARCHITECTURE=true, PROMPT=true} | |
local set_pattern = "^([^=]+)=(.-)$" | |
local function importEnv (pathname, cmd) | |
local fp = assert(io.open(pathname, "r")) | |
for line in fp:lines() do | |
if line:sub(1,1)~="#" and line~="" then -- skip comments end empty lines | |
local var,val = line:match(set_pattern) | |
if var then | |
if val=="" then val = nil end | |
if win.GetEnv(var,val)~=val and not (cmd and blacklist[var]) then | |
if cmd then | |
win.WriteConsole(var,"=",val,"\n") | |
end | |
win.SetEnv(var,val) | |
end | |
else | |
fp:close() | |
far.Message("Error reading line:\n"..line.."\n\1\n"..pathname, nfo.name, nil, "lw") | |
return | |
end | |
end | |
end | |
fp:close() | |
return true | |
end | |
local F = far.Flags | |
local selfpath = _filename or ... | |
local selfdir = selfpath:match(isWindows and "^(.*[\\/])" or "^(.*/)") | |
local function chooseEnv (dir) | |
local items = {} | |
far.RecursiveSearch(dir, "*.env>>D", function (item, pathname) | |
table.insert(items, { | |
text = item.FileName, | |
pathname = pathname, | |
}) | |
return nil | |
end) | |
local props = { | |
Title="Import env:", | |
Bottom="(Ctrl+)Enter, F4, F1", | |
Id=win.Uuid("DAF86E93-8153-4C6D-9792-1B6A75520AA8"), | |
} | |
local bkeys = "CtrlEnter F4 F1" | |
repeat | |
local item, pos = far.Menu(props, items, bkeys) | |
if item then | |
local bk = item.BreakKey | |
if pos~=0 then | |
item = items[pos] | |
elseif bk~="F1" then | |
bk = "" | |
end | |
if not bk then | |
if importEnv(item.pathname) then | |
return | |
end | |
elseif bk=="CtrlEnter" then | |
importEnv(item.pathname) | |
item.checked = true | |
elseif bk=="F4" then | |
if F.EEC_MODIFIED==editor.Editor(item.pathname) then | |
item.checked = false | |
end | |
elseif bk=="F1" then | |
far.ShowHelp(selfpath, nil, F.FHELP_CUSTOMFILE) | |
end | |
end | |
props.SelectIndex = pos | |
until not item | |
end | |
local C = far.Colors | |
local F = far.Flags | |
local function printPrompt (curdir,cmdline) | |
local cPrefix = far.AdvControl(F.ACTL_GETCOLOR, C.COL_COMMANDLINEPREFIX) | |
local cCmdline = far.AdvControl(F.ACTL_GETCOLOR, C.COL_COMMANDLINE) | |
local Y = far.AdvControl(F.ACTL_GETCURSORPOS).Y | |
local prefix = curdir..">" | |
far.Text(0, Y, cPrefix, prefix) | |
far.Text(prefix:len(), Y, cCmdline, cmdline) | |
far.Text() | |
win.WriteConsole("\n") | |
end | |
-- .env directory searched in %FARPROFILE% or near the script | |
local function getEnvDir () | |
for _,dir in ipairs { O.envdir, selfdir..".env" } do | |
local attr = win.GetFileAttr(dir) | |
if attr and attr:match("d") then | |
return dir | |
end | |
end | |
end | |
local function processPath (pathname) | |
if pathname=="" then | |
return far.ShowHelp(selfpath, nil, F.FHELP_CUSTOMFILE) | |
elseif pathname=="/envdir" then | |
local envdir = getEnvDir() | |
if envdir then | |
chooseEnv(envdir) | |
else | |
local msg = (".env directory expected in %s or near the script"):format( | |
isWindows and win.GetEnv("FARPROFILE") or far.InMyConfig() | |
) | |
far.Message(msg, nfo.name, nil, "w") | |
end | |
return | |
else | |
local cmdline = pathname:match"^<%s*(.*)" | |
if cmdline then | |
panel.GetUserScreen() | |
local olddir = win.GetCurrentDir() | |
local curdir = far.GetCurrentDirectory() | |
win.SetCurrentDir(curdir) | |
printPrompt(curdir, "env:"..pathname) | |
pathname = far.MkTemp("output") | |
win.system(("%s&&%s>%s"):format(cmdline, isWindows and "set" or "env", pathname)) | |
win.SetCurrentDir(olddir) | |
if win.GetFileAttr(pathname) then | |
importEnv(pathname, true) | |
win.DeleteFile(pathname) | |
end | |
panel.SetUserScreen() | |
return | |
end | |
end | |
local attr,err = win.GetFileAttr(pathname) | |
if err then | |
far.Message(err.."\n\1\n"..pathname, nfo.name, nil, "lw") | |
return | |
end | |
if attr:match("d") then | |
chooseEnv(pathname) | |
else | |
importEnv(pathname) | |
end | |
end | |
if Macro then | |
CommandLine { | |
prefixes="env:"; | |
description="Import environment variables from file"; | |
action=function(_,cmdline) -- expects no quote marks | |
processPath(cmdline) | |
end; | |
} | |
Macro { description="Choose env file to import"; | |
area="Common"; key=O.macrokey; -- to be set in options | |
id="0E285A94-5672-4191-A667-967A8B29ED59"; | |
action=function() | |
processPath("/envdir") | |
end; | |
} | |
-- autoload env from .env\autoload.env | |
local envdir = getEnvDir() | |
local file = envdir and win.JoinPath(envdir, "autoload.env") | |
if file and win.GetFileAttr(file) then | |
importEnv(file) | |
end | |
-- Scripts browser-related routines | |
nfo.help = function () | |
far.ShowHelp(selfpath, nil, F.FHELP_CUSTOMFILE) | |
end | |
nfo.execute = function () | |
processPath("/envdir") | |
end | |
return | |
end | |
if _filename then -- lua:@ or luash: | |
processPath(... or "") | |
else | |
return processPath | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
pagetitle: Import environment — загрузка *.env файлов | |
... | |
<!--HLF: | |
Language = Russian,Russian (Русский); | |
PluginContents = Import environment; | |
TopicHeading = h6; | |
Margin = 1; | |
IndentCode = 4; | |
IndentList = 0; | |
IndentPara = 0; | |
IndentQuote = 4; | |
PlainCode = false; | |
PlainHeading = false; | |
CenterHeading = false; | |
EmptyLinesBeforeTopic = 2; | |
EmptyLinesAfterHeading = 1; | |
EmptyLinesBeforeHeading = 2; | |
HighlightListBullet = true; | |
HighlightListNumber = true; | |
ListBullet = *; | |
--> | |
<!-- | |
.Options CtrlStartPosChar=^| | |
v0.1 | |
--> | |
<!--HLF: PlainHeading = true--> | |
Import environment — загрузка *.env файлов | |
================== | |
<!--HLF: PlainHeading = false--> | |
Функции скрипта | |
--------------- | |
- Запуск из командной строки по префиксу `env:`. | |
Рекомендуется назначить ассоциацию на `*.env`. | |
- При загрузке макросов, может автоматически загружать файл `autoload.env` из | |
пользовательской директории (см.) | |
- Макрос, позволяющий выбрать файл для импорта из списка. | |
Файлы читаются из пользовательской директории. | |
Клавиатурную комбинацию для вызова нужно определить через опцию `macrokey` | |
(по умолчанию не задана). | |
Пользовательская директория | |
--------------------------- | |
По умолчанию: | |
- Windows: `%FARPROFILE%\.env` | |
- Linux (far2m): `far.InMyConfig(".env")` | |
Если эта директория отсутствует, то ищется директория `.env` рядом со скриптом. | |
Значение может быть переопределено через опцию `envdir` | |
(поддерживается _cfgscript_/[ScriptsBrowser]). | |
[ScriptsBrowser]: https://forum.farmanager.com/viewtopic.php?f=15&t=10418 | |
Командная строка | |
---------------- | |
`env:file.env` | |
: Импорт окружения из заданного файла. | |
`env:directory` | |
: Чтение списка *.env-файлов из __заданной__ директории, | |
и выбор файла для импорта из списка. | |
`env:/envdir` | |
: Чтение списка *.env-файлов из __пользовательской__ директории, | |
и выбор файла для импорта из списка. | |
`env:<command` | |
: Запуск команды и импорт изменений из её окружения. | |
`env:` | |
: При запуске без параметров выводится эта справка. | |
Примечания: | |
- При запуске через префикс имя файла/директории ожидаются _без кавычек_. | |
- Возможен также запуск без установки: | |
<!--HLF: ListBullet = -;--> | |
- `lua:@impenv.lua "file.env"`. | |
- Аналогично через [LuaShell]. | |
Внимание: в этом случае использование кавычек обязательно. | |
При необходимости указания символа `<`, он также помещается внутрь кавычек: | |
`lua:@impenv.lua "<command"` | |
[LuaShell]: https://forum.farmanager.com/viewtopic.php?f=15&t=10907 | |
Формат *.env файлов | |
------------------- | |
```shell | |
#comment | |
var=value | |
``` |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# https://github.com/FarManagerLegacy/HelpDown-scripts | |
# required user setting | |
BASE:=D:\repo\HelpDown-scripts | |
PANDOC:=C:\Apps\pandoc\pandoc.exe | |
HTMLTOFARHELP:=$(FARPROFILE)\tools\HtmlToFarHelp\HtmlToFarHelp.exe | |
# plug base Makefile | |
include $(BASE)\Makefile | |
.DEFAULT_GOAL:=hlf | |
# optional local customization | |
#%.hlfhtml: FLAGS+=--lua-filter addRefs.lua | |
#%: FLAGS+= --toc | |
README.md: askai.ru.md | |
@echo $@ | |
@if exist $@ del $@ | |
@ren $< $@ | |
.PHONY: all | |
all: hlf forum README.md |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment