Skip to content

Instantly share code, notes, and snippets.

@johnd0e
Last active August 22, 2024 20:40
Show Gist options
  • Save johnd0e/252e6a3ad7c68ee9d7f31d987f86813f to your computer and use it in GitHub Desktop.
Save johnd0e/252e6a3ad7c68ee9d7f31d987f86813f to your computer and use it in GitHub Desktop.
Far Manager Script: Import environment
--[[
.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
---
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
```
# 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