如何将密钥重复率提高到操作系统限制以外?

时间:2008-10-05 01:33:29

标签: windows visual-studio macos keyboard

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

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

15 个答案:

答案 0 :(得分:75)

在Windows中,您可以使用系统调用(SystemParametersInfo(SPI_SETFILTERKEYS,...))设置此项。

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

Github repository

链接消失的完整来源:

#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;
}

答案 1 :(得分:30)

很多时候我想把一个功能集中在我的窗口中。滚动是唯一的方法。 此外,在有很多非单词字符的代码中,Ctrl-left / right仍然很慢。 我也使用键盘。不过,它有几个问题。一,它有时使用默认速度而不是我设置的实际值。另一种有时它会忽略最初的延迟。我仍觉得它非常有用。他们说4年前他们会在6个月内发布消息来源...... :(

好的,根据有人修改HCU \ ... \键盘响应的建议,这对我很有用。

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

Windows标准AutoRepeat延迟。 13毫秒(77焦耳/秒)重复率。 标志打开FilterKeys? 这些值在登录时读取。请记得注销并重新登录以使其生效。

答案 2 :(得分:29)

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

open ~/Library/Preferences/.GlobalPreferences.plist

然后更改KeyRepeat字段。较小的数字将加快您的光标速率。设置对话框只会将其设置为最小值2,因此如果转到0或1,您将获得更快的光标。

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

答案 3 :(得分:8)

对于Windows,请打开regedit.exe并导航至HKEY_CURRENT_USER\Control Panel\Keyboard。根据自己的喜好更改KeyboardSpeed。

答案 4 :(得分:8)

我在PC上使用KeyboardKing。它是免费软件,它可以将重复率提高到200,这已经足够了。我建议将进程优先级设置为“高”,以便进行更平滑的移动,减少“重复锁定”,这种情况有时会发生并且非常烦人。优先级高,效果很好。

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

答案 5 :(得分:7)

Visual Assist可以选择将Visual Studio中的有效键移动加倍,我一直在使用它。

答案 6 :(得分:5)

Keyboard preferences window

hyperlogic 所述,在Mac OS X上,内部有两个处理键盘速度的参数:KeyRepeatInitialKeyRepeat。在“系统偏好设置”中,它们会映射到Key Repeat RateDelay Until Repeat滑块。滑块范围和相关的内部参数值(括号内)如下所示。它们似乎是15 ms键盘采样间隔的乘数。

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

幸运的是,这些参数可以直接在~/Library/Preferences/.GlobalPreferences.plist文件中设置超出预定义的限制。我发现以下值对我自己来说最方便:

KeyRepeat = 1         --> 1/(1*15 ms) = 66.7 char/s
InitialKeyRepeat = 15 --> 15*15 ms = 225 ms

请注意,在最新的Mac OS X版本中,滑块的命名略有不同。

答案 7 :(得分:3)

我不知道如何加速超出限制,但我知道如何在一次按下进一步跳过。我的知识只在Windows中,因为我没有Mac来执行此操作.Ctrl + Arrow跳过一个单词,根据编辑器,它可能只是跳到下一部分的空白。您也可以使用Ctrl + Shift +箭头选择任何方向的单词。

答案 8 :(得分:3)

我喜欢单独使用键盘。为什么?因为当你使用鼠标时,你必须抓住它。时间流逝。

另一方面,有时似乎每个应用程序都有自己的键盘类型速率。不能说BIOS属性或操作系统设置。所以我收集的快捷键可以非常快(即你可以更快地输入 Ctrl +右(箭头) - 右 - 而不是将手指放在右边(箭头)键上:)。

以下是我认为最有价值的一些键盘快捷键(适用于Windows;我不确定OS X):

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键组合,以便在执行此操作时选择文本。现在让我们去寻找更奇怪的东西:

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 Firefox this accesses the URL-entry-field to simply
             type URLs (does not work on Stack Overflow :)
ctrl-tab,
ctrl-pageup
ctrl-pagedwn Navigate through tabs (even in your development environment)

所以这些是我在编程时所需的最常用的快捷方式。

答案 9 :(得分:3)

对于OS X,内核扩展KeyRemap4MacBook将允许您微调各种键盘参数,其中包括键重复率(我将其设置为15 ms,并且效果很好)。

答案 10 :(得分:1)

在Mac上,跳过一个单词的选项箭头和选项+ shift +箭头选择。 Command +箭头跳到行的结尾或开头或文档的结尾或开头。还有页面向上,向下翻页,主页和结束键;)按住shift也选择那些。

答案 11 :(得分:1)

似乎在Windows 7上无法轻松完成此操作。

当您按住按钮时,速度由Windows注册表项控制:HCU-&gt;控制面板 - &gt;键盘 - &gt;键盘延迟。

通过将此参数设置为0,您将获得最大重复率。如果你的重复速度仍然很慢,你就不能低于0。 0延迟意味着重复延迟为250ms。但是,250毫秒的延迟仍然很慢。请参阅:http://technet.microsoft.com/en-us/library/cc978658.aspx

你仍然可以使用Accesibility,但你应该知道这些选项是为了帮助残障人士使用他们的键盘,而不是为快速打字的极客提供帮助。他们无济于事。他们告诉你,使用Linux。

我认为Windows的解决方案在于硬件控制。寻找键盘的特殊驱动程序或尝试调整现有键盘。

答案 12 :(得分:1)

虽然这个问题已有几年历史了,但我仍然会在几个不同的开发者网站上不时遇到同样的问题。所以我想我可能会提供一个替代解决方案,我将其用于日常开发人员工作(因为Windows注册表设置对我来说从未起作用)。

以下是我的小型Autorepeat-Script(~125行),可以通过AutoHotkey_L运行(缺点是,它只在Windows下运行,至少在Vista,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”以享受快速箭头键(或将文件放入自动启动文件夹)
  4. (您可以在脚本中调整重复延迟和速率,请参阅';可由用户配置')。

    希望这有帮助!

答案 13 :(得分:0)

嗯,这可能很明显,但是:

  • 对于水平导航,Home(行开头),End(行结束),Ctrl-Left(左词),Ctrl-Right(word right)适用于我知道的所有编辑器

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

另外(在旁注中),我想强制我的Backspace和Delete键不重复,因此删除(或替换)文本的唯一方法是 first 标记它,然后删除它(或键入替换文本)。

答案 14 :(得分:-2)

不要按字符导航。

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

  • bw - 上一个/下一个字
  • () - 上一句/下一句(句号分隔文字)
  • {} - 上一个/下一个段落(文字的空行分隔部分)
  • /? - 将光标移动到文本找到的上一个/下一个出现位置(w / set incsearch

此外,每个动作都使用一个数字作为前缀,可以指定重复命令的次数,例如:

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

在编辑器中,很可能有相同的方法来浏览文本。如果没有,你应该考虑换一个更好的。