Apples MacBook Pro hat eine leichte Verzögerung bei der Feststelltaste . Das heißt, die Feststelltaste muss etwas länger als normal gedrückt werden, um den zum Aktivieren der Feststelltaste erforderlichen Tastendruck zu registrieren.
Das ist super nervig. Weiß jemand, wie man das verhindern kann?
(Oben von Stackoverflow übernommen , da es dort als "Off-Topic" geschlossen wurde.)
Um es weiter auszuführen: Apple betrachtet dies als eine Funktion, und ihr Knowledge Base-Artikel offenbart nicht, wie diese Verzögerung deaktiviert werden kann.
Ich habe jedoch Grund zu der Annahme, dass dies möglich ist.
Insbesondere habe ich festgestellt, dass, zumindest meiner Erfahrung nach, die Verzögerung verschwindet , wenn Sie die Feststelltaste unter Mac OS X neu zuordnen (in den Systemeinstellungen .. Tastatur .. Modifikatortasten) und sie z. B. der Steuerung zuordnen während ich bei Mac OS X angemeldet bin.
Mein Problem ist, dass die Verzögerung bestehen bleibt, wenn ich in Ubuntu Linux boote, und in diesem Zusammenhang ist die Verzögerung immer noch vorhanden, selbst wenn ich die Feststelltaste der Steuerung neu zuweise.
Die Frage ist also: Wie deaktiviert Apple die Verzögerung, und was noch wichtiger ist, wie kann man diese Aktion im Kontext einer Linux-Installation auf dem Laptop replizieren?
Update: Es gibt einen Thread zu Superuser , der Problemumgehungen bieten kann. Ich habe die dortigen Vorschläge noch nicht ausprobiert (nämlich: (1) Umschalten von CapsLock-NoAction aus / ein und (2) ein Firmware-Upgrade). Ich kann aus dem Kontext dieses Threads nicht erkennen, ob die Problemumgehungen auf einer Ubuntu-Installation getestet wurden.
Ich habe herausgefunden, wie man das macht. Kurz gesagt, Sie müssen als Root einen "Feature Report" bestehend aus den Bytes 0x9, 0x0, 0x0, 0x0
an das entsprechende Hidraw-Gerät senden.
Mit diesem Befehl finden Sie das richtige Hidraw-Gerät:
dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | sed -e 's/.*hidraw\([[:digit:]]\+\).*/\/dev\/hidraw\1/'
Der Code zum Senden des magischen Steuerpakets ist unten. Kompiliert mit gcc, nimmt das Hidraw-Gerät als Parameter. Der gesamte Ablauf lautet also:
disable-capslock-delay.c
gcc -o disable-capslock-delay disable-capslock-delay.c
HIDDEVICE=$(dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | sed -e 's/.*hidraw\([[:digit:]]\+\).*/\/dev\/hidraw\1/')
sudo ./disable-capslock-delay $HIDDEVICE
Die Schritte 3 und 4 müssen bei jedem Neustart durchgeführt werden (oder die Tastatur abziehen und wieder anschließen); Sie können sie in /etc/rc.local
(oder das Äquivalent Ihrer Distribution) einfügen, um sie beim Booten auszuführen (Sie brauchen es sudo
in diesem Fall nicht; und Sie möchten vielleicht die kompilierte Binärdatei in /usr/local/sbin/
oder so verschieben).
Ich habe einige Sicherheitsprüfungen für Anbieter-ID, Geräte-ID und Berichtsdeskriptorlänge vorgenommen. Möglicherweise müssen Sie die beiden letzteren ändern, wenn sich Ihr Modell von meinem unterscheidet.
#include <linux/hidraw.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
if (argc != 2 || strcmp(argv[1], "-h") == 0) {
printf("Pass a hidraw device as the first and only parameter!\n");
printf("You may find the right device with:\n");
printf(" dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | "
"sed -e 's/.hidraw\([[:digit:]]\+\)./\/dev\/hidraw\1/'\n");
return 1;
}
int fd, i, res, desc_size = 0;
char buf[256];
struct hidraw_devinfo info;
char *device = argv[1];
fd = open(device, O_RDWR | O_NONBLOCK);
if (fd < 0) {
perror("Unable to open device");
return 1;
}
memset(&info, 0, sizeof(info));
memset(buf, 0, sizeof(buf));
// Get Report Descriptor Size
res = ioctl(fd, HIDIOCGRDESCSIZE, &desc_size);
if (res < 0) {
perror("HIDIOCGRDESCSIZE");
}
if (desc_size != 75) {
printf("Error: unexpected descriptor size %d; you've probably got "
"the wrong hidraw device!\n", desc_size);
return 1;
}
// Get Raw Info
res = ioctl(fd, HIDIOCGRAWINFO, &info);
if (res < 0) {
perror("HIDIOCGRAWINFO");
} else {
if (info.vendor != 0x05ac) {
printf("Error: Wrong vendor ID, make sure you got the right "
"hidraw device!\n");
return 1;
}
if (info.product != 0x0250) {
printf("Warning: Unknown product ID 0x%x!\n", info.product);
}
}
// Get Feature
buf[0] = 0x09; // Report Number
res = ioctl(fd, HIDIOCGFEATURE(256), buf);
if (res < 0) {
perror("HIDIOCGFEATURE");
} else {
printf("HID Feature Report (before change):\n\t");
for (i = 0; i < res; i++) printf("%hhx ", buf[i]);
puts("\n");
}
// Set Feature
buf[0] = 0x09; // Report Number
buf[1] = 0x00; // Report data
buf[2] = 0x00; // padding
buf[3] = 0x00; // padding
res = ioctl(fd, HIDIOCSFEATURE(4), buf);
if (res < 0) {
perror("HIDIOCSFEATURE");
} else {
printf("Caps lock delay disabled.\n");
}
// Get Feature
buf[0] = 0x09; // Report Number
res = ioctl(fd, HIDIOCGFEATURE(256), buf);
if (res < 0) {
perror("HIDIOCGFEATURE");
} else {
printf("HID Feature Report (after change):\n\t");
for (i = 0; i < res; i++) printf("%hhx ", buf[i]);
puts("\n");
}
close(fd);
return 0;
}
Hier ist der Fix für macOS Sierra.
Gehen Sie zu Systemeinstellungen > Barrierefreiheit
Wenn das Barrierefreiheitsfenster geöffnet ist – im linken Teil des Fensters – klicken Sie auf Tastatur
Dann gibt es die 2 Optionen – für Sticky Keys und für Slow Keys – klicken Sie auf das Kästchen neben Slow Keys, um es zu aktivieren – dann klicken Sie auf die Options...
Schaltfläche – ein neues Fenster wird mit einem Schieberegler angezeigt, um die Akzeptanzverzögerung zu ändern – standardmäßig das ist in der mitte. Schieben Sie den Knopf ganz nach links, so dass es die kürzest mögliche Zeit ist.
Jetzt sollte es behoben sein. Ich habe nicht experimentiert, um zu sehen, ob der Fix beim Neustart erhalten bleibt, aber ich bin zuversichtlich, dass dies der Fall sein wird.
BEARBEITEN: Dies scheint eine beliebte Landungsfrage für Benutzer zu sein, die die Verzögerung der Feststelltaste in OS X entfernen möchten. Ab OS X Mojave
Gehen Sie zu den Systemeinstellungen; Barrierefreiheit; Klaviatur; Aktivieren Sie Slow Keys und gehen Sie in die Optionen; Drehen Sie die Verzögerung auf das Minimum. Der einzige unerwünschte Nebeneffekt, der mir bisher aufgefallen ist, ist eine langsame Rücktaste, wenn Sie sie gedrückt halten. Im Allgemeinen verwende ich sowieso CMD+A / CMD+SHIFT+L/R / CMD+SHIFT+CTRL+L/R, also ist es kein großes Problem.
Ab El Capitan und früher,
Die Lösung ist ziemlich schwer fassbar, und Sie würden nicht wirklich wissen, dass Sie sie entfernt haben, es sei denn, Sie wollten sie überhaupt erst loswerden. Die Art und Weise, die ich Ihnen zeigen werde, gilt nur für die (aktuelle) neueste Version von OSX, Yosemite. Sie können diese Methode jedoch unbedingt auf frühere und zukünftige Versionen anwenden.
Die Lösung ist einfach. Wenn Sie in den Systemeinstellungen über das Apple-Logo in der oberen linken Ecke zu Tastatur navigieren, gelangen Sie zu diesem Bildschirm
Wenn Sie auf die Schaltfläche Zusatztasten klicken, können Sie die Funktion jeder der programmierbaren Tasten ändern. Alles, was Sie tun müssen, ist, die Feststelltaste auf keine Aktion zu stellen und OK zu drücken, um zum Tastaturmenü zurückzukehren. Wenn Sie fertig sind, gehen Sie zurück zu den Modifikatortasten und ändern Sie die Feststelltaste wieder auf Feststelltaste. Dadurch wird die Verzögerung beseitigt! Beachten Sie, dass dieser Fix bestehen bleibt, bis Sie das Gerät in den Ruhezustand versetzen, neu starten oder ausschalten. An diesem Punkt wird die Verzögerung wieder eingesetzt.
Es sind seltsame Korrekturen, und es stellt sich die Frage, warum sie keine Option zum Entfernen der Verzögerung bieten, wenn diese Korrektur rein softwarebasiert ist. Aber hey, zumindest gibt es einen Weg!
Fröhliches Kappen.
Ausarbeitung der @jmrk-Antwort. Sein Code funktioniert gut für die sogenannte „Aluminium“-Tastatur, aber Apple hat auch drahtlose Tastaturen unter dem Namen „Magic Keyboard“ mit der Produkt-ID 0x022d herausgebracht. (Sie haben auch ein Aluminiumgehäuse, und ich denke, dass mein Modell aus dem Jahr 2008 oder so stammt.) Dieses Produkt hat das gleiche Problem mit der Feststelltaste, und fast der gleiche Code kann es beheben. Neben der Änderung der Produkt-ID beträgt die Deskriptorgröße 218 und die zu sendenden Daten sind nicht 0x00, sondern 0x01:
buf[0] = 0x09; // Report Number
buf[1] = 0x01; // Report data
Ich habe das heute gefunden und wollte meine Antwort hier aufzeichnen, falls es jemandem hilft, einschließlich meinem zukünftigen Ich.
Hier ist ein vollständiges Programm, das das Problem auf beiden Arten von Geräten behebt. Sie können zusätzliche versteckte Geräte übergeben, dies gilt nur für bekannte. Sie können es also einfach so nennen./a.out /dev/hidraw*
#include <linux/hidraw.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
printf("Pass all devices to configure. For example, like this: %s /dev/hidraw*\n", argv[0]);
int expected_desc_size;
char data_to_set;
for (int argnum=1;argnum<argc;argnum++) {
printf("Trying to configure %s...\n", argv[argnum]);
int fd, i, res, desc_size = 0;
char buf[256];
struct hidraw_devinfo info;
char *device = argv[argnum];
fd = open(device, O_RDWR | O_NONBLOCK);
if (fd < 0) {
perror("Unable to open device");
return 1;
}
memset(&info, 0, sizeof(info));
memset(buf, 0, sizeof(buf));
// Get Raw Info
res = ioctl(fd, HIDIOCGRAWINFO, &info);
if (res < 0) {
perror("HIDIOCGRAWINFO");
return 1;
}
if (info.vendor == 0x05ac) {
printf("Apple device found!\n");
} else {
printf("Not an apple device.\n");
continue;
}
if (info.product == 0x022d) {
printf("We have a 'magic' keyboard\n");
expected_desc_size = 218;
data_to_set = 1;
} else if (info.product == 0x0250) {
printf("We have an 'aluminium' keyboard\n");
expected_desc_size = 75;
data_to_set = 0;
}
else {
printf("Warning: Unknown product ID 0x%x!\n", info.product);
continue;
}
// Get Report Descriptor Size
res = ioctl(fd, HIDIOCGRDESCSIZE, &desc_size);
if (res < 0) {
perror("HIDIOCGRDESCSIZE");
return 1;
}
if (desc_size != expected_desc_size) {
printf("Error: unexpected descriptor size %d; panic'ing", desc_size);
return 1;
}
// Get Feature
buf[0] = 0x09; // Report Number
res = ioctl(fd, HIDIOCGFEATURE(256), buf);
if (res < 0) {
perror("HIDIOCGFEATURE");
} else {
printf("HID Feature Report (before change):\n\t");
for (i = 0; i < res; i++) printf("%hhx ", buf[i]);
puts("\n");
}
// Set Feature
buf[0] = 0x09; // Report Number
buf[1] = data_to_set; // Report data
buf[2] = 0x00; // padding
buf[3] = 0x00; // padding
res = ioctl(fd, HIDIOCSFEATURE(4), buf);
if (res < 0) {
perror("HIDIOCSFEATURE");
} else {
printf("Caps lock delay disabled.\n");
}
// Get Feature
buf[0] = 0x09; // Report Number
res = ioctl(fd, HIDIOCGFEATURE(256), buf);
if (res < 0) {
perror("HIDIOCGFEATURE");
return 1;
}
printf("HID Feature Report (after change):\n\t");
for (i = 0; i < res; i++) printf("%hhx ", buf[i]);
puts("\n");
close(fd);
}
return 0;
}
Ich weiß mit Sicherheit, dass die Verzögerung der Feststelltaste eine Funktion der Firmware auf der Tastatur selbst ist - Sie können also sicher sein, dass das Verzögerungstiming unabhängig vom Betriebssystem, das die Tastatur gerade verwendet, auftritt.
Ich weiß auch, dass Apple keinen Weg anbietet, die Firmware auf eine niedrigere Ebene zu flashen, also müssen wir alle warten, bis jemand mit genügend Hardware-Erfahrung die Tools und Schritte bloggt, die er durchgeführt hat, um die Hardware dazu zu bringen, die ältere Firmware zu laden (oder bereitzustellen was wie eine neuere Firmware aussieht, die die Verzögerung ohne Verzögerung auf die vorherige Funktion zurückführt.)
Ich entschuldige mich für die Nichtantwort, aber der Weg, dies zu erreichen, ist gut beleuchtet und kann anderen helfen, in der Zwischenzeit Maßnahmen zu ergreifen (Auswahl einer älteren Tastatur - oder Verzicht auf ein Upgrade der Firmware), während wir auf eine echte Lösung warten ein kurzer oder kein Timer auf der Feststelltaste.
Gehen Sie zu Systemeinstellungen > Barrierefreiheit > Tastatur > Langsame Tasten aktivieren > Annahmeverzögerung ganz nach links (kurz) ändern! Das hat bei mir funktioniert.
Die Lösung "CapsLock-NoAction aus-/einschalten", auf die sich das OP bezieht, funktioniert sowohl auf meiner kabelgebundenen Mac-Tastatur als auch auf meiner MacBookPro-Tastatur. Bradley sagt, dass dies nur auf Yosemite funktioniert, aber ich habe es erfolgreich auf Snow Leopard (10.6.8) und Mavericks (10.9.5) verwendet. Ich habe dies auch in einer Kubuntu-VM getestet und Caps Lock funktionierte weiterhin korrekt in der VM.
Modifier Keys...
:No Action
und klicken Sie auf OK
:Modifier Keys...
erneut auf und stellen Sie die Feststelltaste auf Caps Lock
, und klicken Sie auf OK
:Dies gilt nur bis zum nächsten Neustart.
init.lua
unter dem Pfad ~/.hammerspoon
, fügen Sie den folgenden Code ein.pressedF19 = function()
hs.hid.capslock.toggle()
end
hs.hotkey.bind({}, 'F19', pressedF19, nil)
Laden Sie dann die Hammerspoon-Konfiguration neu, damit die Änderungen wirksam werden.
Siehe meinen Blog hier http://hellohtml5.com/2019/04/25/best-way-to-disable-capslock-delay-on-mac/
Ich habe ein sehr leichtes Open-Source-Tool geschrieben, um genau das zu beheben:
tom1990
OrangeBox
pnkfelix
Mike HR
pnkfelix
rr
zum Debuggen verwenden kann, und vielleicht werde ich Ich werde noch einmal versuchen, eine Lösung zu finden.fel1x
Pete