#haskell #shake-build-system
Вопрос:
Я пытаюсь интерактивно запустить команду из своего сценария сборки:
#!/usr/bin/env stack
{- stack
script
--resolver lts-18.8
--ghc-options -Wall
-}
import Development.Shake
main :: IO ()
main = shakeArgs shakeOptions $ do
phony "cfg" $ do
command_ [] "vim" []
Но это не работает. Я полагаю, мне нужно выделить терминал, чтобы иметь возможность запускать vim в интерактивном режиме. Как я могу это сделать?
Комментарии:
1. Для какой операционной системы ??? В Linux, если ваш процесс не может быть запущен в терминале, переданном сверху, вы обычно используете что-то подобное
xterm -e /bin/bash -c "/usr/bin/vim fileName"
. Можно улучшить, указав xterm, какой шрифт использовать, и т. Д…
Ответ №1:
Shake
Функции для выполнения команд ( command
и cmd
т.д.) Предназначены для пакетных команд, которые выполняются без взаимодействия с пользователем. Хотя есть вещи, которые вы можете сделать, чтобы сделать их более совместимыми с чем-то вроде Vim (например InheritStdin
), вероятно, есть аспекты Shake, которые усложнят задачу (например, захват stderr, что может привести к утечке памяти).
К счастью, Shake может так же хорошо работать с входящими функциями System.Process
, поэтому вместо вызова command
вы можете написать:
liftIO $ System.Process.createProcess $ System.Process.shell "vim"
Запись createProcess
принимает множество параметров, связанных с процессами, поэтому ее можно настроить для работы Vim.
Комментарии:
1. Да, именно это я и сделал в конце концов:
createProcess $ proc "vim" [] >>= (_, _, _, ph) -> waitForProcess ph
. Спасибо за объяснение.