🌿

komorebiを導入してみる

2022/08/26に公開

komorebiを導入してみる

筆者は普段manjaro/i3wmで開発をしている。

しかし、Windowsを使わざるを得なくなってしまったので、Windowsで使えるTiling WMを探した所、komorebiを見つけた。

この記事はkomorebiの導入と個人的に詰まった所をまとめたものである。

インストール

筆者はWindowsのアプリケーション管理にwingetを使っている。

komorebiは2022/08/26現在wingetを使ったインストールに対応していないのでGithub Releaseからダウンロードする。

以下はpowershellを使ってダウンロードするスクリプトである。

$UserProfile = $env:USERPROFILE
$MyAppDir = (Join-Path -Path $HOME -ChildPath "apps")

$komorebiRelease = Invoke-RestMethod -uri "https://api.github.com/repos/LGUG2Z/komorebi/releases/latest"
$komorebiReleaseInfo = $komorebiRelease.assets | Where { $_.browser_download_url.EndsWith(".zip") } | Select -First 1
$outFile = (Join-Path -Path $UserProfile -ChildPath "downloads" | Join-Path -ChildPath $komorebiReleaseInfo.name)
Invoke-WebRequest -Uri $komorebiReleaseInfo.browser_download_url -OutFile $outFile
Expand-Archive -LiteralPath $outFile -Destination (Join-Path -Path $MyAppDir -ChildPath "komorebi")
Remove-Item $outFile -Recurse

起動

インストール先にPATHを通した上でkomorebic startでkomorebiが起動する。

終了はkomorebic stopでできる。

ログイン時に自動でkomorebiが起動するように、筆者は次のようなスクリプトを書いている。

function Create-ShortCut {
    param([string]$Source, [string[]]$Arguments, [string]$Destination, [int]$WindowStyle)
    $WScriptShell = New-Object -ComObject WScript.Shell
    $executableName = Split-Path $Source -Leaf
    $name = $executableName.SubString(0, $executableName.LastIndexOf("."))
    $dst = Join-Path -Path (Resolve-Path -Path $Destination) -ChildPath ($name + ".lnk")
    $Shortcut = $WScriptShell.CreateShortcut($dst)
    $Shortcut.Targetpath = $Source
    if ($Arguments.count -gt 0) {
        $Shortcut.Arguments = $Arguments -join " "
    }
    if ($WindowStyle -gt 0) {
        # 1: normal
        # 3: maximize
        # 7: minimize
        $Shortcut.WindowStyle = $WindowStyle
    }
    $Shortcut.Save()

    Write-Host "Generate shortcut as $dst"
}

Create-ShortCut -Source (Join-Path -Path $MyAppDir -ChildPath "komorebi" | Join-Path -ChildPath "komorebic.exe")`
                -Arguments "start" `
                -Destination (Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders').StartUp `
                -WindowStyle 7

設定

komorebiのキーバインドはすべてAutoHotKeyを使って設定する。

komorebiのインストール時にAutoHotKeyがインストールされるわけではないので、これもwingetでインストールする。

winget install --exact --id Lexikos.AutoHotKey

設定ファイルはデフォルトだとkomorebi.exekomorebic.exeと同階層にあるkomorebi.ahkであることが期待される。

これを変更するには環境変数KOMOREBI_CONFIG_HOMEにディレクトリへのパスを設定し、そのディレクトリの下にkomorebi.ahkを置くことでkomorebic startの実行時に自動でファイルが読み込まれる。

komorebi.ahkの雛形はkomorebic.exeと同じ階層にkomorebi.sample.ahkがあるので、これを参考にするとよさそう。

筆者のkomorebi.ahkgithubのdotfilesリポジトリで管理している。

詰まったところ

  • wingetでインストールしたAutoHotKeyにパスが通っていない
    筆者の環境ではwingetでインストールしたアプリにパスが通っていないことがある。
    そのため、必要に応じて以下のコマンドでPATHを追加する。
[Environment]::SetEnvironmentVariable("PATH", $Env:PATH + ";" + (Join-Path -Path $Env:ProgramW6432 -ChildPath "AutoHotKey"), [EnvironmentVariableTarget]::Machine)
  • PowerToysのkeyboard managerとの同時使用
    PowerToys keyboard managerとkomorebi(AutoHotKey)を同時に使うとPowerToys側が優先される。
    そのため、同じキーに対してマッピングをする際には注意が必要。

  • Win+lにマッピングしたい
    デフォルトのwindowsの挙動ではWin+lのキーにはスクリーンのロックがマッピングされている。
    これはPowerToysでも上書きできないので、レジストリを書き換えて無効化する。

reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\system" /v "DisableLockWorkstation" /t REG_DWORD /d "1" /f

これを他のキーにリマップするには若干面倒な手順を踏まないと実現できない。
1. キー押下時にLockWorkStationを有効化する
2. DllCall("user32\LockWorkStation")
3. 再度無効化する
のような手順が必要だが、komorebiのプロセスが管理者権限のあるプロンプトで起動されていない場合はキー押下時に確認が入るのでなんとかしたい。(まだ解決策を見つけられていない)

環境

エディション Windows 10 Pro
バージョン 21H1

$ komorebi --version
komorebi 0.1.12

$ winget --version
v1.3.2091

Discussion