Λlisue's blog

つれづれなるままに更新されないブログ

CapsLockをCtrlにするまとめ

f:id:lambdalisue:20130927174022j:plain

どうもCapsLockなんて爆発すればいいと思うAlisueです。

通常のキーボードではAの横という非常に押しやす位置にCapsLockという全く使用しないキーが配置されています。 非常にもったいないのでこのキーをCtrlとして使用することが多いのですが、方法がたくさんあるため一度まとめておきます。 なお本記事はEmacsWiki: Moving The Ctrl Keyの焼き増しのようなものなのでより詳しく知りたい方は原文を参照してください。

Gnome の設定を使用する方法(マウスで設定可能)

デスクトップパソコンとして使用する場合はGUIにて設定することが可能です。 以下ではDebian Wheezy(Gnome3)にて行う方法を記載します。

  1. システム設定 > キーボードを開く

    f:id:lambdalisue:20130927211551p:plain

  2. タイピング欄下部にある「レイアウトの設定」を開く

    f:id:lambdalisue:20130927211618p:plain

  3. レイアウト欄下部にある「オプション(O)...」を開く

    f:id:lambdalisue:20130927211632p:plain

  4. Ctrl キーの位置をクリックし「Caps Lock を Ctrl として扱う」にチェックを入れる

    f:id:lambdalisue:20130927211639p:plain

実際の設定はdconfから確認することができ org.gnome.libgnomekbd.keyboardoptions という項目に['ctrl\tctrl:nocaps']という値が追加されます。 したがって下記のようにターミナルで直接この値を指定することも可能です。

# CapsLockをCtrlに変更
% gsettings set org.gnome.libgnomekbd.keyboard options "['ctrl\tctrl:nocaps']"
# CapsLockとCtrlを入れ替える
% gsettings set org.gnome.libgnomekbd.keyboard options "['ctrl\tctrl:swapcaps']"
# CapsLockを元に戻す
% gsettings set org.gnome.libgnomekbd.keyboard options "[]"

X Window System の設定を使用する方法

先ほどの方法はGnomeなどを使用していないと使えませんが、この方法ならば原理的には X Window Systemを利用しているすべてのLinuxで使用可能です。

xkb を使用して変更する方法

xkbにはオプションがいくつかあり、その中でCapsLockをCtrlにするオプションやCapsLockとCtrlを入れ替えるオプションがあります。 これを起動時にしていしてやればCapsLockをCtrlにすることが可能です。

setxkbmap を使用してキーボードオプションを指定する方法

ターミナルにてsetxkbmapを呼び出すことによりキーボードオプションを直接変更することが可能です。 以下例を参照してください。

# CapsLockをCtrlに変更
% setxkbmap -option ctrl:nocaps
# CapsLockとCtrlを入れ替える
% setxkbmap -option ctrl:swapcaps
# CapsLockを元に戻す
% setxkbmap -option

オプションの内容から推測するにGnomeレベルでの設定はこのキーボードオプションを変更しているようです。 ただしGnomeレベルでの設定と違いsetxkbmapで設定を行った場合はログイン中しか変更が反映されません。 したがって上記コマンドの中から必要なものを~/.profile/etc/profileに加え自動的に呼び出すようにしてください。

なおFedora 15の場合~/.Xkbmapというファイルがあると自動的に内容をsetxkbmapの引数として使用するようです。 したがってこのファイルを作成しオプションの部分のみ記載すれば良いことになります。

X configuration file (/etc/X11/xorg.confなど)で指定する方法

XのオプションなのでXの設定ファイルにて指定することも可能です。 /etc/X11/xorg.conf/etc/X11/xorg.conf.d/10-capslock.confなどXの設定ファイルに下記のように記載してください。

Section "InputDevice"
    Driver "keyboard"
    Option "XkbOptions" "ctrl:nocaps"   # CapsLockをCtrlに変更
    Option "XkbOptions" "ctrl:swapcaps" # CapsLockとCtrlを入れ替える
EndSection

なおもしこの設定がうまく行かない場合は下記の設定を試してみてください。 最近のXorgはこちらの設定方法を推奨しているようです。

Section "InputClass"
    Identifier          "Keyboard Setting"
    MatchIsKeyboard     "yes"
    Option              "XkbOptions" "ctrl:nocaps"      # CapsLockをCtrlに変更
    Option              "XkbOptions" "ctrl:swapcaps"    # CapsLockとCtrlを入れ替える
EndSection

xmodmap を使用して再割当てを行う方法

xmodmapはXにおいてキーボードマッピングを修正するために用いるソフトウェアです。 したがって今回のケースのようにCapsLockをCtrlに変更する場合に使えます。 通常xmodmapの設定ファイルは~/.xmodmapという名前で保存し/.xsession内から下記のように呼び出します。

xmodmap ~/.xmodmap

ただ~/.xsessionは通常存在していないので新規作成することになると思います。 この時実行権限を忘れずに与えてあげてください(% chmod +x ~/.xsession)。 ~/.xsessionファイルの役割に関しては英語ですが What is “.xsession” for? の回答がわかりやすくまとまっていると思います。

上記のように~/.xsessionから~/.xmodmapを呼び出すように記載後に~/.xmodmapに下記のどちらかを記載してください。

!
! CapsLockをCtrlに変更
!
remove Lock = Caps_Lock
keysym Caps_Lock = Control_L
add Control = Control_L
!
! CapsLockとCtrlを入れ替える
!
remove Lock = Caps_Lock
remove Control = Control_L
keysym Caps_Lock = Control_L
keysym Control_L = Caps_Lock
add Lock = Caps_Lock
add Control = Control_L

Xの外でも設定する場合(サーバーやVirtual Consoleなど)

先ほどの方法はXの機能を用いて変更を行なっていたためXの外では変更が適用されません。 サーバーやVirtual ConsoleでもCapsLockは邪魔者でしか無いため僕はこのレベルでの設定を行なっています。

dumpkeysloadkeysを使用した方法

おそらくどのOSでも使用出来るであろう一般的な方法です。 まずdumpkeysコマンドを使用して現在のキーマップをファイルに吐き出します。 次にキーマップを修正し最後にloadkeysで適用します。 なお下記で保存するキーマップファイルは/usr/share/keymapsに保存するので存在しない場合は下記コマンドで作成してください。

% sudo mkdir -p /usr/share/keymaps

変更部分のみを追加で読み込ませるパターン

変更部分のみを追加で読み込ませるパターンです。まず下記コマンドを実行してキーマップファイルのひな形を作成してください。

% sudo dumpkeys | head -1 | sudo tee /usr/share/keymaps/Caps2Ctrl.map

次にお好きなエディタ(Vim等)で作成した雛形に下記を加えてください。

keycode 58 = Control        # CapsLock act as Ctrl
# keycode 29 = Caps_Lock    # Ctrl act as CapsLock
# alt_is_meta               # Fix the Alt key"

最後にloadkeysで変更を読み込ませます。

% sudo loadkeys /usr/share/keymaps/Caps2Ctrl.map

これでログイン中のみ一時的にキーマップを変更することができます。なお恒常的に変更したい場合は/etc/rc.local等に上記コマンドを(sudoを取り除いて)記載してください。

完全にキーマップを置き換えるパターン

すべてのキーマップを新しいキーマップで置き換えるパターンです。通常前記した変更部分のみを置き換えるパターンで事足りると思いますが念の為。 まず下記コマンドを実行して現在の完全なキーマップのコピーを作成してください。

% sudo dumpkeys | sudo tee /usr/share/keymaps/Caps2Ctrl-Full.map

次に作成した完全なキーマップのコピー上の必要箇所を前記を参考に修正してください。 最後にloadkeysで変更箇所を読みこませる部分は同様です。

この完全に置き換える方法はsedと組み合わせると非常に便利です。下記のようにワンライナーで置き換えることが可能になります。 ただCapsLockに割り当てられているものがCapsLockではなくCtrlL_Lockの場合があるためまず下記コマンドを実行してどちらが割り当てられているのかを確認してください。

% sudo dumpkeys | egrep "keycode\s*58"

次に下記コマンドを実行して実際の書き換えを行なってください。なおCtrlL_Lockが割り当てられていた場合はCaps_Lockの部分をCtrlL_Lockと読み替えて実行してください。

% sudo dumpkeys | sed 's/58\s*=\s*Caps_Lock/58 = Control/' | sudo loadkeys
# CtrlをCapsLockとして使用したい場合は下記コマンドも実行
% sudo dumpkeys | sed 's/29\s*=\s*Control/29 = Caps_Lock/' | sudo loadkeys

これでログイン中のみ一時的にキーマップを変更することができます。なお恒常的に変更したい場合は/etc/rc.local等に上記コマンドを(sudoを取り除いて)記載してください。

console-setupを利用した方法

比較的新しいDebianでは/etc/default/keyboardというファイルが存在しておりXKBOPTIONSを書き換えることでCapsLockをCtrlに変更することができます。 名前がXなのが気になりますが……。/etc/default/keyboardをエディタで開き下記のように修正してください。

# XKBOPTIONS=""
XKBOPTIONS="ctrl:nocaps"            # CapsLock --> Ctrl
# XKBOPTIONS="ctrl:swapcaps"        # CapsLock <-> Ctrl

修正後に下記コマンドを実行して変更を適用してください。

% sudo dpkg-reconfigure -phigh console-setup

console-toolsを利用した方法

古いDebian系OSでは/etc/console-tools/remapというファイルが存在しており自動的にdumpkeysloadkeysの間に呼び出されるsedスクリプトとして実行されます。 したがって先程dumpkeys, sed, loadkeysを利用したワンライナーと同様に置き換えを行なってください(下記参照)。

# This turns caps lock into control
s/58\s*=\s*Caps_Lock/58 = Control/;
# CtrlをCapsLockとして使用したい場合は下記コマンドも実行
s/29\s*=\s*Control/29 = Caps_Lock/;

修正後に下記コマンドを実行して変更を適用してください。

% sudo invoke-rc.d console-screen.sh restart

参考