;-*- coding: utf-8 -*- ;; Ergohotkey ;; A AutopairHotkey script for system-wide ErgoEmacs keybinding ;; ;; Copyright © 2009 Milan Santosi ;; Copyright © 2012 Benjamin Hansen ;; Copyright © 2013, 2014 Matthew Fidler ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see http://www.gnu.org/licenses/ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Global ergonomic editing command shortcuts for ;; use with autohotkey http://www.autohotkey.com/ ;; hotkey layout taken from http://xahlee.org/emacs/ergonomic_emacs_keybinding.html ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Changelog: ;; Changlog moved to github. ;; Version 0.9: ;; - Added beginning and end of buffer commands. ;; Version 0.8: ;; - Added BigCtl, key translation and SetMark ;; Version 0.7: ;; - Added Caps lock to Menu in emacs. ;; Version 0.6: ;; - Unified Script, fixed kill-line-backwards ;; Version 0.5: ;; - Made this generated inside of ergoemacs. Malfunctioning kill-line-backwards re-included. ;; Version 0.4: ;; - Fixed a missing colon, that prevents Alt+i to work. Xah Lee ;; Version 0.3: ;; - added a #SingleInstance directive. Xah Lee ;; Version 0.2: ;; - 'Fixed' malfunctioning kill-line-backwards by remapping it to ;; something without a shift modifier. Not very happy about it. ;; - Replaced Send with SendInput ;; - Replaced occurences of DEL with C-x to 'kill' to the clipboard ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #SingleInstance force #MaxHotkeysPerInterval 9999 #NoEnv #InstallKeybdHook SendMode Input Process, priority, , High IniRead ToggleCtrl, ergoemacs-settings.ini,BigCtl, App IniRead CurrCaps, ergoemacs-settings.ini, Caps, App IniRead CurrRAlt, ergoemacs-settings.ini, RAlt, App IniRead CurrLAlt, ergoemacs-settings.ini, LAlt, App IniRead CurrRAltLAlt, ergoemacs-settings.ini, RAltLAlt, App IniRead OutlookSave, ergoemacs-settings.ini, Outlook, Save IniRead EmacsClient, ergoemacs-settings.ini, Emacs, EmacsClient IniRead OutlookTemplate, ergoemacs-settings.ini, Outlook, Template LayLst= VarLst= CareL = 0 CareV = 0 CareLV = 0 g_MarkSet= g_LastBol= g_LastEol= g_LastBobp= modifiers= skipUpDown= IniRead CurrLayout, ergoemacs-settings.ini, Curr, Layout If (CurrLayout == "ERROR"){ CurrLayout=us } IniRead CurrTheme, ergoemacs-settings.ini, Curr, Theme If (CurrTheme == "ERROR"){ CurrTheme=standard } IniRead CurrTrans, ergoemacs-settings.ini, Curr, Trans If (CurrTrans == "ERROR"){ CurrTrans=No Translation } IniRead CurrTrans2, ergoemacs-settings.ini, Curr, Trans2 If (CurrTrans2 == "ERROR"){ CurrTrans2=No Translation } IniRead ExternalClass, ergoemacs.ini,Class,External If (ExternalClass == "Error"){ ExternalClass=TscShellContainerClass } StringSplit, ExternalClassArray, ExternalClass, * ;; Add Translation Loop, 120 { ; CurLayout -> TransKey IniRead CurrKey, ergoemacs.ini, %CurrLayout%, %A_Index% If (CurrTrans == "No Translation"){ objTrans%CurrKey% := CurrKey } else { If (CurrKey != ""){ IniRead TransKey, ergoemacs.ini, %CurrTrans%, %A_Index% objTrans%CurrKey% := TransKey } } ; HostLayout -> CurLayout IniRead CurrKey, ergoemacs.ini, %CurrTrans2%, %A_Index% If (CurrTrans2 == "No Translation"){ objTrans_%CurrKey% := CurrKey } else { If (CurrKey != ""){ IniRead TransKey, ergoemacs.ini, %CurrLayout%, %A_Index% objTrans_%CurrKey% := TransKey } } } CurrLayVar= % "[" . CurrLayout . "-" . CurrTheme . "]" Loop, Read, ergoemacs.ini { If (A_LoopReadLine == "[Layouts]"){ CareL = 1 CareV = 0 } Else If (A_LoopReadLine == "[Themes]"){ CareV = 1 CareL = 0 } Else If (CareL == 1 || CareV == 1){ tmp = %A_LoopReadLine% NextSec := InStr(tmp,"[") If (NextSec == 1){ CareL = 0 CareV = 0 } else { NextSec := InStr(tmp,"=") If (NextSec != 0){ NextSec := SubStr(tmp,1,NextSec-1) If (CareL == 1){ LayLst = %LayLst%%NextSec%`n } else { VarLst = %VarLst%%NextSec%`n } } } } Else If (A_LoopReadLine == CurrLayVar){ CareLV = 1 } Else If (CareLV == 1){ tmp = %A_LoopReadLine% NextSec := InStr(tmp,"[") If (NextSec == 1){ CareLV = 0 } else { NextSec := InStr(tmp,"=") If (NextSec != 0){ fn := SubStr(tmp,1,NextSec - 1) NextSec := SubStr(tmp,NextSec + 1) objTrans%NextSec% := fn objTrans_%NextSec% := fn ;;HotKey, %NextSec%, %fn% } } } } ;; HotKey,(,autopair-paren ; Create Menu Loop, parse, LayLst, `n { Menu, TranslateKey, add, No Translation, TranslateKeyHandler Menu, TranslateKey2, add, No Translation, TranslateKey2Handler If (CurrTrans == "No Translation"){ Menu, TranslateKey, Check,No Translation } else { Menu, TranslateKey, UnCheck,No Translation } If (CurrTrans2 == "No Translation"){ Menu, TranslateKey2, Check,No Translation } else { Menu, TranslateKey2, UnCheck,No Translation } If (A_LoopField != ""){ Menu, MenuKey, add, %A_LoopField%, MenuKeyHandler Menu, TranslateKey, add, %A_LoopField%, TranslateKeyHandler Menu, TranslateKey2, add, %A_LoopField%, TranslateKey2Handler If (A_LoopField == CurrLayout){ Menu, MenuKey, Check, %A_LoopField% } else { Menu, MenuKey, UnCheck, %A_LoopField% } If (A_LoopField == CurrTrans){ Menu, TranslateKey, Check, %A_LoopField% } else { Menu, TranslateKey, UnCheck, %A_LoopField% } If (A_LoopField == CurrTrans2){ Menu, TranslateKey2, Check, %A_LoopField% } else { Menu, TranslateKey2, UnCheck, %A_LoopField% } } } Loop, parse, VarLst, `n { If (A_LoopField != ""){ Menu, ThemeKey, add, %A_LoopField%, ThemeKeyHandler If (A_LoopField == CurrTheme){ Menu, ThemeKey, Check, %A_LoopField% } else { Menu, ThemeKey, UnCheck, %A_LoopField% } } } Menu, Tray, DeleteAll Menu, Tray, NoStandard Menu, tray, add, Keyboard Layouts, :MenuKey Menu, tray, add, Translated Layout, :TranslateKey Menu, tray, add, Translated Layout (External), :TranslateKey2 Menu, tray, add, Themes, :ThemeKey Menu, Tray, add Menu, Caps, add, Caps Lock, ToggleCaps Menu, Caps, add, Control, ToggleCaps Menu, Caps, add, Apps Key, ToggleCaps Menu, Caps, add, F6, ToggleCaps If (CurrCaps == "Control"){ Menu, Caps, Check, Control Hotkey, CapsLock, send-ctl Hotkey, CapsLock Up, send-ctl-up ;Hotkey Up, previous-line ;Capslock::Ctrl ;+Capslock::Capslock } Else If (CurrCaps == "Apps Key"){ Menu, Caps, Check, Apps Key Hotkey, CapsLock, send-apps ;Capslock::AppsKey ;+Capslock::Capslock } Else if (CurrCaps == "F6"){ Menu, Caps, Check, F6 Hotkey CapsLock, send-f6 ;Capslock::F6 ;+Capslock::Capslock } Else { Menu, Caps, Check, Caps Lock } Menu, Tray, add, Caps Lock To, :Caps Menu, RAlt, add, Alt, ToggleRAlt Menu, RAlt, add, Control, ToggleRAlt Menu, RAlt, add, Apps Key, ToggleRAlt Menu, RAlt, add, F6, ToggleRAlt If (CurrRAlt == "Control"){ Menu, RAlt, Check, Control Hotkey, RAlt, send-ctl Hotkey, RAlt Up, send-ctl-up } Else If (CurrRAlt == "Apps Key"){ Menu, RAlt, Check, Apps Key Hotkey, RAlt, send-apps } Else if (CurrRAlt == "F6"){ Menu, RAlt, Check, F6 Hotkey RAlt, send-f6 } Else { Menu, RAlt, Check, Alt } Menu, Tray, add, Right Alt to, :RAlt ; Left Alt Menu, LAlt, add, Alt, ToggleLAlt Menu, LAlt, add, Control, ToggleLAlt Menu, LAlt, add, Apps Key, ToggleLAlt Menu, LAlt, add, F6, ToggleLAlt If (CurrLAlt == "Control"){ Menu, LAlt, Check, Control Hotkey, LAlt, send-ctl Hotkey, LAlt Up, send-ctl-up } Else If (CurrLAlt == "Apps Key"){ Menu, LAlt, Check, Apps Key Hotkey, LAlt, send-apps } Else if (CurrLAlt == "F6"){ Menu, LAlt, Check, F6 Hotkey LAlt, send-f6 } Else { Menu, LAlt, Check, Alt } Menu, Tray, add, Left Alt to, :LAlt Menu, RAltLAlt, add, Alt, ToggleRLA Menu, RAltLAlt, add, Apps Key, ToggleRLA Menu, RAltLAlt, add, F6, ToggleRLA If (CurrRAltLAlt == "Apps Key"){ Menu, RAltLAlt, Check, Apps Key Hotkey, RAlt & LAlt, send-apps } Else if (CurrRAltLAlt == "F6"){ Menu, RAltLAlt, Check, F6 Hotkey RAlt & LAlt, send-f6 } Else { Menu, RAltLAlt, Check, Alt } Menu, Tray, add, Left & Right Alt to, :RAltLAlt Menu, Tray, add, Space->Control, ToggleCtrl If (ToggleCtrl == "1"){ Menu, Tray, Check, Space->Control } Menu, tray, add, Exit, Exit ; The amount of milliseconds of holding the spacebar after which a ; space key is no longer returned. g_TimeOut := 300 ; The amount of milliseconds to delay returning a Ctrl key sequence ; that are potentially accidentally hit with the space bar. If the ; space bar comes up during this delay the regular keys will be ; returned instead. Probably rounds to the nearest 10 milliseconds by ; the OS. g_Delay := 70 g_SpacePressDownTime := false g_OtherKeyPressed := false g_MovementKeyPressed := false g_SkipNextSpace := false Hotkey Up, previous-line Hotkey Down, next-line Hotkey Left, backward-char Hotkey Right, forward-char Hotkey Home, move-beginning-of-line Hotkey End, move-end-of-line Hotkey PgUp, scroll-down Hotkey PgDn, scroll-up Hotkey ^Left, backward-word Hotkey ^Right, forward-word allKeysStr := "LButton*RButton*MButton*WheelDown*WheelUp*WheelLeft*WheelRight*XButton1*XButton2*Tab*Enter*Escape*Backspace*Delete*Insert*ScrollLock*CapsLock*NumLock*Numpad0*Numpad1*Numpad2*Numpad3*Numpad4*Numpad5*Numpad6*Numpad7*Numpad8*Numpad9*NumpadDot*NumpadDiv*NumpadMult*NumpadAdd*NumpadSub*NumpadEnter*F1*F2*F3*F4*F5*F6*F7*F8*F9*F10*F11*F12*F13*F14*F15*F16*F17*F18*F19*F20*F21*F22*F23*F24*AppsKey*Browser_Back*Browser_Forward*Browser_Refresh*Browser_Stop*Browser_Search*Browser_Favorites*Browser_Home*Volume_Mute*Volume_Down*Volume_Up*Media_Next*Media_Prev*Media_Stop*Media_Play_Pause*Launch_Mail*Launch_Media*Launch_App1*Launch_App2*Help*Sleep*PrintScreen*CtrlBreak*Pause*Break" StringSplit, allKeysArray, allKeysStr, * Loop %allKeysArray0% { key := allKeysArray%A_Index% Hotkey, % "~*"key, ListenForKey } ; Keys that are possible to accidentally press with the space key ; while typing fast. keysToDelayStr := "1*2*3*4*5*6*7*8*9*0*q*w*e*r*t*y*u*i*o*p*[*]*\*a*s*d*f*g*h*j*k*l*;*'*z*x*c*v*b*n*m*,*.*/" StringSplit, keysToDelayArray, keysToDelayStr, * Loop %keysToDelayArray0% { key := keysToDelayArray%A_Index% Hotkey, % "*"key, DelayKeyOutput } ListenForKey: g_MarkSet= g_OtherKeyPressed := true Return DelayKeyOutput: Critical isExternal := IsExternalProgram() origKey := SubStr(A_ThisHotkey,0) ;; Get Modifiers modifiers := GetModifiers() modifiers2 := GetModifiers2() if (modifiers2 < 9){ timesf := 10 } else { timesf := 100 } pressedKey := origKey ;; Translate to the correct layout transKey := Asc(pressedKey) if (isExternal == 1){ transKey := Chr(objTrans_%transKey%) } else { transKey := Chr(objTrans%transKey%) } if (transKey != ""){ pressedKey := transKey } ;; get goto subroutine. transKey := Asc(origKey)*timesf+modifiers2 if (isExternal == 1){ transKey := objTrans_%transKey% } else { transKey := objTrans%transKey% } ; Only wait to see if the space comes up if 1) the space bar key is ; down in the first place and 2) it has been held down for less than ; the timeout and 3) another Ctrl key combo hasn't already been ; pressed. if((g_SpacePressDownTime != false) && (GetSpaceBarHoldTime() < g_TimeOut) && !g_OtherKeyPressed) { ; Do the sleeping of timeout in small increments, that way if the ; the space key is released in the middle we can quit early. wait_start_time := A_TickCount while A_TickCount - wait_start_time + 10 < g_Delay { Sleep, 10 if(!getKeyState("Space", "P")) { ; Since space bar was released, remove the Ctrl modifier. StringReplace, modifiers, modifiers, ^, ; Force space to fire, because its being released could not ; fire during this routine because this thread is critical. Gosub *Space up ; Stop the space in the event queue from firing since we ; have already fired it manually. g_SkipNextSpace := True Break } } } if (IsLabel(transKey) & !WinActive("ahk_class Emacs") & !IsExternalProgram()){ Goto %transKey% } Else { SendInput % modifiers pressedKey g_MarkSet= g_LastBol= g_LastEol= g_LastBobp= } g_OtherKeyPressed := true Return *Space:: Critical ; Don't update on OS simulated repeats but only when the user ; actually pressed the key down for the first time if(g_SpacePressDownTime == false) { g_SpacePressDownTime := A_TickCount g_OtherKeyPressed := false } if (ToggleCtrl == "1"){ SendInput {RCtrl down} } Return *Space up:: Critical if(g_SkipNextSpace) { g_SkipNextSpace := false } if (ToggleCtrl == "1"){ SendInput {RCtrl up} } if(g_OtherKeyPressed == true) { g_SpacePressDownTime := false Return } if (GetSpaceBarHoldTime() <= g_TimeOut) { modifiers := GetModifiers() if (WinActive("ahk_class Emacs") | IsExternalProgram()) { SendInput % modifiers "{Space}" } else { If (modifiers == "!"){ If (g_MarkSet == ""){ g_MarkSet=1 } Else { g_MarkSet= g_LastBol= g_LastEol= g_LastBobp= } } else { SendInput % modifiers "{Space}" } } } g_SpacePressDownTime := false Return ToggleCtrl: If (ToggleCtrl == "1"){ IniWrite,0,ergoemacs-settings.ini,BigCtl,App } Else { IniWrite,1,ergoemacs-settings.ini,BigCtl,App } Reload return ToggleRAlt: IniWrite, %A_ThisMenuItem%,ergoemacs-settings.ini,RAlt,App Reload return ToggleLAlt: IniWrite, %A_ThisMenuItem%,ergoemacs-settings.ini,LAlt,App Reload return ToggleRLA: IniWrite, %A_ThisMenuItem%,ergoemacs-settings.ini,RAltLAlt,App Reload return ToggleCaps: IniWrite, %A_ThisMenuItem%,ergoemacs-settings.ini,Caps,App Reload return ThemeKeyHandler: IniWrite,%A_ThisMenuItem%,ergoemacs-settings.ini,Curr,Theme Reload return TranslateKeyHandler: IniWrite, %A_ThisMenuItem%,ergoemacs-settings.ini,Curr,Trans Reload return TranslateKey2Handler: IniWrite, %A_ThisMenuItem%,ergoemacs-settings.ini,Curr,Trans2 Reload return MenuKeyHandler: IniWrite,%A_ThisMenuItem%,ergoemacs-settings.ini,Curr,Layout Reload return Exit: ExitApp return previous-line: SendKey("{Up}",1) return next-line: SendKey("{Down}",1) return backward-char: SendKey("{Left}",1) return forward-char: SendKey("{Right}",1) return backward-word: SendKey("{Ctrl down}{Left}{Ctrl up}",1) return forward-word: SendKey("{Ctrl down}{Right}{Ctrl up}",1) return move-beginning-of-line: SendKey("{Home}",1) return ergoemacs-end-of-line-or-what: if (g_LastEol <> ""){ ;; Last Key was end of line ;; Send PgDown... SendKey("{PgDown}",1) } else { ;; Last key was not bol send home SendKey("{End}",1) } g_LastEol=eol return ergoemacs-beginning-of-line-or-what: if (g_LastBol <> ""){ ;; Last Key was beginning of line ;; Send PgUp... SendKey("{PgUp}",1) } else { ;; Last key was not bol send home SendKey("{Home}",1) } g_LastBol=bol return ergoemacs-end-of-line-or-block: move-end-of-line: SendKey("{End}",1) return beginning-of-buffer: SendKey("{Ctrl down}{Home}{Ctrl up}",1) return end-of-buffer: SendKey("{Ctrl down}{End}{Ctrl up}",1) return delete-backward-char: SendKey("{Backspace}",0) return delete-char: SendKey("{Delete}",0) return scroll-down: SendKey("{PgUp}",1) return scroll-up: SendKey("{PgDn}",1) return isearch-forward: SendKey("{Ctrl down}{f}{Ctrl Up}",0) return query-replace: SendKey("{Ctrl down}{h}{Ctrl Up}",0) return backward-kill-word: SendKey("{Shift down}{Ctrl down}{Left}{Ctrl up}{Shift up}{Ctrl down}{x}{Ctrl up}",0) return kill-word: SendKey("{Ctrl down}{Shift down}{Right}{Ctrl up}{Shift up}{Ctrl down}{x}{Ctrl up}",0) return kill-line: SendKey("{Shift down}{End}{Shift up}{Ctrl down}{x}{Ctrl up}",0) return ergoemacs-kill-line-backward: SendKey("{Shift down}{Home}{Shift up}{Ctrl down}{x}{Ctrl up}",0) return ergoemacs-beginning-or-end-of-buffer: if (g_LastBobp <> ""){ ;; Last Key was not beginning of buffer SendKey("{Ctrl down}{Home}{Ctrl up}",1) g_LastBobp=yes } else { ;; Last Key was end of buffer SendKey("{End}",1) g_LastBobp= } return ergoemacs-cut-line-or-region: lastClip = %clipboard% SendKey("{Ctrl down}{x}{Ctrl up}",0) thisClip = %clipboard% if (thisClip == lastClip){ SendKey("{Home}{Shift down}{End}{Shift up}{Ctrl down}{x}{Ctrl up}",0) clipboard = %lastClip%%clipboard% } return ergoemacs-copy-line-or-region: lastClip = %clipboard% SendKey("{Ctrl down}{c}{Ctrl up}",0) thisClip = %clipboard% if (thisClip == lastClip){ SendKey("{Home}{Shift down}{End}{Shift up}{Ctrl down}{c}{Ctrl up}",0) } return ergoemacs-paste: yank: SendKey("{Ctrl down}{v}{Ctrl up}",0) return undo: SendKey("{Ctrl down}{z}{Ctrl up}",0) return redo: SendKey("{Ctrl down}{y}{Ctrl up}",0) return execute-extended-command: ;; Send to org-outlook if using outlook If (!WinActive("ahk_class Emacs") & !IsExternalProgram()){ If WinActive("ahk_class rctrl_renwnd32"){ If !FileExist(OutlookSave){ FileSelectFolder, OutlookSave, ,3, Select Folder to Save Outlook Emails IniWrite, %OutlookSave%, ergoemacs-settings.ini, Outlook, Save } If !FileExist(EmacsClient){ FileSelectFile, EmacsClient, 1, , Emacs Client, Emacs Client (emacs*.exe) IniWrite, %EmacsClient%, ergoemacs-settings.ini, Emacs, EmacsClient } If (OutlookTemplate == "ERROR") { InputBox OutlookTemplate, Org-mode capture template for emails (can't be blank) IniWrite, %OutlookTemplate%, ergoemacs-settings.ini, Outlook, Template } Clipboard= SendKey("{Ctrl down}{c}{Ctrl up}") ClipWait EmailBody=%clipboard% EmailBody:=uri_encode(EmailBody) SendKey("{F12}",0) Clipboard= While !WinActive("Save As"){ Sleep 100 } SendKey("{Ctrl down}{c}{Ctrl up}") ClipWait Counter = 1 Title=%clipboard% Title := uri_encode(Title) fileName = %OutlookSave%\%clipboard%-%Counter%.msg while FileExist(fileName) { Counter := Counter + 1 fileName = %OutlookSave%\%clipboard%-%Counter%.msg } Clipboard = Clipboard := fileName ClipWait While !WinActive("Save As"){ Sleep 100 } SendKey("{Backspace}") SendInput, %Clipboard% SendKey("{Enter}") While WinActive("Save As"){ Sleep 100 } SendKey("{Del}") ocalName = %OutlookSave%\ocal.ics If !FileExist(ocalName){ Clipboard = Clipboard := ocalName ClipWait Send, {CTRLDOWN}2{CTRLUP} Send, {ALTDOWN}{ALTUP}fc While !WinActive("Save As"){ Sleep 100 } Send, {CTRLDOWN}v{CTRLUP}{TAB 2}{SPACE}{DOWN 3}{TAB}{DOWN 2}{TAB}{SPACE}{DOWN}{SPACE}{TAB 2}{SPACE}{TAB 3}{ENTER} While WinActive("Save As"){ Sleep 100 } Send, {CTRLDOWN}1{CTRLUP} } fileName := uri_encode(fileName) fileName = "%EmacsClient%" org-protocol:/capture:/%OutlookTemplate%/%fileName%/%Title%/%EmailBody% Run, %fileName% } } return comment-dwim: ;; Word Alt+Ctrl+M is insert comment If WinActive("ahk_class OpusApp"){ SendKey("{Alt down}{Ctrl down}{M}{Alt up}{Ctrl up}",0) } return ergoemacs-toggle-letter-case: ;; Word Shift+F3 is toggle letter case. ;; Maybe do somthing different in other apps. If WinActive("ahk_class OpusApp"){ SendKey("{Shift down}{F3}{Shift up}",0) } return split-window-below: ;; Word is Alt+Ctrl+s If WinActive("ahk_class OpusApp"){ SendKey("{Alt down}{Ctrl down}{s}{Ctrl up}{Alt up}{Enter}",0) } return delete-other-windows: ;; Word is If WinActive("ahk_class OpusApp"){ SendKey("{Alt down}{Ctrl down}{s}{Alt up}{Ctrl up}",0) } return ergoemacs-move-cursor-next-pane: ;; Word is If WinActive("ahk_class OpusApp"){ SendKey("{F6}") } return send-ctl: SendKey("{Ctrl down}") return send-ctl-up: SendKey("{Ctrl up}") return send-apps: SendKey("{AppsKey}") return send-f6: SendKey("{F6}") return IsExternalProgram(){ External = 0 if (WinActive("ahk_class TscShellContainerClass")){ External = 1 } else if (WinActive("ahk_class cygwin/x X rl")){ External = 1 } else if (WinActive("ahk_class cygwin/xfree86 rl")){ External = 1 } else if (WinActive("ahk_class Transparent Windows Client")){ External = 1 } Return External } GetSpaceBarHoldTime() { global g_SpacePressDownTime time_elapsed := A_TickCount - g_SpacePressDownTime Return time_elapsed } GetModifiers2(){ ;; Return the hotkey modifiers that are defined in the ergoemacs.ini Modifiers = 0 GetKeyState, state1, LWin GetKeyState, state2, RWin state = %state1%%state2% if state <> UU ; At least one Windows key is down. Modifiers := Modifiers + 1 GetKeyState, state1, Alt if state1 = D Modifiers := Modifiers + 2 GetKeyState, state1, Control if state1 = D Modifiers := Modifiers + 4 ;;GetKeyState, state1, Alt GetKeyState, state1, LShift GetKeyState, state2, RShift state=%state1%%state2% if state <> UU Modifiers := Modifiers + 8 Return Modifiers } ; Return the hotkey symbols (ie !, #, ^ and +) for the modifiers that ; are currently activated GetModifiers() { Modifiers = GetKeyState, state1, LWin GetKeyState, state2, RWin state = %state1%%state2% if state <> UU ; At least one Windows key is down. Modifiers = %Modifiers%# GetKeyState, state1, Alt if state1 = D Modifiers = %Modifiers%! GetKeyState, state1, Control if state1 = D Modifiers = %Modifiers%^ ;;GetKeyState, state1, Alt GetKeyState, state1, LShift GetKeyState, state2, RShift state = %state1%%state2% if state <> UU ; At least one shift key is down Modifiers = %Modifiers%+ Return Modifiers } SendKey(key,Movement = 0){ global g_MarkSet global g_OtherKeyPressed global g_LastBol global g_LastEol g_LastEol= g_LastBol= g_OtherKeyPressed := true If (Movement == 0){ g_MarkSet= SendInput % key } Else { If (g_MarkSet == ""){ SendInput % key } Else { SendInput % "{Shift down}" key "{Shift up}" } } } ;functions starts uri_encode(Unicode_string) { ;converts unicode_string to uri enocoded string for autohotkey_l unicode version ;http://www.autohotkey.com/forum/viewtopic.php?t=71619 UTF16 := Unicode_string n := StrPutVar(UTF16, UTF8, "UTF-8") raw_hex := MCode_Bin2Hex(&UTF8, n-1) i := strlen(raw_hex)/2 loop, %i% { frag := "%" . substr(raw_hex, a_index*2-1,2) r_s .= frag } return r_s } MCode_Bin2Hex(addr, len) { Static fun If (fun = "") { If Not A_IsUnicode h= ( LTrim Join 8B54240C85D2568B7424087E3A53578B7C24148A07478AC8C0E90480F9090F97C3F6 DB80E30702D980C330240F881E463C090F97C1F6D980E10702C880C130880E464A75 CE5F5BC606005EC3 ) Else h= ( LTrim Join 8B44240C8B4C240485C07E53568B74240C578BF88A168AC2C0E804463C090FB6C076 066683C037EB046683C03066890180E20F83C10280FA09760C0FB6D26683C2376689 11EB0A0FB6C26683C03066890183C1024F75BD33D25F6689115EC333C0668901C3 ) VarSetCapacity(fun, n := StrLen(h)//2) Loop % n NumPut("0x" . SubStr(h, 2 * A_Index - 1, 2), fun, A_Index - 1, "Char") } VarSetCapacity(hex, A_IsUnicode ? 4 * len + 2 : 2 * len + 1) DllCall(&fun, "uint", &hex, "uint", addr, "uint", len, "cdecl") VarSetCapacity(hex, -1) ;update StrLen Return hex } StrPutVar(string, ByRef var, encoding) { VarSetCapacity( var, StrPut(string, encoding) * ((encoding="utf-16"||encoding="cp1200") ? 2 : 1) ) return StrPut(string, &var, encoding) }