Ubuntu 13.04中的永久xmodmap


72

我无法使xmodmap在Ubuntu 13.04中登录时运行。我进行了搜索,包括在askubuntu中搜索,发现的所有答案均不起作用。

我的主文件夹中有一个名为.Xmodmap的文件,其中包含所需的映射。如果我手动运行它,则工作正常,因此那里没有错误。为了使它在启动时运行,我尝试过:

  1. 使用.xinitrc包含以下命令之一的各种命令:

    • xmodmap .Xmodmap
    • xmodmap ~/.Xmodmap
    • /usr/bin/xmodmap /home/NAME/.Xmodmap
    • if [ -s ~/.Xmodmap ]; then
      xmodmap ~/.Xmodmap
      fi
  2. 使用.Xresources而不是.xinitrc使用相同的变体形式。

  3. 将其设置为启动应用程序。

以上都不适用于Ubuntu 13.04(64位)。我也看到了一些关于全局更改键盘映射的想法,但是大多数想法在Ubuntu 13.04中不适用(即,对应的文件在指定的位置不存在),并且我还是不希望触摸全局设置。

Answers:


81

Ubuntu不再使用xmodmap,而是使用xkb(据我所知,这促进了每个窗口的键盘布局等)。

系统范围的地图文件位于

/usr/share/X11/xkb/symbols/

地图似乎是分层加载的,以pc地图为根,以任何语言(例如en)作为根的子级。

在我的特定情况下,我在键盘上物理地将Page Up和Home以及Page Down和End进行了交换,因此,我对系统范围的pc映射进行了非常粗略的更改,如下所示:

 key <HOME> {    [  Prior        ]   };
 key <PGUP> {    [  Home         ]   };
 key  <END> {    [  Next         ]   };
 key <PGDN> {    [  End          ]   };

注意:要强制Xorg使用新的键盘映射,您可能必须删除其中的现有预编译映射(* .xkm)。

/var/lib/xkb/

然后重新启动Xorg。

有各种资源xkb,但是这一次是有关Ubuntu Linux系统。


9
从Ubuntu 14.04开始,可悲的是这是交换密钥的最简单方法。您可以通过将xmodmap添加到启动应用程序中来使其在登录时运行,但是如果您挂起,休眠等,则必须手动启动它或创建启动守护程序脚本。
holocronweaver 2014年

我可以根据修饰符重新映射键:unmodified shift altgr* shift+altgr。但是,我们left altsuper key
Farzher 2014年

7
我不认为你的第一句话是对的。您有任何来源吗?我发现很难相信重新映射键的“ Ubuntu方式”会从中编辑键盘映射xkb。除了是隐秘的之外,还有一个问题是您的自定义地图在xkb更新时会被删除。
MateusAraújo2014年

1
也就是说,这是我发现的在Ubuntu上重新映射密钥的唯一可靠方法。
MateusAraújo2014年

1
必须有一个更好的方法。我知道我想映射的确切键码,但是键码217甚至没有在xkb中列出。我什至看不到添加新键码的方法。
乔纳森

13

对我来说,如果您想以系统设置中不可用的方式重新映射1或2个键,则xkb配置太复杂了。另外,解决方案应保留在用户端,而无需编辑'/ usr / share / X11 / xkb / symbols /'等。使用启动应用程序强制'xmodmap〜/ .Xmodmap'加载仅在您暂停,更改用户之前起作用或更改键盘布局。因此,正如holocronweaver所建议的那样,利用我发现的代码片段,我制作了一个要在会话启动时加载的python脚本,该脚本会在需要时重新加载'〜/ .Xmodmap'。

检查错误报告#1243642(注释6),并在此处下载


1
从15.10开始仍在工作:-)谢谢!
lalomartins '02

指向该传奇脚本的链接似乎已断开。有人可以把它放在github上吗?
Epigene '17

很棒-也是可行的答案!在16.04中工作。为了使其能够在Python3中工作,将其更改为:“ import gobject”改为“从gi.repository import GObject as gobject”。
Craig Hicks

1
@Epigene-链接现在存在
Craig Hicks

赞美!天才变通。
dmanexe '18年

6

我在Ubuntu 14.04中遇到了这个问题,并在此处找到了解决方案。显然,Ubuntu无法在登录后立即配置键盘,但是稍后。因此,如果您添加命令

sleep 4 && xmodmap ~/.Xmodmap &

~/.bash_profile那么它应该工作(它确实对我来说)。

编辑:这似乎仅在登录后才起作用,而不是在启动后起作用。我稍后将对此进行调查。


1
将其设置为在挂起/休眠后运行是否有运气?
乔纳森

不,不幸的是,启动后我仍然无法正常工作。因此,每次启动时,我都打开一个终端并输入xmodmap ~/.Xmodmap:(
dremodaris

请注意,在Ubuntu 16.04上,您应该使用.profile
Vitor Abella

5

转换Caps LockEscvim使用

这是键映射启动脚本的我的变体。它可以转换Caps LockEsc任何键盘在使用上vivimgvim

q4w56的答案不同,此答案不使用任何无限while; do循环。否则,我的双核CPU的一个核将每5秒命中42%,严重减少了笔记本电脑的电池电量。

#!/usr/bin/env bash
sleep 4
xmodmap -e "clear Lock"
xmodmap -e "keysym Caps_Lock = Escape"

将其另存为脚本。使文件可执行chmod +x。将脚本名称和位置添加到Session and Startup → Application Autostart(在Xubuntu中)。

此用户的键盘行为将在重新引导和注销后保持不变,但不会挂起。通过暂停可以实现持久性,但是不幸的,只能在系统级别上实现,而不能在用户级别上实现。

此键盘重新映射的原理

在当今的计算机世界中,Caps Lock密钥的用途已很少。通常,由于网络礼节以及表示和内容的分离,应该避免使用ALL CAPS。此外,在编辑文本时意外地敲击键并不总是立即被注意到,而是总是导致相当烦人的行为。同时禁用所有密钥并将其重新用作易于使用的密钥,将带来双赢的使用体验。Caps LockvimvimCaps LockEscvim


Caps Lock对于没有密钥的Apple MacBooksvim用户而言,更换密钥的功能可能会节省很多生命。Esc
Serge Stroobandt

3
最好将映射capslockctrl。这样可以解决更多的问题,然后在Vim中,您可以使用capslock+ [表示Esc对不起进行干预,但是我觉得有必要提出建议。
user907860

暂停到底是什么?那是关闭笔记本电脑的盖子吗?之后,您的解决方案不起作用?合上笔记本电脑的盖子后,如何使用vim?
MarkoAvlijaš18年

@MarkoAvlijaš How do you use vim after you close the lid on your laptop?当然要打开盖子!
Serge Stroobandt

哈哈,我永远都不会猜到。我的意思是大写锁定之后不再映射到esc吗?
MarkoAvlijaš18年

3

我在带有fcitx的Ubuntu 16.04上也遇到了问题,并且在fcitx wiki上也有解决方案,但它需要fcitx具有4.2.7或更高版本

  • touch ~/.Xmodmap
  • 编写配置
  • 重新启动,fcitx将尝试自动加载它

原因也有一些解释。


1
虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
Videonauth

@Videonauth我已经修改了答案
Bluethon

非常感谢您:)我仍然在这里留下我的评论,以便正在接受审核的人员可以看到您进行了一些更改。
Videonauth

@Videonauth这是我的第一个答案,我的英语不好,所以我犯了一些错误。和thx为您的建议。:P
Bluethon

别客气。提供答案是为社区做出贡献的好方法。
Videonauth

3

@Daniel的答案为我指出了正确的方法,但我想在此方面继续。

适用于Linux Mint 17.2和Ubuntu 16.04。

我尝试了所有可以继续使用的方法xmodmap,但是当系统进入睡眠模式时,它们都将失败。甚至setxkbmap在* settings-daemon(对我来说是xfce4)运行晚于脚本的情况下使用的启动应用程序脚本也是如此---并不能真正影响顺序。

我最终想出的东西具有以下成分:

1)为编写一个最小的键盘映射文件/usr/share/X11/xkb/symbols。让我们调用文件mylayout可以简单到

xkb_symbols "basic" {
  name[Group1] = "My Layout";
  include "us"
  key <AE03> { [ 3, numbersign, sterling, sterling] };
  include "level3(ralt_switch)"
}
  • basic 只是一个名字,我们稍后再见。
  • name[Group1]同样只是它似乎是一个名字,但后来将不起任何作用。
  • include "us"包括普通美国​​键盘。实际上us是同一目录中的另一个文件。这是我们正在适应的键盘布局。根据需要选择另一个。注意:此行末没有分号。
  • key行是键盘的一种改编,更多可以跟随。该<AE03>可下的文件中找到/usr/share/X11/xkb/keycodes。使用该xev程序确定“ 3”键的键码为12,并在键码文件Xfree86中映射为<AE03>
  • 最后是另一个include指令,用于激活另一个键盘选项,在这种情况下,我想让正确的Alt键成为3级切换键,即可以访问sterling上面定义的符号的键。level3只是同一文件夹中ralt_switch一部分的文件名。环顾四周,然后选择您需要包括的内容。

2)我并没有mylayout到系统文件夹中。相反,我只是从系统文件夹到自己喜欢的文件夹进行了软链接,以立即看到这不是储备软件。

3)而且我也不能修复了evdev.xml,再次以防止更新的麻烦。但这对于在键盘配置编辑器中找到mylayout很有必要(对于xfce4是xfce4-keyboard-settings)。相反,我用xfce4-settings-editor和改变keyboard-layout->XkbLayout,以mylayout(文件名),并XkbVariantbasic(见上文)。之后,mylayout/basic也会显示在键盘设置编辑器中。evdev.xml似乎只需要输入一项就可以选择布局。

这样,键盘设置现在可以在睡眠模式下继续运行并重新启动。

可以在这里找到更多背景信息:http : //www.charvolant.org/~doug/xkb/html/node5.html

可以在这里找到解决睡眠模式问题的另一种方法(自己没有尝试过):https : //www.vinc17.net/unix/xkb.en.html

更新:如上所述,我在更改xfce4-settings-editor中的设置的同时,也使用了Mint 18.3。

更新:使用18.04,gdm3作为显示管理器和XFCE4作为窗口管理器,看起来好像再次读取〜/ .Xmodmap,并且设置似乎在挂起后仍然存在。(我很少使用suspend,也永远不确定笔记本电脑当时处于哪种模式。)


2

改版

2018年初的更新打破了持久性-挂起或休眠后自动重新加载键盘映射。由于使用/etc/pm/sleep.d脚本的方法停止工作(不建议使用?),因此仅留下了较新的方法,即使用/ lib / systemd / system-sleep和稍微不同的脚本(开始在键盘映射上工作!)。

因此,本文针对持久性进行了更新,更新为更新的方法,并包括正常的初始按键映射加载,该加载也开始起作用。将.Xmodmap文件转换为.xkbmap的例程保持不变。

请注意,这是每个用户的解决方案。有关每个设备的答案,请参见如何将按键映射应用于单个设备。这种方法可以在这里使用。

首先根据需要修改.Xmodmap文件。这些文件比.xkbmap文件更容易直接编辑。加载时:

xmodmap .Xmodmap

然后转换为.xkb文件:

xkbcomp $ DISPLAY $ HOME / .xkbmap

要在启动时自动加载,请打开“启动应用程序”,单击“添加”,然后在命令行中输入:

xkbcomp /home/user/.xkbmap“:0”

(“用户”被替换为实际的用户名。)对于“名称”,也许输入“ Load Keyboard Map”。根据需要添加评论,然后点击保存。

现在,键盘映射将在每次系统引导时加载,但在挂起或休眠状态下将无法生存。为此,在/ lib / systemd / system-sleep中创建一个新文件,可能名为60_xkbmap,其中包含:

#!/bin/sh
case $1/$2 in
  pre/*)
    # Place pre-suspend commands here
    exit 0
    ;;
  post/*)
    # Place post-suspend commands here
    export DISPLAY=":0"
    export XAUTHORITY="/home/user/.Xauthority"
    su user -c "xkbcomp /home/user/.xkb/xkb-map $DISPLAY 2>/dev/null"
    ;;
esac

参考)如上所述,用实际用户名替换“用户”。

键盘映射现在应该自动加载并保持不变。注意:

  • 适用于当前的LTS版本16.04,以及以后的版本。
  • 取自上述链接的错误线程的帖子14
  • 先前的评论适用于原始帖子。

我不时尝试这种方法,当我启动终端时,会收到一堆这样的消息:警告:没有为<AB11>定义任何符号(键码97)警告:没有为<JPCM>定义了符号(键码103)警告:没有为<I120>定义的符号(键码120)…………还有更多不确定的结果。有人知道吗
迷失的婴儿,

尽管有上述警告,此方法仍然有效,但只能暂时使用-稍过一会儿,映射就被忘记了,超级键恢复为其默认功能。因此,我将尝试另一种方法-我将重新映射Mac上的基本编辑快捷方式,以使用Control键而不是Command键,看看是否可行。我只希望我的cut-copy-paste-undo-redo命令在Mac和Ubuntu上相同。每当我尝试复制或粘贴某些内容时,在Ubuntu上弹出搜索菜单时,我都会感到非常沮丧。
迷失的婴儿,

1

当我从Ubuntu 12.04升级到13.04时,这也让我感到困惑。

幸运的是,现在(或可能一直)可以在“键盘”偏好设置中轻松访问此设置,只需单击几下即可更改。

  1. 转到系统设置 > 键盘布局 > 选项...
  2. 在键盘布局选项中,单击箭头以显示▸Ctrl键位置选项。
  3. 勾选Swap Ctrl和Caps Lock

您去了:左控制键和Caps Lock键已切换位置。

~/.Xmodmap进行更改后,请不要忘记删除。


可能是因为它没有解决xmodmap而被否决,但这实际上是我发现使用Gnome Tweak可能是我的某些映射表现异常的原因。
Dragon788

我在16.04中看不到,这是否仍然可能?
chrismarx

1
@chrismarx不,他们将其删除。如今(16.04),我XKBOPTIONS="ctrl:swapcaps"进入/etc/default/keyboard
GLTS

0

我发现将此脚本添加到启动中令人满意:

while true;do 
    xmodmap -e "keycode 87=Prior"
    xmodmap -e "keycode 88=Next"
    sleep 5
done

我尝试使用xmodmap ./Xmodmap,但是每次执行时,都会出现明显的延迟。


4
while; do应避免使用任何无限循环。它导致我的双核CPU的一个内核每5秒达到42%的电量
Serge Stroobandt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.