如何提高超出操作系统限制的密钥重复率?

我有使用我的键盘的光标键导航源代码的坏习惯。 这是我已经做了15年的事情,这当然意味着我的导航速度受限于键盘的速度。 在Vista和OS X(我双启动一个MacBook),我有我的关键重复率一路上升。 但在Visual Studio和其他应用程序中,速度仍然比我想要的要慢得多。

如何在Visual Studio和其他文本编辑器中更快地实现按键重复率?

在Mac OS X上,打开全局首选项列表

open ~/Library/Preferences/.GlobalPreferences.plist 

然后更改KeyRepeat字段。 较小的数字会加快你的光标速度。 设置对话框只会将其设置为最小值2,所以如果设置为0或1,则会获得更快的光标。

我必须重新启动才能生效。

在Windows中,您可以通过系统调用( SystemParametersInfo(SPI_SETFILTERKEYS,...) )来设置它。

我为自己写了一个实用程序: keyrate <delay> <repeat>

Github存储库 。

完整的来源,以防止链接消失:

 #include <windows.h> #include <stdlib.h> #include <stdio.h> BOOL parseDword(const char* in, DWORD* out) { char* end; long result = strtol(in, &end, 10); BOOL success = (errno == 0 && end != in); if (success) { *out = result; } return success; } int main(int argc, char* argv[]) { FILTERKEYS keys = { sizeof(FILTERKEYS) }; if (argc == 1) { puts ("No parameters given: disabling."); } else if (argc != 3) { puts ("Usage: keyrate <delay ms> <repeat ms>\nCall with no parameters to disable."); return 0; } else if (parseDword(argv[1], &keys.iDelayMSec) && parseDword(argv[2], &keys.iRepeatMSec)) { printf("Setting keyrate: delay: %d, rate: %d\n", (int) keys.iDelayMSec, (int) keys.iRepeatMSec); keys.dwFlags = FKF_FILTERKEYSON|FKF_AVAILABLE; } if (!SystemParametersInfo (SPI_SETFILTERKEYS, 0, (LPVOID) &keys, 0)) { fprintf (stderr, "System call failed.\nUnable to set keyrate."); } return 0; } 

很多时候我想把一个函数放在我的窗口中。 滚动是唯一的方法。 而且,在有很多非单词字符的代码中,Ctrl-left / right仍然可能很慢。 我也使用键盘。 尽pipe如此,对我来说还是有几个问题的。 一,它有时使用默认的速度,而不是我设定的实际值。 另一种是有时忽略了最初的延迟。 我仍然觉得它非常有用。 他们说,4年前他们会在6个月内释放源… 🙁

好的,根据修改HCU \ … \ Keyboard Response的人的build议,这对我来说很好。

 [HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response] "AutoRepeatDelay"="250" "AutoRepeatRate"="13" "BounceTime"="0" "DelayBeforeAcceptance"="0" "Flags"="59" 

Windows标准的自动重复延迟。 13 ms(77 char / sec)重复率。 标志打开FilterKeys? 这些值在login时被读取。 请记住注销并重新login才能生效。

对于Windows,打开regedit.exe并导航到HKEY_CURRENT_USER\Control Panel\Keyboard 。 将KeyboardSpeed更改为您的喜好。

我在我的电脑上使用KeyboardKing。 这是免费的,它可以增加200的重复率,这已经足够了。 我build议将进程优先级设置为高,以便更平滑的移动和更less发生的“重复locking”,这是非常烦人的。 高度优先,它完美的作品。

没有人知道我们为什么用箭头导航。 这很有趣。

对于它的价值,Visual Assist有一个选项,可以使我在Visual Studio中的所有有效的按键动作翻倍。

如上所述,在Mac OSX内部有两个处理键盘重复速率的参数:“KeyRepeat”和“InitialKeyRepeat”。 通常情况下,他们是从系统偏好设置,他们被称为“按键重复率”和“直到重复延迟”。

系统偏好设置的范围如下

 InitialKeyRepeat |--------------|-----------------| off (30000) long (120) short (25) KeyRepeat |-------------------------------| slow (120) fast (2) 0.5 char/s 33 char/s 

数值似乎是一个15毫秒乘数。 幸运的是,它们可以在“GlobalPreferences.plist”中设置超出预定义的限制。 我发现以下最适合自己的值:

 InitialKeyRepeat = 15 --> 225 ms KeyRepeat = 1 --> 15 ms or 66 chars/s 

我不知道如何超越极限,但我知道如何在一个单一的媒体进一步跳过。 我的知识只有在Windows中,因为我没有Mac来做这件事。Ctrl +箭头跳过一个单词,根据编辑器,它可能跳到下一部分的空白。 您也可以使用Ctrl + Shift +箭头来select任何方向的单词。

我喜欢单独在键盘上工作。 为什么? 因为当你使用鼠标,你必须抓住它。 一个时间的损失。

另一方面,有时似乎每个应用程序都有自己的键盘types率内置。不要说从BIOS属性或操作系统设置。 所以我收集了很快的快捷键(比如,按住右键(箭头键),右键点击右键(箭头),右键比右键更快)。

这里有一些我觉得最有价值的键盘快捷键(在Windows上工作,我不确定OSX):

 ctrl-right: Go to the end of the previous/the next word (stated before) ctrl-left: Go to the beginning of the previous/the word before (stated before) ctrl-up: Go to the beginning of this paragraph (or to the next paragraph over this) ctrl-down: Go to the end of this paragraph (or to the next paragraph after this) ctrl-pos1: Go to the beginning of the file ctrl-end: Go to the end of the file 

所有这些都可以与shift键结合使用,以便在select文本的同时进行select。 现在让我们去更奇怪的东西:

 alt-esc: Get the actual application into the background ctrl-esc: This is like pressing the "start-button" in Windows: You can navigate with arrow keys or shortcuts to start programs from here ctrl-l: While using Firefos this accesses the URL-entry-field to simply type URLs (does not work on stackoverflow :) ctrl-tab, ctrl-pageup ctrl-pagedwn Navigate through tabs (even in your development environment) 

所以这些是我编程时最需要的快捷键。

对于OSX,内核扩展KeyRemap4MacBook将允许你微调各种键盘参数,其中键重复速度(我设置为15毫秒,很好)。

在Mac上,这是选项箭头来跳过一个单词和选项+ shift +箭头来select。 Command +箭头跳到一行的结尾或开始处,或文档的结尾或开始处。 也有页面向上,向下翻页,家庭和结束键;)与这些也保持转移select。

看来你不能在Windows 7上轻松完成这个任务。

当您按住button时,速度由Windowsregistry项控制:HCU->控制面板 – >键盘 – >键盘延迟。

通过设置这个参数为0,你会得到最大的重复率。 戏剧是如果重复速度对你来说仍然很慢,你不能低于0。 0延时意味着重复延时是250ms。 但是,250ms的延迟仍然很慢。 看到这个: http : //technet.microsoft.com/en-us/library/cc978658.aspx

你仍然可以去Accesibility,但你应该知道,这些选项是帮助残疾人使用他们的键盘,而不是帮助快速打字的极客。 他们不会帮助。 使用Linux,他们告诉你。

我相信Windows的解决scheme在于硬件控制。 寻找你的键盘特殊的驱动程序或尝试调整现有的。

虽然这个问题已经有好几年了,但我在几个不同的开发者网站上也时常遇到同样的问题。 所以我想我可能会提供一个替代解决scheme,我用于我的日常开发工作(因为Windowsregistry设置从来没有为我工作)。

以下是我的小型Autorepeat脚本(约125行),可以通过AutoHotkey_L运行(缺点是,它只能在Windows下运行,至lessVista,7,8.1):

 ; ==================================================================== ; DeveloperTools - Autorepeat Key Script ; ; This script provides a mechanism to do key-autorepeat way faster ; than the Windows OS would allow. There are some registry settings ; in Windows to tweak the key-repeat-rate, but according to widely ; spread user feedback, the registry-solution does not work on all ; systems. ; ; See the "Hotkeys" section below. Currently (Version 1.0), there ; are only the arrow keys mapped for faster autorepeat (including ; the control and shift modifiers). Feel free to add your own ; hotkeys. ; ; You need AutoHotkey (http://www.autohotkey.com) to run this script. ; Tested compatibility: AutoHotkey_L, Version v1.1.08.01 ; ; (AutoHotkey Copyright © 2004 - 2013 Chris Mallet and ; others - not me!) ; ; @author Timo Rumland <timo.rumland ${at} gmail.com>, 2014-01-05 ; @version 1.0 ; @updated 2014-01-05 ; @license The MIT License (MIT) ; (http://opensource.org/licenses/mit-license.php) ; ==================================================================== ; ================ ; Script Settings ; ================ #NoEnv #SingleInstance force SendMode Input SetWorkingDir %A_ScriptDir% ; Instantiate the DeveloperTools defined below the hotkey definitions developerTools := new DeveloperTools() ; ======== ; Hotkeys ; ======== ; ------------------- ; AutoRepeat Hotkeys ; ------------------- ~$UP:: ~$DOWN:: ~$LEFT:: ~$RIGHT:: DeveloperTools.startAutorepeatKeyTimer( "" ) return ~$+UP:: ~$+DOWN:: ~$+LEFT:: ~$+RIGHT:: DeveloperTools.startAutorepeatKeyTimer( "+" ) return ~$^UP:: ~$^DOWN:: ~$^LEFT:: ~$^RIGHT:: DeveloperTools.startAutorepeatKeyTimer( "^" ) return ; ------------------------------------------------------- ; Jump label used by the hotkeys above. This is how ; AutoHotkey provides "threads" or thread-like behavior. ; ------------------------------------------------------- DeveloperTools_AutoRepeatKey: SetTimer , , Off DeveloperTools.startAutorepeatKey() return ; ======== ; Classes ; ======== class DeveloperTools { ; Configurable by user autoRepeatDelayMs := 180 autoRepeatRateMs := 40 ; Used internally by the script repeatKey := "" repeatSendString := "" keyModifierBaseLength := 2 ; ------------------------------------------------------------------------------- ; Starts the autorepeat of the current captured hotkey (A_ThisHotKey). The given ; 'keyModifierString' is used for parsing the real key (without hotkey modifiers ; like "~" or "$"). ; ------------------------------------------------------------------------------- startAutorepeatKeyTimer( keyModifierString ) { keyModifierLength := this.keyModifierBaseLength + StrLen( keyModifierString ) this.repeatKey := SubStr( A_ThisHotkey, keyModifierLength + 1 ) this.repeatSendString := keyModifierString . "{" . this.repeatKey . "}" SetTimer DeveloperTools_AutoRepeatKey, % this.autoRepeatDelayMs } ; --------------------------------------------------------------------- ; Starts the loop which repeats the key, resulting in a much faster ; autorepeat rate than Windows provides. Internally used by the script ; --------------------------------------------------------------------- startAutorepeatKey() { while ( GetKeyState( this.repeatKey, "P" ) ) { Send % this.repeatSendString Sleep this.autoRepeatRateMs } } } 
  1. 将上面的代码保存在一个文本文件(UTF-8)中,例如名为“AutorepeatScript.ahk”
  2. 安装AutoHotkey_L
  3. 双击“AutorepeatScript.ahk”,享受更快的箭头键(或将文件放入自动启动文件夹)

(您可以在脚本中调整重复延迟和速率,请参阅';可由用户configuration')。

希望这可以帮助!

那么,这可能是显而易见的,但是:

  • 对于水平导航,Home(行开始),End(行结束),Ctrl-Left(单词左),Ctrl-Right(单词右)在我知道的所有编辑器中工作

  • 对于垂直导航,Page Up,Page Down,Ctrl-Home(文本开始),Ctrl-End(文本结束)也是如此

另外(在一个侧面说明),我想强制我的退格键和删除键不重复,所以删除(或replace)文本的唯一方法是首先标记它, 然后删除它(或键入replace文本)。

不要按字符导航。

在Vim中(请参阅ViEmu for Visual Studio):

  • bw – 上一个/下一个单词
  • () – 上一个/下一个句子(完整分隔的文本)
  • {} – 上一个/下一个段落(空行分隔的文本部分)
  • /? – 将光标移到上一个/下一个出现的文本(w / set incsearch

而且,每个移动都以一个数字作为前缀,让您指定重复该命令的次数,例如:

  • 20j – 跳下20线
  • 3} – 三段落
  • 4w – 向前移动4个字
  • 40G – 移至(绝对)行号40

在编辑器中,最有可能的方法是浏览文本。 如果没有,你应该考虑改用更好的。