Как распределить PTY с помощью встряски?

#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 . Спасибо за объяснение.