ここで、ベース4.7.0は、setEnv
がSystem.Environment
にあることに注意してください。したがって、現在または近い将来、それは整理されます。
< 4.7.0でこの機能が必要な場合(現在のケースです)、私はthe commit that adds the featureから、以前のベースバージョンでこの作業を行うために必要な機能も抽出しました。
私は真剣にこの1に忍耐を失い、それはかなり醜いでしたが、それは私の作品が
...
混乱は、Windows環境で呼び出すための3つの機能があるということです:putenv
、SetEnvironmentVariableA
(ASCII)およびSetEnvironmentVariableW
(widechar、utf16)。 4.7をベースにしたパッチは自動的にこれを行いますが、私は時間の不足でもっと醜い何かをしました(私はまだそれをきれいにするかもしれません)。ここで
は、私が持っているものだ:明らか
setEnv_ :: String -> String -> IO()
setEnv_ key value = withCString key $ \k -> withCString value $ \v -> do
success <- c_SetEnvironmentVariable k v
unless success (throwGetLastError "setEnv")
putEnv :: String -> IO()
putEnv v = void (withCString v $ \vv -> c_putenv vv)
foreign import stdcall unsafe "windows.h SetEnvironmentVariableA"
c_SetEnvironmentVariable :: CString -> CString -> IO Bool
-- SetEnv_ :: String -> String -> IO()
-- SetEnv_ key value = withCWString key $ \k -> withCWString value $ \v -> do
-- success <- c_SetEnvironmentVariable k v
-- unless success (throwGetLastError "setEnv")
--
-- Foreign import stdcall unsafe "windows.h SetEnvironmentVariableW"
-- c_SetEnvironmentVariable :: LPTSTR -> LPTSTR -> IO Bool
foreign import ccall unsafe "putenv" c_putenv :: CString -> IO CInt
Windowsのみ#ifdef
に全部を入れてCPP
を使用しています。あなたが見ることができるように、私はwidechar呼び出しのコードを持っていますが、私はそれを現在コメントしています。私は私の使用ケースではおそらくちょうどputenv
を呼ぶだけで十分だろうと思うが、うまく動作する。だからここに私はそれを呼び出す方法は次のとおりです。
setEnv_ "LANG" localeStr
putEnv $ "LANG=" ++ localeStr
私の問題は、私は主に自宅でLinuxのユーザーだと私は自宅でWindows上であまりにも多くの仕事をやって好きではない、と私は多くを置くということです窓の上でこれと他のものが適切に機能するようにするためのエネルギーが必要です。これをさらに清掃することはできません。しかし、このコードとオリジナルのパッチでは、これは基本的に< 4.7で動作するはずです。
ベース4.7.0に 'setEnv'が追加されました。 –
@EmmanuelTouzery:Awesome。可視性を高めるための答えとしてそれを入れてもいいですか?ありがとう。 –