Arch Linux での sway デスクトップ環境の構築

2022年11月29日 2022年12月9日

みなさん、デスクトップ環境はどのようなものを使っていますか?昨今、選択肢は色々ありますね。 OS は、Windows、macOS、Linux、その他色々ありますし、ウィンドウマネージャとしてもスタック型、タイル型が候補にあがります。

私は OS 別に以下のように使いわけています。

  • Linux(正確には Arch Linux)
    • なるべくキーボードのみで操作を完結したいので、タイル型ウィンドウマネージャを使用
    • Wayland と sway の組合せ
  • macOS
    • Linux でどうしても実現できない時に使用
    • Linux と操作感を合わせるため、yabai と skhd を使用
  • Windows
    • 行政手続き等で必要な時のみ使用するのでデフォルトから変更なし

デスクトップ環境は十人十色であり、自分用にカスタマイズしている人も大勢いると思います。 私もカスタマイズしていますし、他の人のデスクトップ環境にも大変興味があります。

そこで、この記事では私がメインで使用している Arch Linux での sway デスクトップ環境の構築について少し細かく紹介します。 通常はシェルスクリプトでほぼ全自動で構築するようにしています。長丁場になりますので、興味のある部分だけ読んでいただいても良いかもしれません。

私のデスクトップ環境は、以下のような感じでテーマを Nord 風に統一しています。

では、始めます!

Arch Linux のインストール

まずは大前提の Arch Linux のインストールです。 既にArch Linux のインストールで紹介していますので、割愛します。私の記事よりも Arch Wiki の Installation guide のほうが最新の手順ですので、私の記事は参考程度で良いと思います。

アカウント設定

Arch Linux のインストール直後は、root アカウントのみ存在しています。このアカウントを一般利用するのはセキュリティ的に微妙ですので、一般利用のためのアカウントを作成します。

まず、wheel グループに所属するアカウントを作成してパスワードを設定します:

Terminal
# アカウント作成
useradd -m -G wheel <作成するユーザ名>

# パスワード設定
passwd <作成したユーザ名>

次にwheel グループに所属しているアカウントに sudo を許可にします。

visudo を実行して:

Terminal
# EDITOR が nao で起動
visudo

# 既に vim をインストールしているなら、EDITOR を vim に指定
EDITOR=vim visudo

以下アンコメントします:

Terminal
%wheel    ALL=(ALl:ALL) ALL

これで sudo を実行できる一般利用のためのアカウントが作成できました。

今後の作業は作成した一般ユーザで行いますので、一旦、root アカウントからログアウトして、一般ユーザでログインしなおします。

システム領域の設定

ネットワーク設定

私は基本的に有線LANを利用しますので、以下は有線LAN前提の手順です。wifi接続の場合は Arch Wiki を参考に設定してください。

名前解決サービスの有効化及び起動

名前解決サービスとして systemed-resolve を有効化及び起動します:

Terminal
sudo systemctl start systemd-resolved.service
sudo systemctl enable systemd-resolved.service

# resolve.conf の変更
sudo mv /etc/resolv.conf /etc/resolv.conf.org
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

ネットワーク設定管理サービスの有効化及び起動

次はネットワーク設定管理のサービスです。 Arch Linux では systemd-networkd を使って CUI で管理できますが、サーバ環境ではなくクライアント環境なので、GUI でも管理できるようするために NetworkManager で管理します。

NetworkManager をインストールするために、一時的に systemd-networkd を起動します:

Terminal
sudo systemctl start systemd-networkd.service

ルータがDHCPサービスを提供しているならば、これでネットワークに接続されます。 そして、NetworkManager をインストールして、systemd-networkd の代わりに NetworkManager を有効化及び起動します:

Terminal
# NetworkManager のインストール
sudo pacman -S networkmanager

# systemd-networkd の停止
sudo systemctl stop systemed-networkd.service

# NetworkManager の起動及び有効化
sudo systemctl start NetworkManager.service
sudo systemctl enable NetworkManager.service

これでネットワーク設定は完了です。

時刻の同期設定

systemd-timesyncd でデスクトップ環境のシステム時刻を自動で同期させます:

Terminal
sudo systemctrl start systemd-timesyncd.service
sudo systemctrl enable systemd-timesyncd.service

Pacman の設定

Pacman の設定をします。この設定は必ずしも行う必要はありませんが、行うと便利なので私はやっています。詳細は Arch Wiki を参照ください。

アップデート対象のバージョン比較

/etc/pacman.confVerbosePkgLists をアンコメントすると、以下のように利用可能なパッケージの新旧バージョンの比較できます。

Terminal
Package (6)             Old Version  New Version  Net Change  Download Size

extra/libmariadbclient  10.1.9-4     10.1.10-1      0.03 MiB       4.35 MiB
extra/libpng            1.6.19-1     1.6.20-1       0.00 MiB       0.23 MiB
extra/mariadb           10.1.9-4     10.1.10-1      0.26 MiB      13.80 MiB

並列ダウンロードの有効化

並列ダウンロードを有効化するために、/etc/pacman.confParallelDownloads = 5 をアンコメントします。

カラー化

カラー表示をするために、/etc/pacman.confColor をアンコメントします。

パッケージのキャッシュ削除

pacman ではダウンロードしたパッケージをキャッシュするので、少しずつ古いパッケージがたまります。キャッシュはダウングレードしたい場合に便利ですが容量を喰うので、 paccache コマンドをインストールして、定期的にキャッシュの新しいバージョンを3つ残して削除します:

Terminal
# paccache を含むパッケージのインストール
sudo pacman -S pacman-contrib

# パッケージのキャッシュ削除の起動及び自動化
sudo systemctl start paccache.timer
sudo systemctl enable paccache.timer

ファイルシステムのメンテナンス

ssd

ssd に Arch Linux をインストールしている場合は、trim を有効にします:

Terminal
sudo systemctl enable fstrim.timer

Btrfs

ファイルシステムに Btrfs を採用している場合は、scrub を有効にします:

Terminal
# root(/)
sudo systemctl enable btrfs-scrub@-.timer

# /home を直接マウントしている場合は以下のコマンドも実施
# sudo systemctl enable btrfs-scrub@home.timer

便利なパッケージのインストール

後続の手順で利用するパッケージや便利なパッケージを一括でインストールします:

Terminal
sudo pacman -S git wget man-db man-pages unarchiver duf htop iotop sysstat jq neofetch rsync httpie cmake vim

CUI領域の設定

ここからは主に CUI の操作性等に関わる設定を行います。

zsh

シェルは bash、zsh、fish 等色々ありますが、私は zsh をインストールします:

Terminal
# zsh のインストール
sudo pacman -S zsh

# login shell を zsh 変更
chsh -s /bin/zsh

zsh の設定を詳しく紹介すると膨大になるので、割愛して便利なzshプラグインのみ紹介します。 なお、プラグインの読み込みは時間が少しかかるので、prompt に関わるプラグイン以外は遅延ロードしています。

  • git-prompt git の status を prompt に表示してくれます。

  • enhancd cdコマンドを拡張してくれます。

  • zsh-syntax-highlighting コマンドライン上でシンタックスハイライトを有効にしてくれます。

  • zsh-abbr コマンドライン上で略語を展開してくれます。 alias と似ていますが、違いはコマンド履歴として略語展開後のコマンドが記録されます。 私はコマンドによって alias と abbr を使いわけています。

    Terminal
    # alias の場合
    ## 登録
    alias gc="git checkout"
    
    ## 実行
    gc
    ## command history には gc と記録される
    
    # abbrの場合
    ## 登録
    abbr gc="git checkout"
    ## 実行
    gc # -> "git checkout"に展開される
    ## コマンド履歴には git checkout と記録される
  • zsh-autosuggestions コマンド履歴を元にグレーでコマンドを補完してくれます。

  • zsh-completions zsh 向けのコマンド補完の定義を追加してくれます。

  • zsh-autocomplete tab を押さなくても補完候補を自動で表示してくれます。常に補完が表示されるので、情報量が多すぎることもありますが、新しい気付きもあるので私は有効にしています。 なお、このプラグインはキーバインドを大きく変更してくるので、私は以下のように、再度キーバインドを上書きしています。

    ~/.config/zsh/zsh_defer.zsh
      bindkey '^P' history-beginning-search-backward-end
      bindkey '^N' down-line-or-select
      bindkey -M menuselect '^P' vi-up-line-or-history
      bindkey -M menuselect '^N' vi-down-line-or-history
      bindkey -M menuselect '\r' accept-line

参考までに私の zsh の設定ファイルのリンクを貼っておきます。

また、上記の設定ファイルを有効化するために、以下を実施しています。

  • ~/.zshenv に以下の行を追加:
    ~/.zshenv
    # zsh
    export ZDOTDIR="${HOME}/.config/zsh"
    export ZSH_COMPLETION_DIR="${HOME}.local/share/zsh/completion"
    export PATH="${HOME}/.local/bin:$PATH"
  • 必要なディレクトリの作成とプラグインマネージャ(zinit)の git clone
    Terminal
    # zsh state directory
    mkdir -p ~/.local/state/zsh
    # zsh completion directory
    mkdir -p ~/.local/share/zsh/completion
    # zinit repository directory
    mkdir -p ~/.local/share/zinit/zinit.git
    # zinit clone
    git clone https://github.com/zdharma-continuum/zinit.git ~/.local/share/zinit/zinit.git

ここで一度端末を再起動して、zsh を login shell として読み込みます。以降は zsh 上でコマンドを実行していきます。

XDG Base Directory

ホームディレクトリ(~)が散らかるのが嫌なので、XDG Base Directory に則って設定ファイル等を配置します。

まず環境変数として、XDG Base Directory を ~/.zshenv に追記します:

~/.zshenv
export XDG_CONFIG_HOME="${HOME}/.config"
export XDG_CACHE_HOME="${HOME}/.cache"
export XDG_DATA_HOME="${HOME}/.local/share"
export XDG_STATE_HOME="${HOME}/.local/state"

設定した環境変数を読み込みます:

Terminal
source ~/.zshenv

最後に、XDG Base Directory を作成します:

Terminal
mkdir -p $XDG_CONFIG_HOME
mkdir -p $XDG_CACHE_HOME
mkdir -p $XDG_DATA_HOME
mkdir -p $XDG_STATE_HOME

# ついでに作成
mkdir -p "${HOME}/.local/bin"
mkdir -p "${HOME}/.local/src"

これで XDG Base Directory の準備が完了しました。各種設定ファイルは可能な限り XDG Base Directoryに配置します。

go

後続の AUR Helper の yay で go を利用するので、go のインストールと設定を行います。

go をインストールします:

Terminal
sudo pacman -S go

goの path を ~/.zshenv に追記します:

~/.zshenv
export GOPATH="${XDG_DATA_HOME}/go"
export PATH="${PATH}:${GOPATH}/bin"

設定した path を読み込みます:

Terminal
source ~/.zshenv

AUR Helper

Arch Linux には便利な Arch User Repository(AUR) が存在しますので、AUR を利用するために AUR Helper をインストールします。 私は yay を使っていますが、比較表があるので、好みの AUR Helper をインストールしてください。

Terminal
# yay のインストール
cd ~/.local/src
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si

fzf

fuzy finder として fzf をインストールします。

Terminal
# fzfリポジトリのクローン
git clone --depth 1 "https://github.com/junegunn/fzf.git" "${XDG_DATA_HOME}/fzf"
# fzf のインストール
"${XDG_DATA_HOME}/fzf/install" --xdg --completion --key-bindings --no-update-rc --no-bash --no-fish

tmux

ターミナルマルチプレクサとして tmux をインスールします。私は tmux がないと作業効率が著しく低下します。

tmux 及びプラグインマネージャをインストールします:

Terminal
# tmux のインストール
sudo pacman -S tmux
# プラグインマネージャのインストール
git clone https://github.com/tmux-plugins/tpm ~/.config/tmux/plugins/tpm

tmux の設定も zsh 同様多岐に渡るので、設定ファイルのリンクのみ置いておきます。 ちなみに私は「tmux の prefixキーは”Ctrl+q”派」です。

ターミナル上で、"tmux prefix" 押下後に Shift+i を押下すると、tmux.conf に記載しているプラグインがインストールされます。

tmux の最近のおすすめ機能は、tmux 上でポップアップを表示させる popup という機能です。嬉しいことに画面を分割していても、分割を無視して中央にポップアップが表示されるので、fzf の絞り込み結果等を popup で表示するととても便利です。ぜひ「tmux fzf popup」等で検索してみてください。

git

既に何度か git を使ってきましたが、ここで git の設定をしておきます。

まず設定ファイルを XDG Base Directory に作成します:

Terminal
# directory の作成
mkdir -p ~/.config/git
# 既に ~/.gitconfig が存在するならば、移動
mv .gitconfig ~/.config/git/config
# ~/.gitconfig が存在しないならば、~/.config/git/config を作成
touch ~/.config/git/config

以下の通り git の設定をします:

Terminal
# pull.rebase を false に
git config --global pull.rebase false
# default branch を main に
git config --global init.defaultBranch main

# git のユーザ名とメールを設定
git config --global user.name "<your name>"
git config --global user.email "<your email>"

# Optional:以下は sshで github に接続している場合のみ設定します。
# git config --global url.git@github.com:.insteadOf https://github.com/

# Optional:以下は delta を使っている場合設定します。
# gitのdiffを delta を使って表示
# git config --global delta.navigate true
# git config --global delta.light false
# git config --global delta.line-numbers true

Emacs

メインエディタとして Native compilation を有効にした Emacs をインストールします:

Terminal
sudo pacman -S emacs-nativecomp

Emacs の設定も zsh 同様多岐に渡るので、設定ファイルのリンクのみ置いておきます(Emacs は楽しい)。

Vim

私は設定ファイルを編集する際に Vim を使うことが多いです。 Vim は既に Arch Linux のインストール時にインストールしましたので、ここでは設定ファイルのみです。

設定ファイルを XDG Base Directory で管理するために、以下を ~/.zshenv 及び ~/.config/vim/vimrc に追記します。

~/.zshenv
export VIMINIT='let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc" | source $MYVIMRC'
~/.config/vim/vimrc
set runtimepath^=$XDG_CONFIG_HOME/vim
set runtimepath+=$XDG_DATA_HOME/vim
set runtimepath+=$XDG_CONFIG_HOME/vim/after

set packpath^=$XDG_DATA_HOME/vim,$XDG_CONFIG_HOME/vim
set packpath+=$XDG_CONFIG_HOME/vim/after,$XDG_DATA_HOME/vim/after

let g:netrw_home = $XDG_DATA_HOME."/vim"
call mkdir($XDG_DATA_HOME."/vim/spell", 'p')

set backupdir=$XDG_STATE_HOME/vim/backup | call mkdir(&backupdir, 'p')
set directory=$XDG_STATE_HOME/vim/swap   | call mkdir(&directory, 'p')
set undodir=$XDG_STATE_HOME/vim/undo     | call mkdir(&undodir,   'p')
set viewdir=$XDG_STATE_HOME/vim/view     | call mkdir(&viewdir,   'p')

if !has('nvim') | set viminfofile=$XDG_STATE_HOME/vim/viminfo | endif

設定した変数を読み込みます:

Terminal
source ~/.zshenv

Vim の設定も zsh 同様多岐に渡るので、設定ファイルのリンクのみ置いておきます(Vim も楽しいと思う)。

Rust

Rust 製の便利なパッケージをインストールします。

Rustのインストール

rustup で Rust のインストールを行います。 まず、Rust の path を ~/.zshenv に追記します:

~/.zshenv
export RUSTUP_HOME="${XDG_DATA_HOME}/rustup"
export CARGO_HOME="${XDG_DATA_HOME}/cargo"
[ -d $CARGO_HOME ] && . "${CARGO_HOME}/env"

設定した path を読み込みます:

Terminal
source ~/.zshenv

rustup で Rust をインストールします:

Terminal
# cargo の directory 作成
mkdir -p $CARGO_HOME
# rustupのインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --no-modify-path -y

パッケージインストール

便利なパッケージをインストールします:

Terminal
"${CARGO_HOME}/bin/rustup" run stable cargo install bat fd-find ripgrep git-delta lsd du-dust

上記のパッケージを簡単に紹介します。

パッケージ紹介
batcat の代替コマンド。見やすいです。
fdfind の代替コマンド。
ripgrepgrepの代替コマンド。色々高速化されていて便利。
deltagitやdiffのためのシンタックスハイライトページャ。gitと連携させています。
lsdls の代替コマンド。NerdFont でアイコンも表示できます。alias で ls を lsd にしています。
dustdu の代替コマンド。見やすいです。

GUI領域の設定

ここから本題の Sway でのデスクトップ環境を設定していきます。

Wayland

Linux の Display Server と言えば X Window System でとても安定していますが、今回はその後継を目指している Wayland を使用します。 Wayland をサポートしていないアプリケーションも、xWayland(wayland にXサーバを提供)で動作可能ですので安心です。

GUIライブラリ

GTK は Wayland をサポートしていますが、GUIライブラリによっては別途対応が必要になります。GUIライブラリの対応状況は Arch Wiki にありますので、利用するGUIライブラリを確認します。

私は、Wayland をサポートしていないアプリケーションと Qt のために、以下をインストールします:

Terminal
sudo pacman -S xorg-xwayland qt5-wayland

Display Manager

sway は Display Manager からの起動を推奨されていませんが、ログイン画面を表示させたいので、Display Manager として LightDM を利用します。そのうち、Ly に移行するかもしれません。

LightDM と Greeter をインストールします:

Terminal
sudo pacman -S lightdm lightdm-gtk-greeter

ログイン画面の画像を変更する場合は、/etc/lightdm/lightdm-gtk-greeter.conf にある [greeter] セクションの background を適宜変更します:

Terminal
[greeter]
background=/usr/share/backgrounds/archlinux/small.png

また、LightDM は起動時に ~/.xprofile を読み込むので、sway 向けの環境変数等を ~/.xprofile に記載しておきます。

~/.xprofile
#!/bin/sh

# session を wayland に設定
export XDG_SESSION_TYPE=wayland

# Firefox や thunderbird をwayland で起動
export MOZ_ENABLE_WAYLAND=1

# Qt を wayland で起動、wayland に対応していない場合は xWayland で起動
export QT_QPA_PLATFORM="wayland;xcb"

# Wayland で WebRTC screen sharing を利用するために必要
export XDG_CURRENT_DESKTOP=sway
export XDG_CURRENT_SESSION=sway

# Lightdm で sway の起動前に必要
export LIBSEAT_BACKEND=logind

# hdpi 向けの scaling 設定、個人の好み
export GDK_DPI_SCALE=1
export QT_SCALE_FACTOR=1

# 私の環境では以下の設定がないと外部モニタの検出ができなかった
export WLR_DRM_NO_MODIFIERS=1

# sway を起動する前に5秒 sleep
sleep 5

ここで伝えたい点は sleep 5 をいれて、lightDM から sway の起動前に5秒待つ必要があることです。 私はこの設定がないと、LightDM から sway を起動できませんでした。ここにはまって LightDM と sway の組合せをあきらめそうになりました(もちろん、LightDM ではなく terminal から sway を起動しても大丈夫です)。

sway

Wayland のコンポジタとして sway を使います。 sway はタイル型ウィンドウマネージャであり、アプリケーションウィンドウを重ならないようにタイル上に並べてくれます。 詳細は割愛しますが、タイル型ウィンドウマネージャは、キーボード操作と相性がよく、なるべくマウスやタッチパッドを使わずに画面操作が可能になるので、キーボードのみで操作を完結したい人にはぴったりです。

sway と必要なライブラリをインストールします:

Terminal
sudo pacman -S sway swaylock swayidle swaybg waybar noto-fonts

sway サンプル設定ファイル(/etc/sway/config)を ~/.config/sway/config にコピーして、適宜設定してみてください。自身の好みに合わせて色々設定できます。私のsway 関連の設定ファイルは、以下の通りです。

ここまでで、とりあえず sway のインストールが完了しました。 再起動すると LightDM から sway を起動することができますが、まだ再起動はしないでください! ターミナルエミュレータやランチャのインストール・設定をしていないので、sway にログイン後に何もできなくなるかもしれません。

続いて、sway での各種アプリケーションのインストールと設定を紹介していきます。

sway 固有デーモンの管理

後述の kanshi や xremap 等、sway が起動した時のみ開始し、sway が停止した時に停止したいサービスがあることがあります。その場合は、sway 固有のデーモンを作成して、そのデーモンにサービスをリンクすることで実現できます。

以下のように ~/.config/systemd/user/sway-session.target を作成します:

~/.config/systemd/user/sway-session.target
[Unit]
Description=Sway compositor session
Documentation=man:systemd.special
BindsTo=graphical-session.target
Wants=graphical-session-pre.target
After=graphical-session-pre.target

次に ~/.config/sway/config に以下の行を追記します。

~/.config/sway/config
exec_always "systemctl --user import-environment; systemctl --user start sway-session.target"

これで、sway に連動して自動起動・停止したいサービスを sway-ssession.target にリンクすることで、自動起動・停止が可能になります。 実際に、後述の kanshi と xremap のサービスで利用します。

Xdefaults

~/.Xdefaults を編集することで、wayland でなく xWayland で起動しているアプリケーションの解像度等を設定します。私は以下のように設定し、 Xft.dpi で xWayland での解像度を指定してます。

~/.Xdefaults
Xft.dpi: 144

! These might also be useful depending on your monitor and personal preference:
Xft.autohint: 0
Xft.lcdfilter:  lcddefault
Xft.hintstyle:  hintfull
Xft.hinting: 1
Xft.antialias: 1
Xft.rgba: rgb

画面通知

wayland 向けの画面通知デーモンとして mako をインストールします:

Terminal
sudo pacman -S mako

mako の設定ファイルは以下の通りです。主にNord 風の外観設定です。

mako を起動するために、~/.config/sway/config に以下の行を追記します:

~/.config/sway/config
exec mako

スクリーンロック

スクリーンロックを起動するために、~/.config/sway/config に以下の行を追記します:

~/.config/sway/config
exec swayidle -w \
  timeout 300 'swaylock -f -C ~/.config/swaylock/config' \
  timeout 1200 'systemctl suspend'

bindsym Mod4+Shift+l exec swaylock -f -C ~/.config/swaylock/config

私は5分でスクリーンロックをして、20分でサスペンドするようにしています。また、Super+Shift+l を押下するとスクリーンロックが起動します。

ウィンドウの透過

sway に標準同梱されている透過スクリプトが python の i3ipc に依存しているので、i3ipc をインストールします:

Terminal
sudo pacman -S python python-pip
pip3 install --user i3ipc

非アクティブウィンドウを透過するために、~/.config/sway/config に以下の行を追記します:

~/.config/sway/config
exec /usr/share/sway/scripts/inactive-windows-transparency.py --opacity 0.8

非アクティブウィンドウが少し透過されるので、アクティブウィンドウが分かりやすくなります。

マルチモニタ

端末がノートPCの場合、単体で利用している時や外部モニタに接続している時などモニタ状況が動的に変わります。 knashi は接続しているモニタを検知してディスプレイ設定を自動的に選択することができます。

kanshi をインストールします:

Terminal
sudo pacman -S kanshi

設定は個人のモニタ環境で異なりますが、参考までに私の kanshi の設定ファイルのリンクを貼ります。

最後に sway-session.target に kanshi のサービスをリンクして起動します。

~/.config/systemd/user/kanashi.service を作成します:

~/.config/systemd/user/kanashi.service
[Unit]
Description=Dynamic output configuration for Wayland compositors
Documentation=https://sr.ht/~emersion/kanshi
BindsTo=sway-session.target

[Service]
Type=simple
ExecStart=/usr/bin/kanshi

[Install]
WantedBy=sway-session.target

sway-session.target にリンクされた kanshi のサービスを有効化します:

Terminal
systemctl --user enable kanshi.service

スクリーンショット

sway 同梱の grimshot を使ってスクリーンショットを実現します。 grimshot は内部的に grim と slurp を使用しているので、grim と slurp をインストールします:

Terminal
sudo pacman -S grim slurp

スクリーンショット用のキーバインドとして ~/.config/sway/config に以下の行を追記します:

~/.config/sway/config
# アクティブウィンドウのスクリーンショット
bindsym Mod4+Shift+2 exec /usr/share/sway/scripts/grimshot --notify save window $HOME/Downloads/screenshot_$(date "+%y%m%d%H%M%S").png
# 全画面のスクリーンショット
bindsym Mod4+Shift+3 exec /usr/share/sway/scripts/grimshot --notify save output  $HOME/Downloads/screenshot_$(date "+%y%m%d%H%M%S").png
# 選択した範囲のスクリーンショット
bindsym Mod4+Shift+4 exec /usr/share/sway/scripts/grimshot --notify save area  $HOME/Downloads/screenshot_$(date "+%y%m%d%H%M%S").png

私は macOS のスクリーンショットキーバインドに寄せています。

バックライト

ノートPCのモニタ

ノートPCのモニタのバックライトを制御するために brightnessctl をインストールします:

Terminal
sudo pacman -S brightnessctl

外部モニタ

MCCS(Monitor Control Command Set)を実装した外部モニタは、DDC/CI(DisplayData Channel Command Interface)で制御可能です。 brightnessctl のみでは外部モニタのバックライトを制御できないので、ddcci-driver-linux-dkms をインストールして制御できるようにします:

Terminal
yay -S ddcci-driver-linux-dkms

ddcci モジュールを有効化します。なお、ddcci モジュールをロードするために再起動が必要ですが、あとでまとめて再起動します:

/etc/modules-load.d/ddcci.conf
ddcci

最後にキーボードに輝度制御キー等の特殊キーがあれば、特殊キーで動作するように ~/.config/sway/config に以下の行を追記します:

~/.config/sway/config
bindsym XF86MonBrightnessDown exec brightnessctl set 5%-
bindsym XF86MonBrightnessUp exec brightnessctl set 5%+

フォント

Noto font

Noto font をインストールします:

Terminal
sudo pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji noto-fonts-extra

Awesome font

Awesome font をインストールします:

Terminal
sudo pacman -S ttf-font-awesome

Cica font

プログラミング用のフォントとして、Cica font をインストールします。Nerd Fonts も包含かつ視認性が良いです! 最新の Cica font はこちらです。

Terminal
# ダウンロード
wget https://github.com/miiton/Cica/releases/download/v5.0.3/Cica_v5.0.3.zip

# 解凍
unar Cica_v5.0.3.zip -D -o "${XDG_DATA_HOME}/fonts/Cica"

# fonc cacheのアップデート
fc-cache -vf

サウンド

サウンドサーバとして、pipewire とその他必要なライブラリをインストールします:

Terminal
sudo pacman -S pipewire wireplumber pipewire-alsa pipewire-pulse pavucontrol playerctl

キーボードに音量制御制御キー等の特殊キーがあれば、特殊キーで動作するように ~/.config/sway/config に以下の行を追記します:

~/.config/sway/config
bindsym XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +1%
bindsym XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -1%
bindsym XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle
bindsym XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle
bindsym XF86AudioPlay exec playerctl play-pause
bindsym XF86AudioNext exec playerctl next
bindsym XF86AudioPrev exec playerctl previous

bluetooth

bluetooth 関連のパッケージをインストールして、有効化します:

Terminal
sudo pacman -S bluez bluez-utils blueman

sudo systemctl start bluetooth.service
sudo systemctl enable bluetooth.service

bluetooth のGUI管理パッケージ blueman を起動するために、~/.config/sway/config に以下の行を追記します:

~/.config/sway/config
exec blueman-applet
for_window [app_id="blueman-manager"] floating enable

なお、blueman をタイル型で配置したくないので、floating enable として、タイルを無視しています。

キーリピート

デフォルトだとキーリピートの速度が遅いので、~/.config/sway/config に以下の行を追記します:

~/.config/sway/config
input type:keyboard {
    repeat_delay 300
    repeat_rate 50
}

キーのリマップ

キーボードの割り当てをリマップします。 私はどこでも Emacs のキーバインドが使いたいので、macOS で標準となっている Cmd キーと Ctrl キーの使い分けがとてもしっくりきていました。この使いわけを Linux 向けのキーリマッパー xremap を使って実現していきます。 他にもキーリマッパーはありますが、私は xremap が無ければ、macOS から Arch Linux にメインOSを移行することができなかったでしょう。ありがとうございます!

Cargo を用いて、sway 向けの xremap をインストールします:

Terminal
"${CARGO_HOME}/bin/rustup" run stable cargo install xremap --features sway

キーリマップは個人ごとに違うと思いますが、参考のために、私の設定を共有します。

Running xremap without sudo に従って Xremap を sudo 無しで実行できるようにします。 私は上記の手順に加えて以下の手順が必要でした:

Terminal
sudo gpasswd -a <一般ユーザ名> uinput

最後に sway-session.target に xremap のサービスをリンクして起動します。

~/.config/systemd/user/xremap.service を作成します:

~/.config/systemd/user/xremap.service
[Unit]
Description=xremap
BindsTo=sway-session.target

[Service]
KillMode=process
ExecStart=%h/.local/share/cargo/bin/xremap %h/.config/xremap/config.yml
ExecStop=/usr/bin/killall xremap
Type=simple
Restart=always

[Install]
WantedBy=sway-session.target

sway-session.target にリンクされた xremap サービスを有効化します:

Terminal
systemctl --user enable xremap.service

タッチパッド

タッチパッドのスクロール等の設定を ~/.config/sway/config に追記します:

~/.config/sway/config
input type:touchpad {
    tap enabled
    dwt enabled
    natural_scroll enabled
    pointer_accel 1
}

dwt enabled にしておくと、キーボード入力時にタッチパッドが無効化されてますので、キーボード入力中にタッチパッドを誤ってタッチしてフォーカスがおかしくなることがありません。 現在、dwt enabled はxremapの v0.7.8 では正常に動作しませんが、xremap の master ブランチでは fix: libinput dwt support がマージされて、dwt enabled が動作します。次期バージョンの公開がとても楽しみです。

入力メソッド

私は入力メソッドに SKK を利用しています。SKK は日本語入力システム(ATOK とか google IME とか)の一つです。 基本的にはEmacs 上で動くものですが、macOS では AquaSKK、Linux では fcitx5-skk など、OS上で日本語入力システムとして利用できます。初めて聞いたという方はぜひ SKK で検索してみてください。

fcitx5 用の SKK と関連パッケージをインストールします:

Terminal
sudo pacman -S fcitx5 fcitx5-skk fcitx5-im fcitx5-configtool

fcitx5 を利用するために ~/.xprofile に以下の行を追記します:

~/.xprofile
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

fcitx5 を起動するために、~/.config/sway/config に以下の行を追記します:

~/.config/sway/config
exec fcitx5 -d

壁紙

Arch Linux の壁紙がありますので、私はそれを使っています。 Arch Linux の壁紙をインストールします:

Terminal
sudo pacman -S archlinux-wallpaper

~/.config/sway/config に以下を追記して、壁紙を設定します:

~/.config/sway/config
# お好みの画像を選択ください
output "*" bg /usr/share/backgrounds/archlinux/small.png fill

Network Manager Applet

NetworkManager を GUI で操作するために、Network Manager Applet をインストールします:

Terminal
sudo pacman -S network-manager-applet

Network Manager Applet を起動するために、~/.config/sway/config に以下の行を追記します:

~/.config/sway/config
exec nm-applet --indicator

ファイアウォール

クライアント環境なので 設定が簡単な ufw でファイアウォールを設定します:

Terminal
sudo pacman -S ufw

sudo systemctl start ufw.service
sudo systemctl enable ufw.service

sudo ufw enable
sudo ufw default deny

ファイルマネージャ

ファイルマネージャとして、thunar とその関連パッケージ(samba接続機能やサムネイル等)をインストールします:

Terminal
sudo pacman -S thunar gvfs gvfs-smb sshfs tumbler

ランチャー

ランチャーとして rofi をインストールします。 rofi はウィンドウスイッチャー・アプリケーションランチャー等として利用でき、他にもスクリプトを書いて専用メニューを作ることができます。

しかし、rofi は X Window system 向けのパッケージであり、main branch で Wayland のマージサポートを無期限に停止しています。そこで wayland をサポートする rofi-lbonn-wayland を利用します。ただし、rofi-lbonn-wayland では rofi で可能だったことが一部できなくなります。

まず、rofi-lbonn-wayland をインストールします:

Terminal
yay -S rofi-lbonn-wayland

rofi-lbonn-wayland の設定ファイルのリンクは以下の通りです。

DIfference with rofi に記載されているように、rofi-lbonn-wayland は windows mode(ウィンドウスイッチャー)がありません。 そこで、以下のようにウィンドウスイッチャー用のスクリプトを作成しました。

このスクリプトを実行できるように ~/.config/rofi/config.rasi に以下を追記します:

~/.config/rofi/config.rasi
configuration {
    modes: "windows:~/.config/rofi/scripts/window-select.sh,drun,combi";
    combi-modes: [windows,drun];
}

最後に rofi 用のショートカットを ~/.config/sway/config に追記します:

~/.config/sway/config
# Window toggle
bindsym Mod4+Tab exec "rofi -show window"

# start rofi (a program launcher)
bindsym Mod4+space exec "rofi -show combi"

クリップボード

クリップボードマネージャを導入してクリップボードに記録された文字列を管理します。

クリップボードマネージャとして wl-clipboard と clipman をインストールします:

Terminal
sudo pacman -S sl-clipboard
yay -S clipman

ただし、clipman にパスワードマネージャ(私は Enpass を利用)で記録しているパスワード情報等を管理させたくないので、Keeping secrets secret with keepassxc, clipman and swaywm or i3wm にあるスクリプトを少し修正してEnpass 使用時には clipman に記録させないようにします。

実行権限を付与した ~/.config/sway/scripts/myclipman を作成します:

~/.config/sway/scripts/myclipman
#!/usr/bin/env bash

app_id=$( swaymsg -t get_tree | jq -r '.. | select(.type?) | select(.focused==true) | .window_properties.class'  )
if [[ $app_id != "Enpass" ]]; then
    # --no-persist so that we preserve rich text:
    clipman store --no-persist
fi

clipman を起動するために、~/.config/sway/config に以下の行を追記します:

~/.config/sway/config
exec wl-paste -t text --watch ~/.config/sway/scripts/myclipman
bindsym Control+semicolon  exec clipman pick -t rofi

これで、Ctrl+; を押下すると、端末起動時からのクリップボードの履歴が rofi で表示され、履歴を選択すると再度コピーされます。

ターミナルエミュレータ

ターミナルエミュレータとして、wezterm をインストールします:

Terminal
sudo pacman -S wezterm

wezterm はかなり細かいカスタマイズが可能です。私の wezterm の設定ファイルのリンクは以下の通りです。

私は 「fzf で ssh の接続先を絞り込んで ssh 接続を行うスクリプト」を作成して、wezterm上のキーバインドに割り当てて利用しています。 以下のスクリプトと設定を行い、wezterm 上で Super+o を押下すると新しい tab を開き、選択したssh サーバにssh接続を行います。

~/.config/wezterm/ssh.sh
 #!/usr/bin/env bash
SSH_CONFIG_FILE_LIST=`bash -c "ls ~/.ssh/*/config" 2> /dev/null`
host_list=""
for ssh_config in ${SSH_CONFIG_FILE_LIST}
do
    for i in `grep "^Host " $ssh_config | grep -v "*" | sed s/"^Host "// | sed s/","/\ /g`
    do
        host_list="${host_list}${i}\n"
    done
done
ssh_host="`echo -e $host_list | ~/.local/share/fzf/bin/fzf --reverse --border --ansi --prompt='Server:' | cut -d: -f1`"
if [[ "$ssh_host" = "" ]]; then
    :
else
    echo -ne "\x1b]0;$ssh_host\x1b\\"
    eval "ssh $ssh_host"
fi
~/.config/wezterm/wezterm.lua
local wezterm = require 'wezterm';
return {
  keys = {
     {
      key = 'o',
      mods = 'CMD',
      action = wezterm.action.SpawnCommandInNewTab {
        args = {'.config/wezterm/ssh.sh' },
        cwd = '~'
      },
     },
  },
}

ブラウザ

私は、ブラウザとして3つインスールしてます。ここでは、メインブラウザの Vivaldi についてを記載します。

ブラウザ用途
Vivaldiメインブラウザです。
ChromeYoutube とYoutube Music をアプリ化して使っています。
FirefoxChromium Engine 以外ブラウザの挙動を確認したい時に使います。

Vivaldi をインストールします:

Terminal
sudo pacman -S vivaldi

Vivaldi もとても細かくカスタマイズできます。細かい設定は割愛しますが、ぜひ調べてみてください。

また、Vivaldi は Chromium Engine を使っているので、Chrome拡張機能が使えます。 拡張機能の中でも sway と相性が良い拡張機能が Vimuim です。Vimuim はブラウザを vim like にキーボードで操作することができます。これでマウスを触れる機会が減ります。

さらに、Vimuim ヘビーユーザには、朗報があります。 Vivaldi本体にもVimuimと同じようなキーボードショートカットを細く設定することが可能です。 そこで、Vimuim のキーボードショートカット設定と並行して同じキーボードショートカットをVivaldi側でも設定すると、Vimuim 単体では操作できなかった拡張機能のページやブラウザを開いた直後に表示されるページでも、Vimuim と同様のキーボードショートカットで操作できます。これはとても快適です。

Reboot

ここまでで一通りのインストールと設定が完了しました。一度、端末を再起動します:

Terminal
sudo reboot

問題なく各種インストール・設定ができていれば、LightDM のログイン画面が表示されますので、最初に作成した一般ユーザでログインします。

sway とxremap で私のconfigファイルと同様の設定をしている場合は、最低限以下のようなキーマップになっているはずです。

キー機能
Super + Spaceランチャとしてrofiを起動
Super + Tabフォーカスウィンドウ切り替え
Alt + j下にフォーカス移動
Alt + k上にフォーカス移動
Alt + h左にフォーカス移動
Alt + l右にフォーカス移動
Alt + Shift + jアクティブウィンドウを下に移動
Alt + Shift + kアクティブウィンドウを上に移動
Alt + Shift + hアクティブウィンドウを左に移動
Alt + Shift + lアクティブウィンドウを右に移動
Alt + 1~9各ワークスペースに移動
Alt + Shift + 1~9アクティブウィンドウを各ワークスペースに移動
Alt + Spaceフルスクリーンの切り替え
Alt + Shift + rSwayの設定ファイルの再読み込み
Super + Shift + 2アクティブウィンドウのスクリーンショット
Super + Shift + 3全画面のスクリーンショット
Super + Shift + 4選択した範囲のスクリーンショット
Super + qアクティブウィンドウの終了
Control + ;クリップボードマネージャの起動
Super + Shift + lスクリーンロック
Super + llayout変更モードの起動
Alt + rウィンドウresizeモードの起動
Alt + tfloatingの切り替え
Alt + Shift + ;アクティブウィンドウをscrachpadへ移動
Alt + ;scrachpad内のウィンドウのトグル

とりあえず、Super+Space で rofi が起動して、rofi から ターミナルエミュレータである wezterm が起動できれば、どこか設定を間違えていても、なんとかなります。 端末の再起動や終了も wezterm から以下のように実施できます:

terminal
# 終了
poeweroff

#再起動
reboot

私は以下のようなrofi 用のスクリプトを作成して、rofi から終了や再起動をしています。

~/.config/rofi/scripts/system-menu.sh
#!/usr/bin/env bash

declare -A SYSTEM_DICT=(
    ["Reboot"]="systemctl reboot"
    ["Sleep"]="systemctl suspend"
    ["Poweroff"]="systemctl poweroff"
)

IFS=$'\n'
if [[ $# -ne 0 ]]; then
    eval "${SYSTEM_DICT[$1]}" &> /dev/null
    exit 0
else
    echo "${!SYSTEM_DICT[*]}"
fi
~/.config/rofi/config.rasi
configuration {
    modes: "windows:~/.config/rofi/scripts/window-select.sh,drun,combi,system:~/.config/rofi/scripts/system-menu.sh";
    combi-modes: [windows,drun,system];
}

GUI設定ツールでの設定

sway が無事起動したので、GUI設定ツールでのみ設定できる項目を設定します。

fcitx-skk

fcitx-skk を設定するために、wezterm で以下を実行します:

fcitx5-configuretool

設定ツールから以下を設定します。

  • Input Method タブでSKKだけを Current Input Method に設定
  • Addons タブ内のClipboard設定の Triger KeyEmpty に設定
  • Addons タブ内のSKK設定の Initial Input ModeLatain に設定
  • Addons タブ内のSKK設定の Return-key does not insert new line on commit にチェック

次に、ibus-skkでSticky Shiftに従って Sticky Shift を有効化します。

終わりに

ここまで、読んでいただき、ありがとうございます。 これで一通りの Arch Linux でのswayデスクトップ環境が構築できました。

一つずつ実行していくと大変ですが、スクリプトを書いて実行すれば、ほぼ全自動で設定が可能です。気軽にクリーンインストールできます。 今回の設定を含む私の dotfiles がありますので、よろしければご覧ください。 dotfiles には install.sh がありますが全自動で私好みの設定がされてしまうので、install.sh を実行せずにスクリプトが何をやっているか追っていただくほうが安全だと思います(使えていた環境が使えなくなるかもしれません)。

何か誤り等ありましたら、ご指摘いただけますと幸いです。

それでは、良い Linux デスクトップライフを!

謝辞

Arch Linux を始め、アプリケーション・ライブラリ・パッケージの作者様、導入記事や設定ファイルを公開してくださっている方々、いつもありがとうございます。皆様には感謝が堪えません。

Arch Wiki の swaysway Wiki には大変お世話になりました。 また、以下記事も参考にさせていただきました。

私の記事の記載内容で不都合等ある方がいらっしゃいましたら、コメント等でご連絡いただけますと幸いです。

Posted by mako
関連記事
コメント
...