Haskell 基于环境变量的Xmonad集合布局

Haskell 基于环境变量的Xmonad集合布局,haskell,xmonad,Haskell,Xmonad,假设我有一个env变量IS\u REMOTE。我想有一套布局,如果它是“1”,另一套,如果它不是,或未定义。到目前为止我有 import XMonad import XMonad.Config.Desktop import XMonad.Hooks.ManageDocks import XMonad.Layout.LayoutModifier import XMonad.Layout.MultiColumns import XMonad.Layout.PerWorkspace import XM

假设我有一个env变量
IS\u REMOTE
。我想有一套布局,如果它是“1”,另一套,如果它不是,或未定义。到目前为止我有

import XMonad
import XMonad.Config.Desktop
import XMonad.Hooks.ManageDocks
import XMonad.Layout.LayoutModifier
import XMonad.Layout.MultiColumns
import XMonad.Layout.PerWorkspace
import XMonad.Layout.ThreeColumns
import Data.Maybe
import System.Environment

main = do
  isRemoteEnv <- lookupEnv "IS_REMOTE"
  xmonad $ desktopConfig
    {
      layoutHook = myLayout (fromMaybe "0" isRemoteEnv)
    }

myLayout remote = if remote == "1"
  then onWorkspace "web" (avoidStruts $ (multiCol [1] 1 0.02 (-0.5)) ||| Full) $
       (avoidStruts $ (ThreeColMid 1 0.02 (1/2)) ||| Full)
  else onWorkspace "web" (avoidStruts $ Mirror (multiCol [1] 1 0.02 (-0.5)) ||| Full) $
       (avoidStruts $ Mirror (ThreeColMid 1 0.02 (1/2)) ||| Full)

这里的核心问题来自Haskell缺乏对存在类型或联合类型的一流支持。一个简单得多的例子是
show$if x then'A'else“abc”
无效,即使
if x then show'A'else show“abc”
有效。无论如何,为了解决您的问题,这不是很漂亮,但它很有效:

import XMonad
import XMonad.Config.Desktop
import XMonad.Hooks.ManageDocks
import XMonad.Layout.LayoutModifier
import XMonad.Layout.MultiColumns
import XMonad.Layout.PerWorkspace
import XMonad.Layout.ThreeColumns
import Data.Kind
import Data.Maybe
import System.Environment

main = do
  isRemoteEnv <- lookupEnv "IS_REMOTE"
  case myLayout (fromMaybe "0" isRemoteEnv) of Layout c -> xmonad $ desktopConfig {
      layoutHook = c
    }

myLayout remote = if remote == "1"
  then Layout $ onWorkspace "web" (avoidStruts $ (multiCol [1] 1 0.02 (-0.5)) ||| Full) $
       (avoidStruts $ (ThreeColMid 1 0.02 (1/2)) ||| Full)
  else Layout $ onWorkspace "web" (avoidStruts $ Mirror (multiCol [1] 1 0.02 (-0.5)) ||| Full) $
       (avoidStruts $ Mirror (ThreeColMid 1 0.02 (1/2)) ||| Full)
导入XMonad
导入XMonad.Config.Desktop
导入XMonad.Hooks.ManageDocks
导入XMonad.Layout.LayoutModifier
导入XMonad.Layout.MultiColumns
导入XMonad.Layout.PerWorkspace
导入XMonad.Layout.ThreeColumns
导入数据。种类
导入数据,也许吧
导入系统。环境
main=do
isRemoteEnv xmonad$desktopConfig{
layoutHook=c
}
myLayout remote=如果remote==“1”
然后布局$onWorkspace“web”(avoidStruts$(Multicl[1]1 0.02(-0.5))| | |完整)$
(avoidStruts$(三分之一0.02(1/2))| | |满)
else布局$onWorkspace“web”(avoidStruts$Mirror(Multicl[1]1 0.02(-0.5))| | |完整)$
(avoidStruts$Mirror(三个Colmid 1 0.02(1/2))| | |满)

它用于使两个分支成为相同的类型。

这里的核心问题来自Haskell对存在类型或联合类型缺乏一流的支持。一个简单得多的例子是
show$if x then'A'else“abc”
无效,即使
if x then show'A'else show“abc”
有效。无论如何,为了解决您的问题,这不是很漂亮,但它很有效:

import XMonad
import XMonad.Config.Desktop
import XMonad.Hooks.ManageDocks
import XMonad.Layout.LayoutModifier
import XMonad.Layout.MultiColumns
import XMonad.Layout.PerWorkspace
import XMonad.Layout.ThreeColumns
import Data.Kind
import Data.Maybe
import System.Environment

main = do
  isRemoteEnv <- lookupEnv "IS_REMOTE"
  case myLayout (fromMaybe "0" isRemoteEnv) of Layout c -> xmonad $ desktopConfig {
      layoutHook = c
    }

myLayout remote = if remote == "1"
  then Layout $ onWorkspace "web" (avoidStruts $ (multiCol [1] 1 0.02 (-0.5)) ||| Full) $
       (avoidStruts $ (ThreeColMid 1 0.02 (1/2)) ||| Full)
  else Layout $ onWorkspace "web" (avoidStruts $ Mirror (multiCol [1] 1 0.02 (-0.5)) ||| Full) $
       (avoidStruts $ Mirror (ThreeColMid 1 0.02 (1/2)) ||| Full)
导入XMonad
导入XMonad.Config.Desktop
导入XMonad.Hooks.ManageDocks
导入XMonad.Layout.LayoutModifier
导入XMonad.Layout.MultiColumns
导入XMonad.Layout.PerWorkspace
导入XMonad.Layout.ThreeColumns
导入数据。种类
导入数据,也许吧
导入系统。环境
main=do
isRemoteEnv xmonad$desktopConfig{
layoutHook=c
}
myLayout remote=如果remote==“1”
然后布局$onWorkspace“web”(avoidStruts$(Multicl[1]1 0.02(-0.5))| | |完整)$
(avoidStruts$(三分之一0.02(1/2))| | |满)
else布局$onWorkspace“web”(avoidStruts$Mirror(Multicl[1]1 0.02(-0.5))| | |完整)$
(avoidStruts$Mirror(三个Colmid 1 0.02(1/2))| | |满)

它用于使两个分支成为同一类型。

@DanielWagner这似乎不起作用,不幸的是:
没有因使用'xmonad'而产生的(读取(布局窗口))实例。
它起作用!谢谢你的帮助!您能解释一下为什么在我的原始代码中,
desktopConfig
之后的
{
可以在下一行,但不能在您的版本中使用吗?@MetroWind与布局有关。对不起,我不太清楚确切的原因。@DanielWagner这似乎不起作用,不幸的是:
没有(读取(布局窗口))的实例由于使用了“xmonad”
它很有效!谢谢你的帮助!你能解释一下为什么在我的原始代码中,
desktopConfig
之后的
{
可以在下一行,但在你的版本中不能?@MetroWind与布局有关。对不起,我不太清楚确切的原因。