感谢 Smy20011 的投稿。如果你是第一次接触 AHK 从这里开始看。
gVim 作为文本编辑的利器,为很多人所喜爱。FireFox 有个 vimperator 扩展(或者 It’s All Text! ),可以调用外部编辑器(如 gVim)来编辑文字,修改保存之后,自动还原到 Firefox 的输入框里。但是,它仅可以在浏览器内使用,对于浏览器外的文本框,就无能为力了。@appinn
所以,Smy20011 用了一个小时,做了一个 AHK 脚本供大家使用。运行此脚本之后,对任何文本框,按下 Ctrl + I(想用其他热键请直接修改脚本)就可以调用 gVim 编辑文本。@sfufoet 我加了注释,代码如下
^i::
tmpfile=%A_ScriptDir%\ahk_text_edit_in_vim.txt
; 定义临时文件的路径为当前脚本所在的文件夹
gvim=P:\Vim\vim72\gvim.exe
; 定义 gVim 路径
WinGetTitle, active_title, A
; 获取当前窗口标题,赋值给 active_title
ControlGetFocus, name, %active_title%
; 获取当前窗口光标所在的控件名
if ErroeLevel
{
msgbox, “获取焦点错误”
}
else
{
; 成功获取焦点
ControlGetText, text, %name%, %active_title%
; 获取文字,赋值给 text
FileDelete, %tmpfile%
; 删除临时文件
FileAppend, %text%, %tmpfile%
; 把文字写入临时文件
runwait, %gvim% "%tmpfile%" +
; 运行 vim,直到你保存文件并关闭 vim,下面的代码才会执行
fileread, text, %tmpfile%
; 读取临时文件
ControlSetText, %name%, %text%,%active_title%
; 把读取的文字还原到刚才获取文字的窗口
ControlFocus, %name%, %active_title%
; 并把光标定位到结尾
}
return
Smy20011 写的这个脚本对于 Firefox 之类的程序就无效了。所以我利用剪贴板,写了一个通用的。update: 善用佳软提醒,gVim 官方 wiki 也有一样的方法,代码比这个简洁。
^i::
tmpfile=%A_ScriptDir%\ahk_text_edit_in_vim.txt
gvim=P:\Vim\vim72\gvim.exe
WinGetTitle, active_title, A
clipboard =
; 清空剪贴板
send ^a
; 发送 Ctrl + A 选中全部文字
send ^c
; 发送 Ctrl + C 复制
clipwait
; 等待数据进入剪贴板
FileDelete, %tmpfile%
FileAppend, %clipboard%, %tmpfile%
runwait, %gvim% "%tmpfile%" +
fileread, text, %tmpfile%
clipboard:=text
; 还原读取的数据到剪贴板
winwait %active_title%
; 等待刚才获取文字的窗口激活
send ^v
; 发送 Ctrl + V 粘贴
return
update:asj 稍稍改进了一点:判断文件类型,让 gVim 能自动高亮。
在 WinGetTitle, active_title, A 这句后面增加
;判断文件类型
filetype=%active_title%
IfInString, active_title, SQL 查询分析器
filetype=sql
根据窗口名称改变临时文件后缀名,这样vim修改的时候就可以自动变为相应高亮格式了。后面需要稍作修改:
FileDelete, %tmpfile%.*
tmpfile=%tmpfile%.%filetype%
需要增加新的格式就加一句 IfInString,修改后面窗口名和文件后缀即可。
P.S.1 上次小众发了一个 Vim 键盘图中文版,这里有一个英文分解版的,方便 Vim 新手。善用佳软也有 AHK + gVim 教程 vtano.ahk:GVIM + AHK 实现顶层透明笔记本
P.S.2 最近一直在酝酿新的 AHK 教程,一个关于 GUI 界面的例子——用 Power 键来关闭或重启 Win7,需要以连载的形式出现(2~3 篇),支持的话过来冒个泡吧。


![用 gVim 编辑任意窗口的文字[AHK][图] | 小众软件 用 gVim 编辑任意窗口的文字[AHK][图] | 小众软件](http://img1.appinn.com/2010/03/222249000.png)
(1.1 KB): 

沙发要占了再看!
订阅了你的博客,一直关注你的文章,感谢。
谷歌浏览器怎么办
@晓, 用这个 AHK 脚本啊。
runwait, %gvim% “%tmpfile%”
里面的引号是全角的
@cstr, 我前一段时间刚被读者提醒过此问题。系由wordpress 自动修正所致。sfufoet 可用 html entity 来表示这个引号,就可以避免此问题。
@善用佳软, 我试试看。一直知道这个问题,只知道通过修改 WP 源代码可以解决,忘记还有 html entity 了。
可参考此文:http://vim.wikia.com/wiki/Use_gvim_as_an_external_editor_for_Windows_apps 它最早只给出了vbs的解决方案,后来也扩展到了ahk等方法。
@善用佳软, 官方的方法和我的一样,令我震惊的是,vim 可以直接获得剪贴板文字。。
@sfufoet, 那个是因为他用个paste的插件吧.想要实现官方的扩展,还是需要三个插件的.具体的看wiki
@sfufoet, clipbrd.vim genutils.vim multvals.vim
特意去找了下,就是三个插件
AHK我都快忘了怎么用了,不过AHK有个GUI的创建小程序,像VC一样可以把控件拖进窗口来设计GUI,很方便,然后只要加上你的运行代码就可以了,很简单
@skystar, 我想循序渐进,从一个想法的萌发,讲解到 GUI 部分。
@sfufoet, 恩,不错,不过我喜欢直入主题式的教学
支持P.S.2 建议。。。。
我不想通过剪切板的,所以选第一个。
我在Firefox里用vimperator就可以了。
但是ahk的优先级高,按Ctrl+i就调用AHK了。
如何把Firefox加入排除列表中?
@steve,
在
WinGetTitle, active_title, A
和
ControlGetFocus, name, %active_title%
之间插入下面的代码:
IfInString, active_title, Firefox
{
send ^i
return
}
并把 ^i:: 修改为 $^i::
windows下面vim用不习惯。。
支持 这个相当的实用
当然支持哈
经过无数次试用……
最终还是认为 VIM 不适合自己。
tmpfile=%A_ScriptDir%\%A_Now%ahk_text_edit_in_vim.txt
我的修改 这样每次的临时文件都不同 可以作为故障恢复的一个办法
当然千万别写隐私~ 明文记录
@theflash, 我还是一样啊,那个%A_Now%什么意思?
@steve, 当前时间。也就是按照时间命名文件。
能不能搞一个emacs的版本出来?
@hugging, 你试试把 gvim=P:\Vim\vim72\gvim.exe 修改为 emacs 的路径。
在group里讨论了半天,确实够折腾的 过两天有时间再弄,我的vimrc设置了utf8解码 结果好多程序中文部分就是乱码了,
稍稍改进了一点,献丑了
WinGetTitle, active_title, A
这句后面增加
;判断文件类型
filetype=%active_title%
IfInString, active_title, SQL 查询分析器
filetype=sql
根据窗口名称改变临时文件后缀名,这样vim修改的时候就可以自动变为相应高亮格式了
后面需要稍作修改
FileDelete, %tmpfile%.*
tmpfile=%tmpfile%.%filetype%
需要增加新的格式就加一句IfInString,修改后面窗口名和文件后缀即可
希望能有点帮助吧
嗯吶~試用下~
Pingback: AutoHotkey_L:支持unicode的AutoHotkey分支 | 善用佳软
请问,为什么我按ctrl+i弹出VIM,打开的VIM是空白的?正常的话,应该VIM里有原来要编辑的文字才对吧?
@百, 你运行 AHK 脚本了吗?具体操作步骤写出来一下,看看能不能帮你。
Ushare不行了,那些以前的软件换个位置吧
@桔子, 嗯,是改抽时间换换位置了。