LINUX.ORG.RU

vim - переменные окружения DOS

 


2

1

Привет всем.

У меня небольшой вопросик по Виму в мастдае. Только не кидайтесь сразу тапками за оффтопик - на тематических форумах нихрена не знают про Вим, нагуглить ничего не смог. Видимо надо какой-то парсер делать, но чую - должен быть способ проще!

Я «кропаю» мультиплатформенную софтину, основное окружение в Арчике - тут проблем нет, все гладко. А вот при компиляции в оффтопике, когда возникают шероховатости случается править код не меняя платформу, благо Vim прекрасно чувствует себя везде.

Чтобы не засорять ось, при запуске компилятора (mingw make gcc) я использую пакетный файл настройки окружения, в котором прописаны пути к библиотекам и бинарникам. Например «env.cmd»:

SET "_DEV=F:\cDev\"
SET "_LIBS=%_DEV%ext_libs"
SET "_MINGW=%_DEV%MinGW\i686-6.2.0-release-posix-dwarf-rt_v5-rev0\mingw32\"
SET "PATH=%_MINGW%bin;%_MINGW%opt\bin;%PATH%"

ВОПРОС: Кто-нибудь знает простой способ, как считать вимом переменные окружения из такого пакетного файла, чтобы настроить корректно сессию. Например типа (".vim" в папке проекта):

if match($OS, "Windows") > -1
	let g:syntastic_cpp_compiler=$_MINGW."/bin/c++.exe"
endif

Так не работает, потому что объявленные переменные живуют только во время компиляции и при запуске Вима Ось их уже не знает (дабы не засоряться).



Последнее исправление: bigov (всего исправлений: 1)

Из справки «H shell»:

Executing shell commands in a window			*shell-window*

There have been questions for the possibility to execute a shell in a window
inside Vim.  The answer: you can't!  Including this would add a lot of code to
Vim, which is a good reason not to do this.  After all, Vim is an editor, it
is not supposed to do non-editing tasks.

неужели только парсер?

bigov
() автор топика
Ответ на: комментарий от bigov

А чем не устраивает сделать командный файл, который загружает содержимое env.cmd, а потом запускает Vim?

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Как вариант, наверно да, надо будет попробовать. Сейчас у меня пока просто дублируются в конфиге Вима в папке проекта необходимые переменные.

bigov
() автор топика
Ответ на: комментарий от habamax

Не то, да.

Из коробки нет, но можно за полчаса накидать скрипт и повесить на автоцмд.

habamax ★★★
()
Ответ на: комментарий от habamax

Да, нет привязки к .cmd - файлу. А как выдернуть по-быстрому строку из текстового файла в переменную Вима? Что-нибудь на базе типа «vimgrep»?

bigov
() автор топика

В общем, два варианта. Первый предложил xaizek, второй - парсер на Lua:

function! GetEnv(fname, varname)
lua <<EOF
  param = "SET \"" .. vim.eval('a:varname') .. "="
  for line in io.lines(vim.eval('a:fname')) do
    if string.find(line, param) then
      vim.command("let r='"..string.sub(line,string.len(param)+1, -2).."'")
    end
  end
EOF
return r
endfunction

let g:env=GetEnv("env.cmd", "_MINGW")

кто может проще, прошу высказаться.

bigov
() автор топика
Ответ на: комментарий от bigov

Рабочий вариант с использованием рекурсии:

lua <<EOF
function v(fName, env)
-- поиск в файле, указанном через fName, значения переменной окружения,
-- указанной в формате "%ENV%". Предполагается, что переменная окружения
-- задается строкой с использованием двойных кавычек в виде
--
-- 	SET "_MINGW=C:\i686-6.2.0-release-posix-dwarf-rt_v5-rev0\mingw32\"
--
  vName = string.sub(env, 2, -2)
  template = "SET \"" .. vName .. "="
  for line in io.lines(fName) do
    if string.find(line, template) then
      REZ = string.sub(line, string.len(template)+1, -2)
      rec = string.match(REZ, "%%.+%%")
      -- Тут проверяем, нет-ли в строке результата еще переменных окружения
      -- Если есть, то рекурсивно заменяем их на их значения
      if rec then
        return string.gsub(REZ, "%%.+%%", v(fName, rec), 1)
      end
      return REZ
    end
  end
  return "ERROR: variable "..env.." not found."
end
EOF

function! GetEnv(fname, varname)
:lua vim.command("let r='" ..v(vim.eval('a:fname'), vim.eval('a:varname')).."'")
return r
endfunction

let g:mingw=GetEnv("../env.cmd", "%_MINGW%")

bigov
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.