
Я хочу иметь возможность назначить клавишу Caps Lock на Escape, если она не нажата с какой-либо другой клавишей, и Control, если она нажата. Как это сделать в Windows 7?
решение1
Это могло появиться на ранее упомянутомvim вики-страницапосле решения Рича выше.
; Author: fwompner gmail com
#InstallKeybdHook
SetCapsLockState, alwaysoff
Capslock::
Send {LControl Down}
KeyWait, CapsLock
Send {LControl Up}
if ( A_PriorKey = "CapsLock" )
{
Send {Esc}
}
return
Это не моя работа, но я начал ее использовать, и она работает именно так, как описано, без особых оговорок, и поскольку она не пытается отображать какие-либо исключения (потому что они не нужны), она ведет себя довольно хорошо в Chrome (мне она очень нужна была для Vimium).
решение2
Вы можете переназначить его на Escape с помощьюSharpKeys
Однако я не знаю реалистичного способа выполнить условное переназначение, кроме как написать драйвер клавиатуры.
решение3
Это не совсем то, что вам нужно, но очень близко, если вы можете жить с некоторыми недостатками. ВотAutoHotKeyсценарий:
$CapsLock::LControl
$CapsLock Up::Send {Escape}
return
Он переназначает Caps Lock на Ctrl и отправляет Escape, когда вы отпускаете клавишу. Мне потребовалось некоторое время, чтобы привыкнуть к нажатию клавиши Escape каждый раз, когда я отпускаю клавишу Caps Lock. Однако это практически бесполезно в текстовых областях веб-сайтов, потому что нажатие Escape теряет фокус на текстовой области.
Я ищу решение этой проблемы. Я мог бы пойти так далеко, чтобы написать какой-нибудь драйвер/клавиатурный хук на C, если понадобится, хаха.
Неприятности, характерные для Vim: из-за этого невозможно набирать диграфы с помощью комбинации Ctrl-K, и это вообще просто раздражает, пока вы к этому не привыкнете. Но для меня это работает хорошо, потому что я бы сделал все, чтобы избегать клавиш Esc и Ctrl, насколько это возможно.
решение4
Я использую следующееAutoHotkeyсценарий для этого, адаптированный изодин я нашел на Vim Tips Wiki. Реализация немного хакерская, но она «работает для меня». (И в отличие от других ответов на этой странице по состоянию на 2016-09-19, она полностью решает проблему без каких-либо известных мне оговорок.)
Первоначальный кодер отметил:
Скрипт также пытается обнаружить и избежать «ложных срабатываний», когда вы нажимаете Control и другую клавишу, а затем отпускаете обе слишком быстро, то есть до истечения времени ожидания.
Обязательно настройте значение 250 мс в зависимости от того, насколько хороша или плоха ваша клавиатура, и от вашего собственного времени реакции. Это, вероятно, то, что можно настроить экспериментально по вашему вкусу.
g_LastCtrlKeyDownTime := 0
g_AbortSendEsc := false
g_ControlRepeatDetected := false
*CapsLock::
if (g_ControlRepeatDetected)
{
return
}
send,{Ctrl down}
g_LastCtrlKeyDownTime := A_TickCount
g_AbortSendEsc := false
g_ControlRepeatDetected := true
return
*CapsLock Up::
send,{Ctrl up}
g_ControlRepeatDetected := false
if (g_AbortSendEsc)
{
return
}
current_time := A_TickCount
time_elapsed := current_time - g_LastCtrlKeyDownTime
if (time_elapsed <= 250)
{
SendInput {Esc}
}
return
~*^a::
~*^b::
~*^c::
~*^d::
~*^e::
~*^f::
~*^g::
~*^h::
~*^i::
~*^j::
~*^k::
~*^l::
~*^m::
~*^n::
~*^o::
~*^p::
~*^q::
~*^r::
~*^s::
~*^t::
~*^u::
~*^v::
~*^w::
~*^x::
~*^y::
~*^z::
~*^1::
~*^2::
~*^3::
~*^4::
~*^5::
~*^6::
~*^7::
~*^8::
~*^9::
~*^0::
~*^Space::
~*^Backspace::
~*^Delete::
~*^Insert::
~*^Home::
~*^End::
~*^PgUp::
~*^PgDn::
~*^Tab::
~*^Return::
~*^,::
~*^.::
~*^/::
~*^;::
~*^'::
~*^[::
~*^]::
~*^\::
~*^-::
~*^=::
~*^`::
~*^F1::
~*^F2::
~*^F3::
~*^F4::
~*^F5::
~*^F6::
~*^F7::
~*^F8::
~*^F9::
~*^F10::
~*^F11::
~*^F12::
g_AbortSendEsc := true
return