Linux loadkeys命令

简介

loadkeys命令是Linux系统中用于加载键盘映射表的命令行工具。它可以更改虚拟控制台(tty)的键盘布局、键位映射、功能键设置等,是Linux系统键盘配置的核心工具之一。

注意:loadkeys命令只影响Linux虚拟控制台(文本模式),不影响图形界面(X Window)。对于X Window系统的键盘配置,需要使用setxkbmapxmodmap命令。

语法格式

loadkeys [选项] [键盘映射文件]

常用选项

选项 说明
-d, --default 加载默认键盘映射(通常是us.map.gz)
-h, --help 显示帮助信息
-s, --clearstrings 清除所有字符串定义
-m, --mktable 从键盘映射文件创建二进制文件
-c, --clearcompose 清除所有组合键定义
-b, --bkeymap 加载二进制键盘映射文件
-q, --quiet 安静模式,不显示警告信息
-v, --verbose 详细模式,显示更多信息
-V, --version 显示版本信息
-u, --unicode 使用Unicode编码
--console 指定控制台设备(默认为当前控制台)

键盘映射文件位置

Linux系统的键盘映射文件通常位于以下目录:

主要目录:
/usr/share/keymaps/          # 系统键盘映射文件目录
/usr/share/kbd/keymaps/       # 某些发行版的键盘映射目录
/etc/keymaps/                 # 用户自定义键盘映射目录
~/.keymap                    # 用户个人键盘映射文件
常见的键盘映射文件:
文件 说明
us.map.gz 美国英语键盘布局(默认)
uk.map.gz 英国英语键盘布局
de.map.gz 德国德语键盘布局
fr.map.gz 法国法语键盘布局
es.map.gz 西班牙语键盘布局
jp.map.gz 日本日语键盘布局
cn.map.gz 中文键盘布局
ru.map.gz 俄语键盘布局

安装方法

loadkeys命令通常包含在kbd(键盘工具)包中,大多数Linux发行版默认已安装。如果未安装,可以使用以下命令:

Debian/Ubuntu系统:
sudo apt update
sudo apt install kbd
RHEL/CentOS/Fedora系统:
sudo yum install kbd

# 或使用dnf(Fedora/RHEL8+)
sudo dnf install kbd
Arch Linux系统:
sudo pacman -S kbd

使用示例

示例1:加载默认键盘布局

加载系统默认的键盘布局(通常是美式键盘):

# 加载默认键盘布局
loadkeys

# 或明确指定默认
loadkeys -d

# 查看可用的键盘布局文件
find /usr/share/keymaps -name "*.map.gz" | head -20
示例2:加载特定国家键盘布局

加载指定国家的键盘布局:

# 加载德语键盘布局
loadkeys de

# 加载法语键盘布局
loadkeys fr

# 加载日语键盘布局
loadkeys jp

# 加载中文键盘布局(如果有)
loadkeys cn
示例3:加载完整路径的键盘映射文件

直接指定键盘映射文件的完整路径:

# 加载指定路径的键盘映射文件
loadkeys /usr/share/keymaps/i386/qwerty/us.map.gz

# 使用相对路径
loadkeys ./mykeymap.map
示例4:查看当前键盘映射

使用dumpkeys命令查看当前键盘映射:

# 显示当前键盘映射
dumpkeys

# 显示简化的键位映射
dumpkeys -l

# 将当前键盘映射保存到文件
dumpkeys > mycurrent.map

# 查看特定键的映射
dumpkeys | grep -i "capslock"
示例5:创建自定义键盘映射

创建自定义的键盘映射文件:

# 1. 将当前键盘映射保存为基础
dumpkeys > custom.map

# 2. 编辑custom.map文件
# 修改以下行,将CapsLock改为Ctrl
# keycode 58 = Caps_Lock
# 改为:
# keycode 58 = Control

# 3. 加载自定义键盘映射
loadkeys custom.map
示例6:交换Ctrl和CapsLock键

交换Ctrl和CapsLock键的功能:

# 创建交换Ctrl和CapsLock的映射文件
cat > swap-ctrl-caps.map << 'EOF'
# 交换左侧Ctrl和CapsLock
keycode 58 = Control
keycode 29 = Caps_Lock
EOF

# 加载映射
loadkeys swap-ctrl-caps.map
示例7:设置功能键字符串

设置功能键(F1-F12)显示的字符串:

# 创建功能键字符串定义
cat > function-keys.map << 'EOF'
# 设置功能键字符串
string F1 = "Help"
string F2 = "Save"
string F3 = "Load"
string F4 = "Exit"
EOF

# 加载映射(不清除现有字符串)
loadkeys function-keys.map
示例8:永久设置键盘布局

让键盘布局设置在系统重启后仍然有效:

# 方法1:编辑/etc/vconsole.conf(某些发行版)
echo 'KEYMAP=de' | sudo tee -a /etc/vconsole.conf

# 方法2:编辑/etc/default/keyboard(Debian/Ubuntu)
echo 'XKBMODEL="pc105"' | sudo tee -a /etc/default/keyboard
echo 'XKBLAYOUT="de"' | sudo tee -a /etc/default/keyboard

# 方法3:创建systemd服务
# /etc/systemd/system/loadkeys.service
[Unit]
Description=Load keyboard layout
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/usr/bin/loadkeys /usr/share/keymaps/i386/qwerty/de.map.gz

[Install]
WantedBy=multi-user.target

高级用法

1. 创建Dvorak键盘布局

将QWERTY布局转换为Dvorak布局:

# 加载Dvorak布局(如果系统已安装)
loadkeys dvorak

# 或创建自定义Dvorak映射
cat > dvorak.map << 'EOF'
# Dvorak键盘布局映射
keycode 16 = 7    ampersand
keycode 17 = 5    percent
keycode 18 = 3    numbersign
keycode 19 = 1    exclam
keycode 20 = 9    parenleft
keycode 21 = 0    parenright
# ... 更多映射
EOF
loadkeys dvorak.map
2. 创建编程专用键盘映射

为编程创建优化的键盘映射:

# 创建编程专用映射
cat > programmer.map << 'EOF'
# 更容易输入编程符号
keycode 26 = braceleft   braceright
keycode 27 = bracketleft bracketright
keycode 39 = semicolon   colon
keycode 40 = apostrophe  quotedbl
keycode 41 = grave       asciitilde
keycode 43 = backslash   bar
EOF
loadkeys programmer.map
3. 多语言键盘支持

配置支持多种语言的键盘切换:

#!/bin/bash
# 键盘布局切换脚本
LAYOUTS=("us" "de" "fr" "es")
CURRENT=0

while true; do
    echo "当前布局: ${LAYOUTS[$CURRENT]}"
    echo "按Enter切换布局,按q退出"
    read -n1 input

    if [ "$input" = "q" ]; then
        break
    fi

    CURRENT=$(( (CURRENT + 1) % ${#LAYOUTS[@]} ))
    loadkeys "${LAYOUTS[$CURRENT]}"
    echo "已切换到: ${LAYOUTS[$CURRENT]}"
done
4. 键盘宏定义

定义键盘宏来自动输入常用文本:

# 创建宏定义
cat > macros.map << 'EOF'
# 定义宏
string F13 = "sudo apt update && sudo apt upgrade"
string F14 = "cd ~/projects"
string F15 = "git status"
string F16 = "ls -la"

# 设置组合键宏
alt keycode 49 = "Hello World!"
control alt keycode 30 = "echo 'Test'"
EOF
loadkeys macros.map

键盘映射文件格式

键盘映射文件的基本格式:

# 注释以#开头
# 键码定义格式:keycode <键码> = <按键符号>
keycode 1 = Escape
keycode 2 = one            exclam
keycode 3 = two            at
keycode 4 = three          numbersign

# 字符串定义格式:string <键名> = "<字符串>"
string F1 = "Help"
string F2 = "Save"

# 组合键定义格式:<修饰键> keycode <键码> = <功能>
alt keycode 1 = Console_1
control alt keycode 59 = Boot

# 包含其他文件
include "qwerty-layout"
常用键码参考:
键码 主功能 Shift功能
1 Escape -
2 1 !
3 2 @
16 q Q
17 w W
30 a A
31 s S
58 CapsLock -
59 F1 -
60 F2 -

常见问题

loadkeys setxkbmap
用于虚拟控制台(tty) 用于X Window图形界面
加载.keymap格式文件 使用XKB系统配置
影响所有虚拟终端 只影响当前X会话
配置相对简单 配置更复杂但更强大

有多种方法可以恢复默认键盘布局:

# 方法1:加载默认键盘布局
loadkeys -d

# 方法2:加载美式键盘布局
loadkeys us

# 方法3:重启系统
sudo reboot

# 方法4:重新加载内核键盘模块
sudo modprobe -r keyboard
sudo modprobe keyboard
loadkeys -d

  1. 确保在虚拟控制台(tty)中执行,不是在终端模拟器或SSH中
  2. 切换到另一个虚拟控制台(Ctrl+Alt+F2)再试
  3. 检查键盘映射文件是否存在:ls -l /usr/share/keymaps/
  4. 查看内核消息:dmesg | grep -i keyboard
  5. 使用-v选项查看详细输出:loadkeys -v us
  6. 检查权限:可能需要root权限

使用showkey命令查看键盘键码:

# 显示按下的键码
showkey

# 只显示键码(无额外信息)
showkey -s

# 显示键码和ASCII码
showkey -a

# 测试功能:按Esc键退出,按下的每个键会显示其键码

根据不同发行版,有以下方法:

  • systemd系统:编辑/etc/vconsole.conf,添加KEYMAP=布局名
  • Debian/Ubuntu:编辑/etc/default/keyboard
  • Arch Linux:编辑/etc/vconsole.conf或在/etc/rc.local中添加loadkeys命令
  • 创建systemd服务:如上文示例
  • 在shell配置文件中添加~/.bashrc~/.profile(对当前用户)

相关命令

dumpkeys

显示当前键盘映射,可以导出为文件

setxkbmap

设置X Window系统的键盘布局

showkey

显示键盘按键的扫描码和键码

localectl

systemd的本地化控制工具,可设置键盘布局