結論
GUIの設定で変更可能ならそちらを使う(GNOMEなど)。
それができない場合は localectl を使う。
以下日本語配列のMacBookで右commandキーをcontrolに置き換える例。
localectl set-x11-keymap "jp,us" "applealu_jis" "," "ctrl:swap_rwin_rctl"
参考
Xorg でのキーボード設定 - ArchWiki
variant の設定に関する警告は一読しておくこと。上記の例は jp,us に対していずれもデフォルトの variant を設定している。
詳細
Linuxのデスクトップ環境を使っていると、いろいろなところでキーボードレイアウトやキーマップが設定される。
そのため、設定を変えても別のところで上書きされたりして反映されないことがある。
基本的には利用しているデスクトップ環境が用意しているキーボード設定画面から変更できればそれが一番いい方法だが、たとえばxfceではキーボード設定が貧弱なので修飾キーの入れ替えなどはできない。
そこで Xorg でのキーボード設定 - ArchWiki に記載されている localectl 経由で設定する方法を利用する。
以前は setxkbmap を .xinitrc で実行したり、Xorgの設定を直接書き換えたりして設定していたが、今は systemd 経由で設定を反映する localectl がいい方法だろう。
localectl の操作方法は概ね他の systemd の制御コマンドと同様で、大してオプションもないので簡単に扱える。(詳細は man localectl を参照)
設定可能な keymaps, layouts, models, variants, options は各種list系コマンドで確認できるが、 options については /usr/share/X11/xkb/rules/base.lst を見たほうが説明付きでわかりやすい。
余談
修飾キー以外の設定として _ をShiftなしで入力できるようにしているが、その設定は .Xmodmap で行っている。
それに合わせて最初 .Xmodmap に修飾キーの置き換え設定も記述したが、うまく反映されなかった。(明示的に xmodmap .Xmodmap で読みこめば反映された)