拾遗笔记

AutoHotKey对Eclipse 进行增强

正常情况下,Eclipse下可以对按键进行绑定,但是有些时候,也会出现eclipse无能为
力的时候,比如,在eclipse中,对所有打开的文件进行“上一个”、“下一个”这种
操作进行键绑定。并不是eclipse未提供这两个功能,而是他们将它进行了硬编码,这
两个功能默认绑定在Ctrl+pageUp ,Ctrl+PageDown 上。而按照Emacs使用键盘进行高
效快捷操作的理念:“双手始终不离键盘,且不使用距离键盘中心区域过远的按键”,这
个PageUp ,PageDown 实在不应该使用。所以重新对它做映射。映射为Ctrl+Alt+n,
与Ctrl+Alt+p ,这两个键。
另外一个功能就是Alt+n ,Alt+p ,光标分别向下、向上移动4行,这样可以实现光标的
中小范围的跳跃。我在Eclipse中使用了一个插件EmacsPlus,,虽然Eclipse 也默认提
供了Emacs的按键绑定,但毕竟功能有限,而EmacsPlus 插件可以将Eclipse模拟的更
像Emacs. 下面是以上功能的代码。

SetKeyDelay 0
;;Eclipse 中Ctrl+PageUP Ctrl+pagedown在打开的编辑器中切换
;;但是它硬编辑到代码中了,没法进行配置,这里将Ctrl+alt+n 按下时等效于Ctrl+pageDown
#IfWinActive ahk_class SWT_Window0
^!n::Send ^{PgDn}
^!p::Send ^{PgUp}
;;而此处Alt+n 相当于按下5次{Down
;;     Alt+p 相当于按下5次Up
!n::Send {Down 4} 
!p::Send {Up 4}
#IfWinActive

另外一个功能增强是,Eclipse默认的绑定为Ctrl+Shift+r的Open Resource,它会打开
一个窗口,然后你可以输入正则表达式去匹配项目中的文件,然后打开相应的文件,这
种方式比你一层层地打开目录找到相应的文件要快许多,尤其在项目比较大的时候。
这个功能虽然已经很强大了,但与Emacs中的Anything插件寻找文件的功能还是差了两
点:

那如何用AutoHotkey 来解决以上问题呢。

  1. 最根本的办法当然是修改Eclipse的源代码了,但是我找了半天也没定位出这块功能
    的源代码在什么文件里,后来就懒得找了,用Autohotkey简单的做一下处理,虽然
    还是有点小缺陷,但已经好许多了。我做的处理就是,当按下空格的时候它会输入
    星号。使用体验和用空格分隔关键字是相同的,缺点就是关键字的顺序必须按照文
    件名中出现的顺序来。代码是:
    space::Send *
    
  2. 第2个问题的解决方法是:
    首先对Ctrl+n Ctrl+p 分别映射为Down, Up 键。
    ^p::send {Up}
    ^n::send {Down}
    

    当我按下字母数字的时候,首先把焦点定位到文本框,然后才输入相应的字母,因
    为需要对每个字母进行映射,所以代码会很长,但是逻辑很简单,比如以对字母
    a的映射为例:

    a::
    ControlFocus ,Edit1
    SendInput a
    return
    

    代码很简单就是当你按下字母a的时候,首先将焦点定位到Edit1即文本框,然后才
    输入字母a ,然后就return结束了。
    将上面所有的代码放到

    #IfWinActive Open Resource
     这里放以上代码
    #IfWinActive
    

    表示以上的代码只是窗口标题为Open Resource的窗口中有效。下面附上上面提到的
    所有代码

    ; #NoTrayIcon
    ; #SingleInstance force   
    SetKeyDelay 0
    ;;Eclipse 中Ctrl+PageUP Ctrl+pagedown在打开的编辑器中切换
    ;;但是它硬编辑到代码中了,没法进行配置,这里将Ctrl+alt+n 按下时等效于Ctrl+pageDown
    #IfWinActive ahk_class SWT_Window0
    ^!n::Send ^{PgDn}
    ^!p::Send ^{PgUp}
    ;;而此处Alt+n 相当于按下5次{Down
    ;;     Alt+p 相当于按下5次Up
    !n::SendInput {Down 4} 
    !p::SendInput {Up 4}
    #IfWinActive 
    
    ;;对于Ctrl+Shift+r ,open resource
    ;;按下空格相当于按下*
    ;;而输入a-z任何一个字符,先将焦点移到Edit上,然后再输入相应的字符
    #IfWinActive Open Resource
    ^p::send {Up}
    ^n::send {Down}
    space::SendInput *
    a::
    ControlFocus ,Edit1
    SendInput a
    return
    b::
    ControlFocus ,Edit1
    SendInput b
    return
    c::
    ControlFocus ,Edit1
    SendInput c
    return
    d::
    ControlFocus ,Edit1
    SendInput d
    return
    e::
    ControlFocus ,Edit1
    SendInput e
    return
    f::
    ControlFocus ,Edit1
    SendInput f
    return
    g::
    ControlFocus ,Edit1
    SendInput g
    return
    h::
    ControlFocus ,Edit1
    SendInput h
    return
    i::
    ControlFocus ,Edit1
    SendInput i
    return
    j::
    ControlFocus ,Edit1
    SendInput j
    return
    k::
    ControlFocus ,Edit1
    SendInput k
    return
    l::
    ControlFocus ,Edit1
    SendInput l
    return
    m::
    ControlFocus ,Edit1
    SendInput m
    return
    n::
    ControlFocus ,Edit1
    SendInput n
    return
    o::
    ControlFocus ,Edit1
    SendInput o
    return
    p::
    ControlFocus ,Edit1
    SendInput p
    return
    q::
    ControlFocus ,Edit1
    SendInput q
    return
    r::
    ControlFocus ,Edit1
    SendInput r
    return
    s::
    ControlFocus ,Edit1
    SendInput s
    return
    t::
    ControlFocus ,Edit1
    SendInput t
    return
    u::
    ControlFocus ,Edit1
    SendInput u
    return
    v::
    ControlFocus ,Edit1
    SendInput v
    return
    w::
    ControlFocus ,Edit1
    SendInput w
    return
    x::
    ControlFocus ,Edit1
    SendInput x
    return
    y::
    ControlFocus ,Edit1
    SendInput y
    return
    z::
    ControlFocus ,Edit1
    SendInput z
    return
    1::
    ControlFocus ,Edit1
    SendInput 1
    return
    2::
    ControlFocus ,Edit1
    SendInput 2
    return
    3::
    ControlFocus ,Edit1
    SendInput 3
    return
    4::
    ControlFocus ,Edit1
    SendInput 4
    return
    5::
    ControlFocus ,Edit1
    SendInput 5
    return
    6::
    ControlFocus ,Edit1
    SendInput 6
    return
    7::
    ControlFocus ,Edit1
    SendInput 7
    return
    8::
    ControlFocus ,Edit1
    SendInput 8
    return
    9::
    ControlFocus ,Edit1
    SendInput 9
    return
    .::
    ControlFocus ,Edit1
    SendInput .
    return
    #IfWinActive
    

Comments

comments powered by Disqus