如何在MacBook Pro上切换Command键和Control键?

我在网上搜索了很多,但似乎无法正确地使用Xmodmap或其他方法。我想要交换我的两个Command键和Control键 - 实质上是颠倒它们当前的功能。
我该如何做到这一点?
我尝试了xmodmap -e "keycode 133 = Control_L"以及对于键码134(右侧Command)和37(左侧Control)的相应命令。我甚至尝试了这些命令,再加上xmodmap -pke > ~/.Xmodmapxmodmap ~/.Xmodmap.xinitrc中。 我的最终目标是当我点击control时,HUD / Dash会出现,而点击command时,它将起到控制的作用,例如,control-v是粘贴的常用快捷键,我将点击command-v来实现。
9个回答

我搞定了。把以下内容放入~/.Xmodmap文件中:
clear control
clear mod4

keycode 105 =
keycode 206 =

keycode 133 = Control_L NoSymbol Control_L
keycode 134 = Control_R NoSymbol Control_R
keycode 37 = Super_L NoSymbol Super_L

add control = Control_L
add control = Control_R
add mod4 = Super_L

要进行测试,请运行以下命令:
xmodmap ~/.Xmodmap

要使其每次运行,将其添加到启动应用程序中。
这在任何MacBook Pro上都应该有效;问题是Xmodmap将Super_L分配给左右命令键,将Control_L分配给左控制键。由于某种原因,默认情况下,Ubuntu认为MacBook Pro具有标准的105键键盘(可能是考虑到完整的Apple键盘),但这是错误的。无论如何,我重新分配了键码到正确的键模拟,并将键模拟分配给controlmod4

我有一个额外的问题:如何将左边的Control键改为Alt键,反之亦然,将紧挨着左边Control键的Alt键改为左边的Control键? - 719016
如何保持右侧的Win按钮正常工作? - arcanine
请注意,这种方法在键盘布局切换时效果不佳。因此,如果您使用多个布局,每次切换布局后都需要运行xmodmap。下面的回答建议编辑/usr/share/X11/xkb/symbols/pc,可以避免这个问题。 - clorz
它能在VNCViewer上运行吗?我正在使用Gnome桌面,想要用Ctrl键替换我的苹果键盘(Command键)。 - ahmed
这是一个链接,其中包含了一个关于某个问题的解释。根据这个答案,这是最好的解释。 - VanPiro

我昨天在我的MBP13"上安装了Ubuntu 16.04双启动。对于Ubuntu 16.04,这是我做的步骤:
第一步:打开终端
第二步:编辑X键盘扩展
sudo nano /usr/share/X11/xkb/symbols/pc

第三步:进行以下更改。确保您的文件看起来像这样:
key <LCTL> {    [ Super_L       ]   };
key <LWIN> {    [ Control_L     ]   };

...

key <RCTL> {    [ Super_R       ]   };
key <RWIN> {    [ Control_R     ]   };

第四步:清除xkb的缓存
sudo rm -rf /var/lib/xkb/*

第五步(有条件):如果在第四步之后未成功交换键盘,请重新启动计算机。我在这样做之后解决了问题。
希望能对你有所帮助,祝你好运!

4这个解决方案比被接受的答案要好得多。 - Emmanuel M. Smith
1对我没有起作用。 - chovy
这是实际(2017年)的答案。 - CESCO
4这是答案。在更改后需要重新启动。谢谢。 - sledgeweight
1这对我起作用了!最终在Mac OS和Linux之间切换不再需要重新编程那么多肌肉记忆了 :) - JoLoCo
我同意 @MrAxilus 的观点,这确实是一个更好的解决方案!在Ubuntu 17.10上对我也起作用了。 - GPrimola
这是最佳解决方案,2018年我重新启动后它就有效果了。 - Arunabh Das
4完美运行,重启后,Ubuntu 18.04。 - Marco M
在Kali VM 2019上工作得非常好,只需记得将主机密钥从左命令更改为其他内容即可。 - Kennet Celeste
这应该是第一个答案,它像原子分子一样坚固。在Lubuntu 20.04.4LTS和Macbook Air6.2上经过验证。 - CuriousNewbie
截至今日,它仍然在Ubuntu 22.04LTS上运行,太棒了!! - Gugu72

进入「系统 -> 首选项 -> 键盘」。 点击「布局」标签,然后点击「布局选项」按钮。 点击「Alt/Win 键行为」。 选择「Control 键映射到 Win 键(以及通常的 ctrl 键)」。 来自 http://ubuntuforums.org/showthread.php?t=1293081

10只是一点说明 - 这并不是交换键位,而是将命令键变为额外的控制键。 - Fabian Tamp
这在Ubuntu 16.04上不起作用。 - Unique
这似乎在Ubuntu 18.04中导致了期望的行为。 - Ramsy de Vos
我使用“Alt键与Win键交换”是因为我在Ubuntu上使用苹果键盘。 - SM Adnan
在Ubuntu上安装Tweaks,并使用该工具来更新键盘设置,就像这个答案中提到的那样。Ubuntu的系统首选项中的键盘选项没有显示这个选项给我。 - Elkhan Dadashov
这个效果很好,正如预期的那样。我想知道如何为苹果键盘配置Fn键?我还没有找到相关的设置。 - wlarcheveque

更新至18.04版本,因为提供的答案似乎都无法在我的系统上运行。我进行了一次干净的18.04安装,并尝试使用有线铝制苹果键盘。英语美国键盘布局下,左Super键的默认行为是映射到Gnome桌面仪表盘。调整工具中有一个易于使用的图形用户界面,其中包含了所有必要的设置!
sudo apt install gnome-tweak-tool

首先,我将仪表盘热键换到了右侧,然后在“其他布局选项”下,你可以使用“Ctrl位置/ 将左Win键与左Ctrl键交换”来取得良好的效果。

gnome-tweak-tool太棒了,谢谢! - Dennis Golomazov
这应该是被接受的答案。对于Mac来说,我目前发现Gnome Tweak Tools在键盘和鼠标 > 附加布局选项 > Ctrl位置 > 交换左Win和左Ctrl下有我想要的设置。Mac键盘的Command键似乎被称为"Win"。 - bhaller
2019年,在Gnome中,这是最简单的解决方案。谢谢。 - jymbob
这在2020年5月27日对我起作用。调整很棒! - BhishanPoudel
我的选项看起来与第一张附加的屏幕截图不同,但是深入了解其他选项对我很有帮助。 - hlongmore
这个很容易使用,对我在Ubuntu 20.04上运行很好。 - panc
1然而,在终端中它不起作用。如何使新的按键绑定在终端中也起作用? - panc

打开系统设置,然后找到键盘布局,再进入选项,接着选择Win/Alt键行为,然后勾选“Meta切换Ctrl”,在Ctrl位置处勾选“Ctrl切换Meta”,完成!

在12.04.1版本中,您可以按以下步骤更改:

首先,打开“系统设置”,然后点击“键盘”,接着点击左下角的“布局设置”,再点击右下角的“选项”,展开“Alt/Win键行为”选项卡,选择“Control映射到win键(以及通常的Ctrl键)”。


在12.04版本中对我起作用了。我简直不敢相信,但它确实起作用了。在折腾了几个小时的.xmodmap之后。 - jyoseph
太好了,谢谢。我有更新的系统(你在第二段描述的那个)。Ctrl键映射到Win键使得Cmd键表现得像Ctrl键。Ctrl键位置->左Ctrl作为Meta键则相反。另外顺便提一下,我不得不去“启动和关机”->“服务管理器”->“启动服务”并激活“键盘守护程序”(默认情况下是关闭的)。 - 0__
14.04似乎没有那个“选项”链接。 - Waldir Leoncio
关于Ubuntu 15.04,现在可以在“输入设备>键盘>高级选项卡>Alt/Win键行为部分>Ctrl键映射到win键(和通常的Ctrl键)”中找到此选项。 - Serj Zaharchenko
2在Ubuntu 16.04上找不到任何相关内容。 - Houman
只是一个提示 - 这并不交换键位,而是将命令键作为额外的控制键使用。 - Sam
在Linux Mint(基于Ubuntu)下,我发现以下链接更为相关:https://unix.stackexchange.com/a/743201/569254 - Paulo

苹果键盘的社区Ubuntu帮助页面提供了以下步骤,以永久进行这个更改:(测试日期:2017年05月27日)

Run the following command to append the configuration line to the file /etc/modprobe.d/hid_apple.conf creating it if necessary:

echo options hid_apple swap_opt_cmd=1 | sudo tee -a /etc/modprobe.d/hid_apple.conf

Trigger copying the configuration into the initramfs bootfile.

sudo update-initramfs -u -k all

Optionally, reboot

sudo reboot

为了暂时测试它,你可以运行
echo 1 | sudo tee /sys/module/hid_apple/parameters/swap_opt_cmd

我使用一款带有Mac键的Deck键盘,通过USB切换器将键盘/鼠标/摄像头/麦克风在多台计算机间切换,包括Mac笔记本和Ubuntu设备。当我在运行Ubuntu时,我只希望"Apple/Win"键可以像Ctrl键一样工作,这样如果我按下Apple-C进行复制操作,它能在Ubuntu上起效果。
在Ubuntu 20.04上:
- 如果你还没有安装tweaks,请执行以下命令:sudo apt install gnome-tweak-tool - 点击Activities - 输入"Tweaks",点击"Gnome Tweaks"图标 - 选择"Keyboard & Mouse" - 点击"Additional Layout Options" - 选择"Alt/Win key behavior" - 选择你想要的键位映射。我只是希望我的"Apple/Win"键做和Ctrl一样的功能,所以我选择了"Ctrl is mapped to Win and the usual Ctrl keys"。

重复的如何逐步交换xkb中的命令和控制键?

在16.04版本中,这是我最终让它起作用的方法。 Xmodmap在所有应用程序中不起作用,gnome tweak tool缺乏此功能,dconf编辑自定义的altwin2键交换(就像主要答案中所述)失败了,所以我一直苦恼不已,直到我将几个答案结合起来,得到了这个完整、简单而优雅的解决方案:

gksudo gedit /usr/share/X11/xkb/symbols/pc

改成:

default  partial alphanumeric_keys modifier_keys
xkb_symbols "pc105" {

key <ESC>  {    [ Escape        ]   };

// The extra key on many European keyboards:
key <LSGT> {    [ less, greater, bar, brokenbar ] };

// The following keys are common to all layouts.
key <BKSL> {    [ backslash,    bar ]   };
key <SPCE> {    [    space      ]   };

include "srvr_ctrl(fkey2vt)"
include "pc(editing)"
include "keypad(x11)"

key <BKSP> {    [ BackSpace, BackSpace  ]   };

key  <TAB> {    [ Tab,  ISO_Left_Tab    ]   };
key <RTRN> {    [ Return        ]   };

key <CAPS> {    [ Caps_Lock     ]   };
key <NMLK> {    [ Num_Lock      ]   };

key <LFSH> {    [ Shift_L       ]   };
key <LCTL> {    [ Alt_L     ]   };
key <LWIN> {    [ Super_L       ]   };

key <RTSH> {    [ Shift_R       ]   };
key <RCTL> {    [ Alt_R     ]   };
key <RWIN> {    [ Super_R       ]   };
key <MENU> {    [ Menu          ]   };

// Beginning of modifier mappings.
modifier_map Shift  { Shift_L, Shift_R };
modifier_map Lock   { Caps_Lock };
modifier_map Control{ Control_L, Control_R };
modifier_map Mod2   { Num_Lock };
modifier_map Mod4   { Super_L, Super_R };

// Fake keys for virtual<->real modifiers mapping:
key <LVL3> {    [ ISO_Level3_Shift  ]   };
key <MDSW> {    [ Mode_switch       ]   };
modifier_map Mod5   { <LVL3>, <MDSW> };

key <ALT>  {    [ NoSymbol, Control_L, Control_R    ]   };
//include "altwin(meta_alt)"
key <LALT> {    [ Control_L     ]   };
key <RALT> {    [ Control_R     ]   };
modifier_map Mod1   { Alt_L, Alt_R, Meta_L, Meta_R };

key <META> {    [ NoSymbol, Meta_L, Meta_R  ]   };
modifier_map Mod1   { <META> };

key <SUPR> {    [ NoSymbol, Super_L ]   };
modifier_map Mod4   { <SUPR> };

key <HYPR> {    [ NoSymbol, Hyper_L ]   };
modifier_map Mod4   { <HYPR> };
// End of modifier mappings.

key <OUTP> { [ XF86Display ] };
key <KITG> { [ XF86KbdLightOnOff ] };
key <KIDN> { [ XF86KbdBrightnessDown ] };
key <KIUP> { [ XF86KbdBrightnessUp ] };
};

hidden partial alphanumeric_keys
xkb_symbols "editing" {
key <PRSC> {
type= "PC_ALT_LEVEL2",
symbols[Group1]= [ Print, Sys_Req ]
};
key <SCLK> {    [  Scroll_Lock      ]   };
key <PAUS> {
type= "PC_CONTROL_LEVEL2",
symbols[Group1]= [ Pause, Break ]
};
key  <INS> {    [  Insert       ]   };
key <HOME> {    [  Home         ]   };
key <PGUP> {    [  Prior        ]   };
key <DELE> {    [  Delete       ]   };
key  <END> {    [  End          ]   };
key <PGDN> {    [  Next         ]   };

key   <UP> {    [  Up           ]   };
key <LEFT> {    [  Left         ]   };
key <DOWN> {    [  Down         ]   };
key <RGHT> {    [  Right        ]   };
};

保存。
rm -rf /var/lib/xkb/*

(我不知道是否需要,但我还是做了。)
重新启动。

这个方法很好,但是我无法使用同样的技巧将我的ALT键切换为左控制键。看起来ALT键的工作方式不同。你知道怎么做吗? - Pierre Thibault
同样的技巧适用于任何情况。您需要同时切换键映射和修饰符映射。您还可以进入Gnome调整或gconf(我忘记了哪一个),那里有几个切换设置,比如“交换Ctrl和Alt”。 - Tom Mercer
我们无法这样做:key { [ Control_L ] }; key { [ Control_L ] };Alt 键被处理得不同。因此我使用了 Gnome Tweaks。虽然无法完全达到我想要的效果,但也还算可以接受。 - Pierre Thibault
我不确定我理解你的问题。如果你只是希望两个alt键都起到控制作用,则上面的文件将使两个alt键都起到控制作用,而两个control键则起到alt键的作用。如果你能具体说明每个键应该是什么,也许我可以帮忙?你尝试过这个文件吗?你使用的是什么设备和键盘?法语键盘布局可能会给我们带来麻烦。 - Tom Mercer
不,我没有尝试过这个文件。我可以看到在文件的后面你将两个alt键换成了两个ctrl键。我没注意到这一点。谢谢你指出来。我会试一下的。 - Pierre Thibault
我试过你的文件。但是我想把我的右Alt键变成左Ctrl键。我无法做到这一点。它仍然是一个ISO_Level3_Shift键。这个键是我无法改变的。这个键有一些特殊之处。 - Pierre Thibault
好的,你是不是也要将左Alt键映射为右Ctrl键?将以下代码: key <LCTL> { [ Alt_L ] }; 修改为: key <LCTL> { [ Alt_R ] };反之亦然。另外,你想将左Ctrl键映射为什么键呢?我猜问题可能出在映射对不完整或重复。我知道你想将右Alt键映射为左Ctrl键,但你想将左Ctrl键映射为什么键呢?是右Alt键吗?还有其他按键的映射会改变吗?请具体说明所有的按键映射更改。 - Tom Mercer
我想要的是:左Ctrl = 右Alt 左Win = 左Alt 左Alt = 左Ctrl 右Ctrl = 右Ctrl 右Win = 左Alt 右Alt = 左Ctrl 大写锁定 = Win左除了右Alt保持不变之外,其他都没问题。我有<RALT> {[Ctrl_L]},但这不起作用。更改键盘布局也没有帮助。你能把右Alt改成左Ctrl吗? - Pierre Thibault
我最好的猜测是需要将该行改为:modifier_map Mod1 { Alt_R, Control_R, Meta_L, Meta_R };如果这不能解决“右Alt键变成左Ctrl键”的问题,请将完整的文件文本发布到类似Pastebin的地方,这样我可以一次性查看所有更改。 - Tom Mercer
你提出的解决方案导致我的键盘崩溃了:我再也无法输入文字了。这是我的实际配置,AltR无法像CtrlL那样工作https://pastebin.com/707VwsZK。希望你能找到一些解决办法。谢谢。 - Pierre Thibault
那绝对是不完整的。我从存储文件开始,只是交换了Control_L和Alt_R。在这里:https://pastebin.com/0B05v8dW 如果这个方法不起作用,请尝试删除这一行:“modifier_map Mod1 { Alt_L, Control_L, Meta_L, Meta_R };”,然后再试一次。我不确定你是否需要这一行。从那里开始进行其他替换应该很简单,但我建议你进行完整的替换,因为你在之前的映射方案中忽略了caps_lock。Capslock应该是win left键,但没有任何键映射到capslock。 - Tom Mercer
它导致我的键盘崩溃了。即使我删除你提到的那一行,它仍然会这样做。 - Pierre Thibault
抱歉,我不知道为什么会这样。当您复制/粘贴时,字符是否有趣(例如UTF-8 / Unicode / 任何其他)?也许尝试将这些更改键入到您自己的文件中?这应该是可能的。 - Tom Mercer
我已经将电脑文件恢复到之前的状态。现在我使用完全不同的解决方案:我运行一个bash脚本,使用xmodmap修改键盘,就像kalaracey在帖子开头提出的那样。这个新的解决方案对我来说非常完美。谢谢Tom的尝试。 :-) - Pierre Thibault

另一个解决方案,不涉及Xmodmap,也不依赖于gnome-tweaks,是指示模块交换它们。它已经具备了这个功能。
要调整参数,您可以实时更改它们。首先使用modinfo hid_apple检查现有参数,然后即时修改它们。
echo 2 >> /sys/module/hid_apple/parameters/fnmode
echo 1 >> /sys/module/hid_apple/parameters/swap_opt_cmd
echo 1 >> /sys/module/hid_apple/parameters/swap_fn_leftctrl

一旦您对配置感到满意,您可以使其永久化。 创建一个类似于/etc/modprobe.d/hid_apple.conf的文件,并按照以下方式添加参数:
options hid_apple fnmode=2 swap_opt_cmd=1

然后记得在启动时调用update-initramfs -k -all(或在Fedora中使用dracut --regenerate-all --force),这样参数就会在模块加载时被加载,否则它们将被忽略。
这个选项特别好,因为命令键可以用作AltGr,这有助于您输入特殊字符,如áéíóúñ,这是使用其他修复方法无法实现的。