linux 按键修改简单示例

1、修改方法

文本界面和图形界面的keycode是不一样的,按键映射方式不同,因此修改方法不同。

1.1 文本界面

1.1.1 修改命令

在文本界面,dumpkeys 可以查询当前keycode。在文本或图形界面loadkeys 可以修改,例如将ctrl+alt+g修改为打开虚拟终端tty1的快捷键。g的keycode是35。

kylin@kylin-os:/etc/systemd$ sudo loadkeys -u
[sudo] kylin 的密码:
正在加载 <stdin>
contron alt keycode 35 = Console_1

ctrl+d确认修改。
但是用命令会在重启后失效,要不在启动的某个脚本中添加该命令,要不就修改映射文件;

1.1.2 修改映射文件

/etc/console-setup下 cached.kmap.gz 解压,根据dumpkeys的结果找到对应的设置项后修改。

这是dumpkeys的部分结果:

keycode  35 = +h              
	shift	keycode  35 = +H              
	shift	altgr	keycode  35 = +H              
	control	keycode  35 = BackSpace       
	shift	control	keycode  35 = BackSpace       
	altgr	control	keycode  35 = BackSpace       
	shift	altgr	control	keycode  35 = BackSpace       
	alt	keycode  35 = Meta_h          
	shift	alt	keycode  35 = Meta_H          
	altgr	alt	keycode  35 = Meta_h          
	shift	altgr	alt	keycode  35 = Meta_H          
	control	alt	keycode  35 = Meta_BackSpace       
	shift	control	alt	keycode  35 = Meta_BackSpace  
	altgr	control	alt	keycode  35 = Meta_BackSpace  
	

cached.kmap文件的部分内容:

keycode 35 = +U+0068 +U+0048 +U+0068 +U+0048 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0068 +U+0048 +U+0068 +U+0048 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0068 +U+0048 +U+0068 +U+0048 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0068 +U+0048 +U+0068 +U+0048 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0048 +U+0068 +U+0048 +U+0068 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0048 +U+0068 +U+0048 +U+0068 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0048 +U+0068 +U+0048 +U+0068 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0048 +U+0068 +U+0048 +U+0068 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace

希望得到control alt keycode 35 = Console_1的话, cached.kmap文件修改为:

keycode 35 = +U+0068 +U+0048 +U+0068 +U+0048 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H  Console_1 Meta_BackSpace Meta_BackSpace Meta_BackSpace ...

1.2 图形界面

可以通过xev来获取相应按键的keycode和keysym值。

1.2.1 通过xmodmap修改

xmodmap -pk 查看当前映射规则;
xmodmap修改本人只实验修改单独按键和shift+单个按键的两种,其他情况没搞清楚,这两种设置方式有其他文章说明,此处不细说;

1.2.2 通过xkb修改相应文件

kylin@kylin-os:/etc/console-setup$ cd /usr/share/X11/xkb/
kylin@kylin-os:/usr/share/X11/xkb$ ls
compat  geometry  keycodes  rules  symbols  types

xkb下有6个文件夹,此处关注symbols文件夹下

文件名简介
pc修饰键对应规则
usEnglish us 键盘布局规则
srvr_ctrlfkey 对应 vt 的规则
未完待续
xkbcomp $DISPLAY filename

查看xkb keymap信息,包括keycodes、types、compatibility、symbols、geometry,根据名称查找该条目在哪个文件中设置。

例如将ctrl+alt+g修改为打开虚拟终端tty1的快捷键,
在/usr/share/X11/xkb/symbols/us文件,xkb_symbols “basic” 中

key <AC05> {	[	  g,	G		]	};

改为:

key <AC05> {type[Group1] = "CTRL+ALT",
            symbols[Group1] = [ g, G, NoSympol, NoSympol, XF86Switch_VT_1 ] };

参考:
1、https://www.charvolant.org/doug/xkb/html/xkb.html
2、https://github.com/Chunlin-Li/Chunlin-Li.github.io/blob/master/blogs/linux/ubuntu-xkb-keyboard-remap.md

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 嵌入式Linux应用开发第五章示例3是一个关于文件操作的代码示例。该示例主要涉及到如何在Linux嵌入式系统中使用文件操作的相关函数。 首先,在示例代码中引入了几个与文件操作相关的头文件,包括<fcntl.h>、<sys/types.h>和<sys/stat.h>。这些头文件中定义了一些文件打开、读写和关闭等函数以及文件的相关数据类型。 接下来,代码示例中定义了一个用于存储文件路径的字符串变量path和一个用于存储文件描述符的整型变量fd。在示例中,path被指定为了一个具体的文件路径,这个路径可以根据实际情况进行修改。fd用于存储打开的文件的描述符。使用函数open()来打开文件,并将返回的文件描述符保存到变量fd中。在代码示例中,函数open()的第一个参数为文件路径,第二个参数为打开文件的方式,第三个参数为文件的权限设置。 接下来,代码示例使用函数read()来读取打开的文件中的内容,并将读取到的内容存储到一个用于存储读取结果的字符数组buf中。函数read()的第一个参数为文件描述符,第二个参数为存储读取结果的缓冲区地址,第三个参数为缓冲区的大小。 最后,在代码示例的结尾部分,使用函数close()来关闭文件,传入文件描述符作为参数。 总结而言,该示例代码主要演示了在嵌入式Linux系统中如何进行文件操作,包括打开文件、读取文件内容和关闭文件等操作。通过学习该示例,可以了解到Linux系统中与文件操作相关的函数和头文件的使用方法。 ### 回答2: 嵌入式Linux应用开发第五章示例3代码主要涉及嵌入式设备中使用动态库的开发过程。该示例中使用了一个简单的动态库,主要实现了一个计算两个整数和的函数。 首先,在示例代码中,我们首先需要编写一个动态库的C源文件,可以为该文件命名为libadd.c。该源文件中定义了一个函数add,用于计算两个整数的和。然后,我们使用gcc编译器将该源文件编译为一个动态库,使用的命令是:gcc -shared -o libadd.so libadd.c。编译后的动态库文件为libadd.so。 接下来,在示例代码中,我们需要编写一个可执行文件的C源文件,可以为该文件命名为main.c。在该源文件中,我们通过使用dlopen函数动态加载libadd.so动态库,并通过dlsym函数获取动态库中的add函数的地址。然后,我们可以调用add函数来计算两个整数的和,并输出结果。最后,我们使用gcc编译器将该源文件与动态库链接为一个可执行文件,使用的命令是:gcc -o main main.c -ldl。编译后的可执行文件为main。 最后,在示例代码中,第三个函数是main函数,其中通过调用add函数来计算两个整数的和,并输出结果。 通过以上步骤,我们成功实现了嵌入式设备中动态库的使用。使用动态库可以提供代码的复用性,减少可执行文件的大小,并且方便进行代码的更新和维护。在实际应用中,我们可以根据需要编写更多的动态库,并将其集成到嵌入式系统中,以实现各种功能和服务。 ### 回答3: 第五章示例3代码是一个嵌入式Linux应用开发的示例程序。这个示例程序主要展示了如何在Linux系统上使用C语言编写一个简单的应用程序,以及如何利用Linux内核提供的接口对系统进行控制和管理。 代码的主要结构是一个无限循环,循环中不断读取用户输入的按键值,然后根据按键值执行相应的操作。代码中使用了Linux系统提供的头文件和库函数来实现输入和输出操作。 首先,在程序开始的部分,设置了一些初始化的参数。包括定义了按键值的变量和输入输出设备的文件描述符。 接着,在无限循环中,使用read函数读取用户输入的按键值,并将其存储在按键变量中。然后,通过switch语句对按键进行判断和处理。 代码中的示例操作比较简单,主要是根据不同的按键值打印相应的提示信息。例如,按下“1”键会打印“Hello World”等等。 最后,在代码的结尾处,关闭了打开的输入输出设备的文件描述符。 总的来说,这个示例程序展示了如何在嵌入式Linux系统中进行应用开发和控制,以及如何利用Linux内核提供的接口进行输入和输出操作。这个示例程序比较简单,但是可以作为学习和理解嵌入式Linux应用开发的基础。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值