Arch Linux での sway デスクトップ環境の構築
みなさん、デスクトップ環境はどのようなものを使っていますか?昨今、選択肢は色々ありますね。 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 グループに所属するアカウントを作成してパスワードを設定します:
# アカウント作成
useradd -m -G wheel <作成するユーザ名>
# パスワード設定
passwd <作成したユーザ名>
次にwheel グループに所属しているアカウントに sudo を許可にします。
visudo
を実行して:
# EDITOR が nao で起動
visudo
# 既に vim をインストールしているなら、EDITOR を vim に指定
EDITOR=vim visudo
以下アンコメントします:
%wheel ALL=(ALl:ALL) ALL
これで sudo を実行できる一般利用のためのアカウントが作成できました。
今後の作業は作成した一般ユーザで行いますので、一旦、root アカウントからログアウトして、一般ユーザでログインしなおします。
システム領域の設定
ネットワーク設定
私は基本的に有線LANを利用しますので、以下は有線LAN前提の手順です。wifi接続の場合は Arch Wiki を参考に設定してください。
名前解決サービスの有効化及び起動
名前解決サービスとして systemed-resolve を有効化及び起動します:
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 を起動します:
sudo systemctl start systemd-networkd.service
ルータがDHCPサービスを提供しているならば、これでネットワークに接続されます。 そして、NetworkManager をインストールして、systemd-networkd の代わりに NetworkManager を有効化及び起動します:
# 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 でデスクトップ環境のシステム時刻を自動で同期させます:
sudo systemctrl start systemd-timesyncd.service
sudo systemctrl enable systemd-timesyncd.service
Pacman の設定
Pacman の設定をします。この設定は必ずしも行う必要はありませんが、行うと便利なので私はやっています。詳細は Arch Wiki を参照ください。
アップデート対象のバージョン比較
/etc/pacman.conf
の VerbosePkgLists
をアンコメントすると、以下のように利用可能なパッケージの新旧バージョンの比較できます。
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.conf
の ParallelDownloads = 5
をアンコメントします。
カラー化
カラー表示をするために、/etc/pacman.conf
の Color
をアンコメントします。
パッケージのキャッシュ削除
pacman ではダウンロードしたパッケージをキャッシュするので、少しずつ古いパッケージがたまります。キャッシュはダウングレードしたい場合に便利ですが容量を喰うので、 paccache
コマンドをインストールして、定期的にキャッシュの新しいバージョンを3つ残して削除します:
# paccache を含むパッケージのインストール
sudo pacman -S pacman-contrib
# パッケージのキャッシュ削除の起動及び自動化
sudo systemctl start paccache.timer
sudo systemctl enable paccache.timer
ファイルシステムのメンテナンス
ssd
ssd に Arch Linux をインストールしている場合は、trim
を有効にします:
sudo systemctl enable fstrim.timer
Btrfs
ファイルシステムに Btrfs を採用している場合は、scrub
を有効にします:
# root(/)
sudo systemctl enable btrfs-scrub@-.timer
# /home を直接マウントしている場合は以下のコマンドも実施
# sudo systemctl enable btrfs-scrub@home.timer
便利なパッケージのインストール
後続の手順で利用するパッケージや便利なパッケージを一括でインストールします:
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 をインストールします:
# 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.zshbindkey '^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
に追記します:
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"
設定した環境変数を読み込みます:
source ~/.zshenv
最後に、XDG Base Directory を作成します:
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 をインストールします:
sudo pacman -S go
goの path を ~/.zshenv
に追記します:
export GOPATH="${XDG_DATA_HOME}/go"
export PATH="${PATH}:${GOPATH}/bin"
設定した path を読み込みます:
source ~/.zshenv
AUR Helper
Arch Linux には便利な Arch User Repository(AUR) が存在しますので、AUR を利用するために AUR Helper をインストールします。 私は yay を使っていますが、比較表があるので、好みの AUR Helper をインストールしてください。
# yay のインストール
cd ~/.local/src
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
fzf
fuzy finder として fzf をインストールします。
# 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 及びプラグインマネージャをインストールします:
# 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 に作成します:
# directory の作成
mkdir -p ~/.config/git
# 既に ~/.gitconfig が存在するならば、移動
mv .gitconfig ~/.config/git/config
# ~/.gitconfig が存在しないならば、~/.config/git/config を作成
touch ~/.config/git/config
以下の通り git の設定をします:
# 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 をインストールします:
sudo pacman -S emacs-nativecomp
Emacs の設定も zsh 同様多岐に渡るので、設定ファイルのリンクのみ置いておきます(Emacs は楽しい)。
Vim
私は設定ファイルを編集する際に Vim を使うことが多いです。 Vim は既に Arch Linux のインストール時にインストールしましたので、ここでは設定ファイルのみです。
設定ファイルを XDG Base Directory で管理するために、以下を ~/.zshenv
及び ~/.config/vim/vimrc
に追記します。
export VIMINIT='let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc" | source $MYVIMRC'
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
設定した変数を読み込みます:
source ~/.zshenv
Vim の設定も zsh 同様多岐に渡るので、設定ファイルのリンクのみ置いておきます(Vim も楽しいと思う)。
Rust
Rust 製の便利なパッケージをインストールします。
Rustのインストール
rustup で Rust のインストールを行います。
まず、Rust の path を ~/.zshenv
に追記します:
export RUSTUP_HOME="${XDG_DATA_HOME}/rustup"
export CARGO_HOME="${XDG_DATA_HOME}/cargo"
[ -d $CARGO_HOME ] && . "${CARGO_HOME}/env"
設定した path を読み込みます:
source ~/.zshenv
rustup で Rust をインストールします:
# cargo の directory 作成
mkdir -p $CARGO_HOME
# rustupのインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --no-modify-path -y
パッケージインストール
便利なパッケージをインストールします:
"${CARGO_HOME}/bin/rustup" run stable cargo install bat fd-find ripgrep git-delta lsd du-dust
上記のパッケージを簡単に紹介します。
パッケージ | 紹介 |
---|---|
bat | cat の代替コマンド。見やすいです。 |
fd | find の代替コマンド。 |
ripgrep | grepの代替コマンド。色々高速化されていて便利。 |
delta | gitやdiffのためのシンタックスハイライトページャ。gitと連携させています。 |
lsd | ls の代替コマンド。NerdFont でアイコンも表示できます。alias で ls を lsd にしています。 |
dust | du の代替コマンド。見やすいです。 |
GUI領域の設定
ここから本題の Sway でのデスクトップ環境を設定していきます。
Wayland
Linux の Display Server と言えば X Window System でとても安定していますが、今回はその後継を目指している Wayland を使用します。 Wayland をサポートしていないアプリケーションも、xWayland(wayland にXサーバを提供)で動作可能ですので安心です。
GUIライブラリ
GTK は Wayland をサポートしていますが、GUIライブラリによっては別途対応が必要になります。GUIライブラリの対応状況は Arch Wiki にありますので、利用するGUIライブラリを確認します。
私は、Wayland をサポートしていないアプリケーションと Qt のために、以下をインストールします:
sudo pacman -S xorg-xwayland qt5-wayland
Display Manager
sway は Display Manager からの起動を推奨されていませんが、ログイン画面を表示させたいので、Display Manager として LightDM を利用します。そのうち、Ly に移行するかもしれません。
LightDM と Greeter をインストールします:
sudo pacman -S lightdm lightdm-gtk-greeter
ログイン画面の画像を変更する場合は、/etc/lightdm/lightdm-gtk-greeter.conf
にある [greeter]
セクションの background
を適宜変更します:
[greeter]
background=/usr/share/backgrounds/archlinux/small.png
また、LightDM は起動時に ~/.xprofile
を読み込むので、sway 向けの環境変数等を ~/.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 と必要なライブラリをインストールします:
sudo pacman -S sway swaylock swayidle swaybg waybar noto-fonts
sway サンプル設定ファイル(/etc/sway/config
)を ~/.config/sway/config
にコピーして、適宜設定してみてください。自身の好みに合わせて色々設定できます。私のsway 関連の設定ファイルは、以下の通りです。
- sway
- swaylock
- waybar
ここまでで、とりあえず sway のインストールが完了しました。 再起動すると LightDM から sway を起動することができますが、まだ再起動はしないでください! ターミナルエミュレータやランチャのインストール・設定をしていないので、sway にログイン後に何もできなくなるかもしれません。
続いて、sway での各種アプリケーションのインストールと設定を紹介していきます。
sway 固有デーモンの管理
後述の kanshi や xremap 等、sway が起動した時のみ開始し、sway が停止した時に停止したいサービスがあることがあります。その場合は、sway 固有のデーモンを作成して、そのデーモンにサービスをリンクすることで実現できます。
以下のように ~/.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
に以下の行を追記します。
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 での解像度を指定してます。
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 をインストールします:
sudo pacman -S mako
mako の設定ファイルは以下の通りです。主にNord 風の外観設定です。
mako を起動するために、~/.config/sway/config
に以下の行を追記します:
exec mako
スクリーンロック
スクリーンロックを起動するために、~/.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 をインストールします:
sudo pacman -S python python-pip
pip3 install --user i3ipc
非アクティブウィンドウを透過するために、~/.config/sway/config
に以下の行を追記します:
exec /usr/share/sway/scripts/inactive-windows-transparency.py --opacity 0.8
非アクティブウィンドウが少し透過されるので、アクティブウィンドウが分かりやすくなります。
マルチモニタ
端末がノートPCの場合、単体で利用している時や外部モニタに接続している時などモニタ状況が動的に変わります。 knashi は接続しているモニタを検知してディスプレイ設定を自動的に選択することができます。
kanshi をインストールします:
sudo pacman -S kanshi
設定は個人のモニタ環境で異なりますが、参考までに私の kanshi の設定ファイルのリンクを貼ります。
最後に sway-session.target
に kanshi のサービスをリンクして起動します。
~/.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 のサービスを有効化します:
systemctl --user enable kanshi.service
スクリーンショット
sway 同梱の grimshot を使ってスクリーンショットを実現します。 grimshot は内部的に grim と slurp を使用しているので、grim と slurp をインストールします:
sudo pacman -S grim slurp
スクリーンショット用のキーバインドとして ~/.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 をインストールします:
sudo pacman -S brightnessctl
外部モニタ
MCCS(Monitor Control Command Set)を実装した外部モニタは、DDC/CI(DisplayData Channel Command Interface)で制御可能です。 brightnessctl のみでは外部モニタのバックライトを制御できないので、ddcci-driver-linux-dkms をインストールして制御できるようにします:
yay -S ddcci-driver-linux-dkms
ddcci モジュールを有効化します。なお、ddcci モジュールをロードするために再起動が必要ですが、あとでまとめて再起動します:
ddcci
最後にキーボードに輝度制御キー等の特殊キーがあれば、特殊キーで動作するように ~/.config/sway/config
に以下の行を追記します:
bindsym XF86MonBrightnessDown exec brightnessctl set 5%-
bindsym XF86MonBrightnessUp exec brightnessctl set 5%+
フォント
Noto font
Noto font をインストールします:
sudo pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji noto-fonts-extra
Awesome font
Awesome font をインストールします:
sudo pacman -S ttf-font-awesome
Cica font
プログラミング用のフォントとして、Cica font をインストールします。Nerd Fonts も包含かつ視認性が良いです! 最新の Cica font はこちらです。
# ダウンロード
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 とその他必要なライブラリをインストールします:
sudo pacman -S pipewire wireplumber pipewire-alsa pipewire-pulse pavucontrol playerctl
キーボードに音量制御制御キー等の特殊キーがあれば、特殊キーで動作するように ~/.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 関連のパッケージをインストールして、有効化します:
sudo pacman -S bluez bluez-utils blueman
sudo systemctl start bluetooth.service
sudo systemctl enable bluetooth.service
bluetooth のGUI管理パッケージ blueman を起動するために、~/.config/sway/config
に以下の行を追記します:
exec blueman-applet
for_window [app_id="blueman-manager"] floating enable
なお、blueman をタイル型で配置したくないので、floating enable
として、タイルを無視しています。
キーリピート
デフォルトだとキーリピートの速度が遅いので、~/.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 をインストールし ます:
"${CARGO_HOME}/bin/rustup" run stable cargo install xremap --features sway
キーリマップは個人ごとに違うと思いますが、参考のために、私の設定を共有します。
Running xremap without sudo に従って Xremap を sudo 無しで実行できるようにします。 私は上記の手順に加えて以下の手順が必要でした:
sudo gpasswd -a <一般ユーザ名> input
最後に sway-session.target
に xremap のサービスをリンクして起動します。
~/.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 サービスを有効化します:
systemctl --user enable xremap.service
タッチパッド
タッチパッドのスクロール等の設定を ~/.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 と関連パッケージをインストールします:
sudo pacman -S fcitx5 fcitx5-skk fcitx5-im fcitx5-configtool
fcitx5 を利用するために ~/.xprofile
に以下の行を追記します:
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
fcitx5 を起動するために、~/.config/sway/config
に以下の行を追記します:
exec fcitx5 -d
壁紙
Arch Linux の壁紙がありますので、私はそれを使っています。 Arch Linux の壁紙をインストールします:
sudo pacman -S archlinux-wallpaper
~/.config/sway/config
に以下を追記して、壁紙を設定します:
# お好みの画像を選択ください
output "*" bg /usr/share/backgrounds/archlinux/small.png fill
Network Manager Applet
NetworkManager を GUI で操作するために、Network Manager Applet をインストールします:
sudo pacman -S network-manager-applet
Network Manager Applet を起動するために、~/.config/sway/config
に以下の行を追記します:
exec nm-applet --indicator
ファイアウォール
クライアント環境なので 設定が簡単な ufw でファイアウォールを設定します:
sudo pacman -S ufw
sudo systemctl start ufw.service
sudo systemctl enable ufw.service
sudo ufw enable
sudo ufw default deny
ファイルマネージャ
ファイルマネージャとして、thunar とその関連パッケージ(samba接続機能やサムネイル等)をインストールします:
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 をインストールします:
yay -S rofi-lbonn-wayland
rofi-lbonn-wayland の設定ファイルのリンクは以下の通りです。
DIfference with rofi に記載されているように、rofi-lbonn-wayland は windows mode(ウィンドウスイッチャー)がありません。 そこで、以下のようにウィンドウスイッチャー用のスクリプトを作成しました。
このスクリプトを実行できるように ~/.config/rofi/config.rasi
に以下を追記します:
configuration {
modes: "windows:~/.config/rofi/scripts/window-select.sh,drun,combi";
combi-modes: [windows,drun];
}
最後に rofi 用のショートカットを ~/.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 をインストールします:
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
を作成します:
#!/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
に以下の行を追記します:
exec wl-paste -t text --watch ~/.config/sway/scripts/myclipman
bindsym Control+semicolon exec clipman pick -t rofi
これで、Ctrl+;
を押下すると、端末起動時からのクリップボードの履歴が rofi で表示され、履歴を選択すると再度コピーされます。
ターミナルエミュレータ
ターミナルエミュレータとして、wezterm をインストールします:
sudo pacman -S wezterm
wezterm はかなり細かいカスタマイズが可能です。私の wezterm の設定ファイルのリンクは以下の通りです。
私は 「fzf で ssh の接続先を絞り込んで ssh 接続を行うスクリプト」を作成して、wezterm上のキーバインドに割り当てて利用しています。
以下のスクリプトと設定を行い、wezterm 上で Super+o
を押下すると新しい tab を開き、選択したssh サーバにssh接続を行います。
#!/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
local wezterm = require 'wezterm';
return {
keys = {
{
key = 'o',
mods = 'CMD',
action = wezterm.action.SpawnCommandInNewTab {
args = {'.config/wezterm/ssh.sh' },
cwd = '~'
},
},
},
}
ブラウザ
私は、ブラウザとして3つインスールしてます。ここでは、メインブラウザの Vivaldi についてを記載します。
ブラウザ | 用途 |
---|---|
Vivaldi | メインブラウザです。 |
Chrome | Youtube とYoutube Music をアプリ化して使っています。 |
Firefox | Chromium Engine 以外ブラウザの挙動を確認したい時に使います。 |
Vivaldi をインストールします:
sudo pacman -S vivaldi
Vivaldi もとても細かくカスタマイズできます。細かい設定は割愛しますが、ぜひ調べてみてください。
また、Vivaldi は Chromium Engine を使っているので、Chrome拡張機能が使えます。 拡張機能の中でも sway と相性が良い拡張機能が Vimuim です。Vimuim はブラウザを vim like にキーボードで操作することができます。これでマウスを触れる機会が減ります。
さらに、Vimuim ヘビーユーザには、朗報があります。 Vivaldi本体にもVimuimと同じようなキーボードショートカットを細く設定することが可能です。 そこで、Vimuim のキーボードショートカット設定と並行して同じキーボードショートカットをVivaldi側でも設定すると、Vimuim 単体では操作できなかった拡張機能のページやブラウザを開いた直後に表示されるページでも、Vimuim と同様のキーボードショートカットで操作できます。これはとても快適です。
Reboot
ここまでで一通りのインストールと設定が完了しました。一度、端末を再起動します:
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 + r | Swayの設定ファイルの再読み込み |
Super + Shift + 2 | アクティブウィンドウのスクリーンショット |
Super + Shift + 3 | 全画面のスクリーンショット |
Super + Shift + 4 | 選択した範囲のスクリーンショット |
Super + q | アクティブウィンドウの終了 |
Control + ; | クリップボードマネージャの起動 |
Super + Shift + l | スクリーンロック |
Super + l | layout変更モードの起動 |
Alt + r | ウィンドウresizeモードの起動 |
Alt + t | floatingの切り替え |
Alt + Shift + ; | アクティブウィンドウをscrachpadへ移動 |
Alt + ; | scrachpad内のウィンドウのトグル |
とりあえず、Super+Space
で rofi が起動して、rofi から ターミナルエミュレータである wezterm が起動できれば、どこか設定を間違えていても、なんとかなります。
端末の再起動や終了も wezterm から以下のように実施できます:
# 終了
poeweroff
#再起動
reboot
私は以下のようなrofi 用のスクリプトを作成して、rofi から終了や再起動をしています。
#!/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
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 Key
をEmpty
に設定Addons
タブ内のSKK設定のInitial Input Mode
をLatain
に設定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 の sway と sway Wiki には大変お世話になりました。 また、以下記事も参考にさせていただきました。
私の記事の記載内容で不都合等ある方がいらっしゃいましたら、コメント等でご連絡いただけますと幸いです。