ध्यान दें कि आधार 4.7.0 अब System.Environment
में एक setEnv
है। तो वर्तमान या निकट भविष्य के लिए इसे हल किया गया है।
हालांकि अगर आपको < 4.7.0 (जो वर्तमान में मेरा मामला है) में इस सुविधा की आवश्यकता है, तो मैंने इस काम को पुराने बेस संस्करण के साथ बनाने के लिए आवश्यक कार्यों को the commit that adds the feature से निकाला है।
हालांकि मैं गंभीरता से इस पर धैर्य खो दिया है और यह नहीं बल्कि बदसूरत किया, लेकिन यह मेरे लिए काम करता ...
गड़बड़ एक विंडोज़ वातावरण में कॉल करने के लिए 3 कार्यों देखते हैं कि है: putenv
, SetEnvironmentVariableA
(ASCII) और SetEnvironmentVariableW
(वाइडचर, 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
जाहिर CPP
का उपयोग केवल खिड़कियों के लिए एक #ifdef
में पूरी बात डाल करने के लिए। जैसा कि आप देख सकते हैं कि मेरे पास विस्तृत कॉल के लिए कोड है, लेकिन मैंने वर्तमान में टिप्पणी की। मुझे लगता है कि मेरे उपयोग के मामले में यह शायद putenv
पर कॉल करने के लिए पर्याप्त होगा, लेकिन यह ठीक है जैसे यह काम करता है। तो यहाँ मैं इसे कैसे तो फोन है:
setEnv_ "LANG" localeStr
putEnv $ "LANG=" ++ localeStr
मेरे समस्या यह है कि मैं घर पर मुख्य रूप से एक linux उपयोगकर्ता हूँ और मैं घर पर खिड़कियों पर बहुत ज्यादा काम कर रही है पसंद नहीं है, और मैं एक बहुत डाल इस और अन्य चीजों को विंडोज़ पर ठीक से काम करने के लिए ऊर्जा का, और मैं इसे आगे साफ करने के लिए खुद को नहीं ला सकता हूं। लेकिन इस कोड और मूल पैच के साथ आपको इसे बिना किसी समस्या के बेस < 4.7 पर काम करने के लिए मिलना चाहिए।
स्रोत
2014-06-29 07:35:23
ध्यान दें कि आधार 4.7.0 अब एक 'setEnv' है। –
@EmmanuelTouzery: बहुत बढ़िया। क्या आप इसे बढ़ी हुई दृश्यता के उत्तर के रूप में डाल सकते हैं? धन्यवाद। –