Skip to content

Instantly share code, notes, and snippets.

@amacgregor
Created December 30, 2013 13:35
Show Gist options
  • Save amacgregor/8182164 to your computer and use it in GitHub Desktop.
Save amacgregor/8182164 to your computer and use it in GitHub Desktop.
; ahk-vim-navigation.ahk
; Written by Jongbin Jung
;
; Incorporated some script from Model_Vim.ahk
; Written by Rich Alesi
; and Modified for AHK_L by Andrej Mitrovic
; (http://www.autohotkey.com/board/topic/41206-modal-vim/)
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
; Global variables
inputNumber := " "
; Notification GUI
notify(text, time = 2000)
{
#IfWinExist VIM-Mode commands
resetGUI()
#IfWinExist
; Set the flags for OSD
Gui, 90:+AlwaysOnTop -Caption +ToolWindow +Disabled -SysMenu +Owner
; Add and set the OSD Text
Gui, 90:Font, s10 bold
Gui, 90:Add, Text, cAA0000, %text%
; OSD Background Color (Black)
Gui, 90:Color, 000000
Gui, 90:Show,NoActivate xCenter yCenter, VIM-Mode commands
Sleep, %time%
Gui, 90:Destroy
return
}
; HotKey to Initiate VI-mode with Double-tap of Alt
Shift::
If (A_PriorHotKey = "Shift" AND A_TimeSincePriorHotKey < 500)
{
; Set the flags for OSD
Gui, 99:+AlwaysOnTop -Caption +ToolWindow +Disabled -SysMenu +Owner
; Add and set the OSD Text
Gui, 99:Font, s12 bold
Gui, 99:Add, Text, cAA0000, VIM-Mode Activated (Esc to Exit Vim-Mode)
; OSD Background Color (Black).
Gui, 99:Color, 000000
Gui, 99:Show,NoActivate xCenter y10, VIM-Mode Activated
}
Send, {ShiftUp}
Return
#IfWinExist VIM-Mode Activated
; ESC ends VIM-mode
ESC::
{
if (inputNumber != " ")
{
resetInputNumber()
return
}
else
{
endVIM()
return
}
}
; i(nput) end VIM-mode
i::
{
endVIM()
return
}
; Other input modes ...
+i::
{
SendInput {Home}
endVIM()
return
}
a::
{
SendInput {Right}
endVIM()
return
}
+a::
{
SendInput {End}
endVIM()
return
}
; cursor movements
h::
{
SendInput {Left %inputNumber%}
resetInputNumber()
return
}
j::
{
SendInput {Down %inputNumber%}
resetInputNumber()
return
}
k::
{
SendInput {Up %inputNumber%}
resetInputNumber()
return
}
l::
{
SendInput {Right %inputNumber%}
resetInputNumber()
return
}
; page movements
w::
{
SendInput ^{Right %inputNumber%}
resetInputNumber()
return
}
b::
{
SendInput ^{Left %inputNumber%}
resetInputNumber()
return
}
x::
{
SendInput {Delete %inputNumber%}
resetInputNumber()
return
}
0:: ; Add to the inputNumber if inputNumber != null, otherwise HOME
{
if (inputNumber != " ")
{
inputNumber = %inputNumber%0
normalize(0)
notify(inputNumber)
return
}
else
{
SendInput {Home}
resetInputNumber()
return
}
}
-::
{
SendInput {End}
resetInputNumber()
return
}
$::
{
SendInput {End}
resetInputNumber()
return
}
; selection movements with Shift
+h::
{
SendInput +{Left %inputNumber%}
resetInputNumber()
return
}
+j::
{
SendInput +{Down %inputNumber%}
resetInputNumber()
return
}
+k::
{
SendInput +{Up %inputNumber%}
resetInputNumber()
return
}
+l::
{
SendInput +{Right %inputNumber%}
resetInputNumber()
return
}
+w::
{
SendInput +^{Right %inputNumber%}
resetInputNumber()
return
}
+b::
{
SendInput +^{Left %inputNumber%}
resetInputNumber()
return
}
+x::
{
SendInput +{Delete}
resetInputNumber()
return
}
)::
{
SendInput +{Home}
resetInputNumber()
return
}
_::
{
SendInput +{End}
resetInputNumber()
return
}
; Copy (Yank) / Cut (Delete) / Paste (Put)
y::
{
SendInput ^c
resetInputNumber()
return
}
p::
{
SendInput ^v
resetInputNumber()
return
}
d::
{
SendInput ^x
resetInputNumber()
return
}
; HotKey to VIM maps
u::
{
SendInput ^z
resetInputNumber()
return
}
; Catch numbers to repeat commands
$1::
{
inputNumber = %inputNumber%1
normalize(1)
notify(inputNumber)
return
}
$2::
{
inputNumber = %inputNumber%2
normalize(2)
notify(inputNumber)
return
}
$3::
{
inputNumber = %inputNumber%3
normalize(3)
notify(inputNumber)
return
}
$4::
{
inputNumber = %inputNumber%4
normalize(4)
notify(inputNumber)
return
}
$5::
{
inputNumber = %inputNumber%5
normalize(5)
notify(inputNumber)
return
}
$6::
{
inputNumber = %inputNumber%6
normalize(6)
notify(inputNumber)
return
}
$7::
{
inputNumber = %inputNumber%7
normalize(7)
notify(inputNumber)
return
}
$8::
{
inputNumber = %inputNumber%8
normalize(8)
notify(inputNumber)
return
}
$9::
{
inputNumber = %inputNumber%9
normalize(9)
notify(inputNumber)
return
}
#IfWinExist
; cursor movements
!h:: SendInput {Left Down}
!j:: SendInput {Down Down}
!k:: SendInput {Up Down}
!l:: SendInput {Right Down}
; page movements
!w:: SendInput ^{Right}
!b:: SendInput ^{Left}
!x:: SendInput {Delete}
!0:: SendInput {Home}
!-:: SendInput {End}
; selection movements with Shift
+!h:: SendInput +{Left Down}
+!j:: SendInput +{Down Down}
+!k:: SendInput +{Up Down}
+!l:: SendInput +{Right Down}
+!w:: SendInput +^{Right}
+!b:: SendInput +^{Left}
+!x:: SendInput +{Delete}
!):: SendInput +{Home}
!_:: SendInput +{End}
; HotKey to VIM maps
!u:: SendInput ^z
; Validate the inputNumber and make sure that it's less than 500
normalize(resetNumber)
{
global inputNumber
if (inputNumber > 500)
{
inputNumber := resetNumber
}
}
; Reset the inputNumber to " "
resetInputNumber()
{
global
resetGUI()
inputNumber := " "
return
}
resetGUI()
{
Gui, 90:Destroy
return
}
endVIM()
{
Gui, 99:Destroy
resetInputNumber()
return
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment