首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在将USB插入膝上型计算机(并获得确定性行为)时自动更改kbd配置?

如何在将USB插入膝上型计算机(并获得确定性行为)时自动更改kbd配置?
EN

Unix & Linux用户
提问于 2020-09-04 02:56:01
回答 1查看 154关注 0票数 1

udev的规定让我很紧张..。有时他们工作,有时他们不工作..。

再说一次,今天它们不起作用了。

我总是在网上复制东西,然后调整它,最后得到一个工作配置,几周/几个月后,它们就停止工作了。

一劳永逸,我真的很想得到一个确定性的解决方案.

  • 我想要的是:当我把kdb插入我的笔记本电脑时,外部USB键盘配置会自动改变(交换帽&ctrl+ lwin组合)。
  • 我所做的:

( a)获得了我的USB键盘设备信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# lsusb |grep Dell
Bus 001 Device 045: ID 413c:2107 Dell Computer Corp. 

( b)在我的/etc/udev/rules.d es.d/90-键盘_swapcaps.Rule中,我添加了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## DEBUG
ACTION=="change", ATTRS{idVendor}=="413c", ATTRS{idProduct}=="2107", RUN+="/bin/sh -c 'echo == >> /tmp/udev-env.txt; env >> /tmp/udev-env.txt'"
# ACTUAL
ACTION=="change", ATTRS{idVendor}=="413c", ATTRS{idProduct}=="2107", ENV{XKBLAYOUT}="fr", ENV{XKBOPTIONS}+="ctrl:swapcaps", ENV{XKBOPTIONS}+="compose:lwin"

然后我跑了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# udevadm control --reload-rules && udevadm trigger
  • 我得到的是:

( a) kbd配置中没有任何更改。

b)监测

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# udevadm monitor -u
...
UDEV  [10555.979594] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55 (input)
UDEV  [10555.989903] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::numlock (leds)
UDEV  [10555.992442] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/0003:046D:C077.001D/input/input54 (input)
UDEV  [10555.994812] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::scrolllock (leds)
UDEV  [10556.001225] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/hidraw/hidraw1 (hidraw)
UDEV  [10556.003513] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/0003:046D:C077.001D/input/input54/mouse1 (input)
UDEV  [10556.005834] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/0003:046D:C077.001D/hidraw/hidraw0 (hidraw)
UDEV  [10556.010005] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::capslock (leds)
UDEV  [10556.019614] change   /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::numlock (leds)
UDEV  [10556.021307] change   /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::scrolllock (leds)
UDEV  [10556.022045] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/event20 (input)
UDEV  [10556.024438] change   /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::capslock (leds)
UDEV  [10556.026259] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E (hid)

这表明这个设备被检测到了&是正确的吗?

( c)在/tmp/udev-env.txt中,许多行类似于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
==
ID_FOR_SEAT=leds-pci-0000_00_14_0-usb-0_1_2_1_0
ACTION=change
TRIGGER=kbd-scrolllock
SEQNUM=17431
USEC_INITIALIZED=10059229961
TAGS=:seat:
XKBLAYOUT=fr
XKBOPTIONS=ctrl:swapcaps compose:lwin
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001C/input/input53/input53::scrolllock
SUBSYSTEM=leds
ID_PATH=pci-0000:00:14.0-usb-0:1.2:1.0
ID_PATH_TAG=pci-0000_00_14_0-usb-0_1_2_1_0
PWD=/

这就告诉我规则是匹配的&是适用的。

那么,我到底做了什么不改变我的kbd配置?

如果我在LinuxMint 20下面。

谢谢你的帮助!

EN

回答 1

Unix & Linux用户

发布于 2020-09-04 05:22:10

环境变量只从父进程传播到子进程,而不是从子进程传播到父进程。从udev规则运行的任何内容通常都无法访问GUI会话的环境。

在您的示例中,由udev规则的RUN+=部分启动的shell进程当然设置了XKBLAYOUTXKBOPTIONS环境变量所需的方式。但是一旦RUN+=...中的命令完成,这个shell就会退出.而这些修改后的环境变量也会随之消亡,而不会对任何事情产生任何影响。

只有当这些环境变量中的信息传递给setxkbmap命令或类似的信息时,这些环境变量才会生效。在您的发行版中,它可能会作为X11会话设置的一个标准部分发生。仅仅设置变量本身,而不以某种方式将它们的值传递给X11服务器,对键盘布局没有任何影响。

由于X11会话设置通常来源于/etc/profile和类似的shell启动文件,以便为GUI应用程序提供一个合理的环境,因此,可能仅仅在/etc/profile.d/*.sh或类似的设置中设置这些变量就能工作。但是实际的魔力不是在变量中,而是在X11会话设置过程中,它将根据这些变量的值执行setxkbmap -layout $XKBLAYOUT ...或等效的操作。这是你在udev规则中根本没有提供的部分。

udev规则的执行上下文与GUI会话的执行上下文完全无关。因此,即使添加了使用这些变量将更改传递给X11服务器的setxkbmap命令,由udev规则启动的shell也不会有引用GUI会话的DISPLAYXAUTHORITY变量,因此命令只会发出Cannot open display错误消息。

( DISPLAY变量和X会话cookie文件,无论是在~/.Xauthority还是在XAUTHORITY环境变量指向的自定义位置,都是成为X11 GUI会话的一部分或以任何方式向该会话发送命令所必需的。)

令人沮丧的是,几乎有一个功能可以巧妙地解决这个问题。您可以创建一个名为/etc/udev/hwdb.d/70-keyboard.hwdb的文件,其内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
evdev:input:b????v413Cp2107e*
  XKB_FIXED_LAYOUT="fr"
  # XKB_FIXED_OPTIONS="ctrl:swapcaps compose:lwin" # Unfortunately this part has not been implemented yet!

据我所知,这将只允许为特定键盘指定X11键盘布局,即使系统有其他带有其他布局的键盘。不幸的是,允许指定XKB键盘布局规范中的选项部分(我猜这部分对您来说很重要)的部分没有实现。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/607822

复制
相关文章
如何在chrome中实时修改JS
有时候,我们需要去研究人家网站的运行机制,这就免不了要在他们的前端脚本里插入一些调试代码看看运行效果。在chrome65以前,我们可以打开目标网页的开发者工具—source选项卡—目标JS/CSS文件,然后在相关位置写入代码保存后即可看到改动后的效果。chrome65之后需要进行本地代码替换,本文就介绍一下如何在chrome中用本地代码替换在线代码,以达到在线修改JS的效果。
流量黑客
2020/01/02
38.1K2
如何在chrome中实时修改JS
如何修改grub
noibrs noibpb nopti nospectre_v2 nospectre_v1 l1tf=off nospec_store_bypass_disable no_stf_barrier mds=off mitigations=off
mingjie
2022/05/12
1.8K0
如何实时监控电脑?
随着互联网的快速发展,使用电脑办公面临着各种各样的进攻和威胁:机密泄露、数据丢失、网络滥用,员工因操作失误导致公司重要文件损坏丢失等现象层出不穷。这些问题其实都源于管理者没有对员工电脑进行监管,到底怎样才能实时监控员工电脑呢?可以安装电脑监控软件,如何选择呢?
绿虫小兵
2023/07/25
2540
如何修改Tomcat版本[通俗易懂]
1.找到tomcat所在位置进入lib目录 apache-tomcat-8.0.0\lib
全栈程序员站长
2022/09/27
3.1K0
如何修改Tomcat版本[通俗易懂]
热加载技术:修改Python代码并实时查看结果 ⛵
在运行 Python 脚本时,我经常发现自己忘记打印所有必要的详细信息来跟踪代码项目的进度和中间信息。我们经常在训练机器学习模型时遇到各种各样的信息记录问题,当然,问题不仅限于机器学习,像爬虫等场景也需要做大量记录,但我们经常在运行起代码之后才意识到忘记做一些需要记录的信息输出。
ShowMeAI
2022/12/13
1K0
热加载技术:修改Python代码并实时查看结果 ⛵
如何修改alert样式
HTML5学堂:无论是PC还是移动端,系统自带alert样式总是让人感觉很丑陋,今天就教大家如何修改alert弹窗样式。 只能自定一个弹窗样式 首先必须明白的一点是,alert()只是一个方法,而这个方法内部是native code,这是我们无法修改的部分,而最终暴露的只有这个alert()方法名字而已,你甚至拿不到alert的属性,因此要真正意义上的做到修改alert样式是不可行的。 有了以上这个条件基础,我们能做的只有重写alert()方法,替换掉系统自带的alert()方法。 一行代码替换alert(
HTML5学堂
2018/03/12
7K0
如何修改host文件[通俗易懂]
二.为何要修改host: 1).就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”, 当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。
全栈程序员站长
2022/11/04
9.9K0
如何修改host文件[通俗易懂]
如何修改opkg 源
http://downloads.openwrt.org.cn/ 上面的链接是openwrt国内的源,但是只有适合以下几个系统的源 Hacked/ 18-Jun-2014 13:58 – OpenWrt-DreamBox/ 01-Jan-2015 20:58 – PandoraBox/ 01-Oct-2015 00:33 – andlinux_lintel/ 18-Jun-2014 13:56 – ar_series_img/ 18-Jun-2014 18:02 – backfire/ 18-Jun-2014 18:00 – dreambox/ 07-Nov-2014 21:47 – mldonkey/ 18-Jun-2014 13:58 – openwrtcn/ 18-Jun-2014 14:00 – openwrtcn_img/ 18-Jun-2014 18:17 – software/ 18-Jun-2014 13:59 – sources/ 23-Jun-2014 21:05 – zjhzzyf_img/ 23-Jul-2014 14:33 –
全栈程序员站长
2022/08/25
3K0
如何修改go源码
看了一篇文章改go源码重新编译, 虽然工作中没使用到但是好奇试下, 下面是最简单的修改 fmt 包的 Println 函数为例进行了修改,
用户2825413
2022/04/19
1.4K0
如何修改go源码
如何制作实时库存报表
草料二维码暂不支持自动计算功能,无法看到实时的库存数量。但可以使用外部数据分析工具,如百度Sugar,连接草料二维码官方数据库,即可自由实现各类计算,包括实时库存。
草料二维码
2023/04/20
1.4K0
Python 如何实时绘制数据
提到 GUI 绘图,大家可能第一反应是 OpenGL 和 Matplotlib,但其实基于 Qt 平台还有个功能强大的 pyqtgraph 绘图库,不仅支持丰富的图形种类,还能实时更新绘图数据并进行交互式操作。
TTTEED
2020/08/06
3.5K0
phpstorm如何修改php版本
file/setting/Langueages&Frameworks/php/Composer, 取消勾选
超级小可爱
2023/02/20
3K0
python中如何修改文件?
修改的概念:对于硬盘上数据的修改, 根本没有改的操作, 只有覆盖操作修改的流程:文件的修改都是数据加载到内存中, 在内存中修改完再覆盖入硬盘一.修改方式一1.修改过程先以 r 模式打开源文件,将源文件内容全部读入内存然后在内存中完成修改再以 w 模式打开源文件,将修改后的内容覆盖入源文件2.优缺点优点 : 不须要硬盘预留足够的空间缺点 : 会在文件内容过大的情况下,占用过多的内存3.使用场景看情况而定, 一般用于文本编辑器, 让用户能看到全部的内容with open('user.txt',mode='r',
Python学习者
2023/04/21
8350
如何修改 Discourse 的域名
如果你参考了 GitHub 上的安装指南 页面中的内容安装了一个 Discourse 实例后希望对自己安装的实例修改域名的使用手册。 如果你使用的是 Discourse 官方主机服务 的话,请参考 针对 Discourse 的云服务配置你的域名 页面中的详细内容。
HoneyMoose
2021/09/08
3.7K0
如何修改 Discourse 的域名
如何修改GUI界面主题?
声明:本文仅代表原作者观点,仅用于SAP软件的应用与学习,不代表SAP公司。文中使用的SAP相关文字或图片等相应著作权归原厂商所有。
齐天大圣
2022/03/07
1.4K0
如何修改GUI界面主题?
SAP 如何修改SAP文本
在“屏幕制作器文本”下面双击,进入屏幕字段列表,找到需要修改的字段,然后直接在下面修改文本。
matinal
2020/11/02
1.3K0
SAP 如何修改SAP文本
Hive 如何修改分区列?
Hive 分区就是将数据按照数据表的某列或者某几列分为多个区域进行存储,这里的区域是指 hdfs 上的文件夹。按照某几列进行分区,就是说按照某列分区后的数据,继续按照不同的分区列进行分区。创建分区后,指定分区值即可直接查询该分区的数据,能够有效提高查询性能。
披头
2022/12/19
2.6K0
如何用 Python实时监控文件?
在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决,比如要监控nginx的$request_time和$upstream_response_time时间,分析出最耗时的请求,然后去改进代码,这时就要对日志进行实时分析了,发现时间长的语句就要报警出来,提醒开发人员要关注,当然这是其中一个应用场景,通过这种监控方式还可以应用到任何需要判断或分析文件的地方,所以今天我们就来看看如何用python实现实时监控文件,我给三个方法实例:
用户6543014
2019/10/25
2K0
Kafka如何修改分区Leader
前几天有个群友问我: kafka如何修改优先副本? 他们有个需求是, 想指定某个分区中的其中一个副本为Leader
石臻臻的杂货铺[同名公众号]
2021/12/31
1.2K0
Kafka如何修改分区Leader
点击加载更多

相似问题

将Flask-Admin CRUD视图嵌入站点

11

Django admin,自定义错误消息?

30

Flask Admin -限制自己的用户内容的CRUD功能

119

Active-admin错误消息未显示

12

如何在错误消息框中显示自定义错误消息

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文