×用微信扫描并分享

用 gVim 编辑任意窗口的文字[AHK]

37
1 Star2 Stars3 Stars4 Stars5 Stars(快来投票)
Loading...

感谢 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,修改后面窗口名和文件后缀即可。

下载地址:(1.1 KB): Everbox | 来自小众软件

P.S.1 上次小众发了一个 Vim 键盘图中文版这里有一个英文分解版的,方便 Vim 新手。善用佳软也有 AHK + gVim 教程 vtano.ahk:GVIM + AHK 实现顶层透明笔记本

P.S.2 最近一直在酝酿新的 AHK 教程,一个关于 GUI 界面的例子——用 Power 键来关闭或重启 Win7,需要以连载的形式出现(2~3 篇),支持的话过来冒个泡吧。

×用微信扫描并分享

已有 37 条评论, 我要留言

  1. 君临天下说道:

    沙发要占了再看!

  2. WANGJIARONG说道:

    订阅了你的博客,一直关注你的文章,感谢。

  3. 说道:

    谷歌浏览器怎么办

  4. cstr说道:

    runwait, %gvim% “%tmpfile%”
    里面的引号是全角的

    • 善用佳软说道:

      @cstr, 我前一段时间刚被读者提醒过此问题。系由wordpress 自动修正所致。sfufoet 可用 html entity 来表示这个引号,就可以避免此问题。

      • sfufoet说道:

        @善用佳软, 我试试看。一直知道这个问题,只知道通过修改 WP 源代码可以解决,忘记还有 html entity 了。

  5. 善用佳软说道:

    可参考此文:http://vim.wikia.com/wiki/Use_gvim_as_an_external_editor_for_Windows_apps 它最早只给出了vbs的解决方案,后来也扩展到了ahk等方法。

    • sfufoet说道:

      @善用佳软, 官方的方法和我的一样,令我震惊的是,vim 可以直接获得剪贴板文字。。

      • tc说道:

        @sfufoet, 那个是因为他用个paste的插件吧.想要实现官方的扩展,还是需要三个插件的.具体的看wiki

      • tc说道:

        @sfufoet, clipbrd.vim genutils.vim multvals.vim
        特意去找了下,就是三个插件

  6. skystar说道:

    AHK我都快忘了怎么用了,不过AHK有个GUI的创建小程序,像VC一样可以把控件拖进窗口来设计GUI,很方便,然后只要加上你的运行代码就可以了,很简单

  7. murmur说道:

    支持P.S.2 建议。。。。

  8. steve说道:

    我不想通过剪切板的,所以选第一个。
    我在Firefox里用vimperator就可以了。
    但是ahk的优先级高,按Ctrl+i就调用AHK了。
    如何把Firefox加入排除列表中?

    • sfufoet说道:

      @steve,

      WinGetTitle, active_title, A

      ControlGetFocus, name, %active_title%
      之间插入下面的代码:
      IfInString, active_title, Firefox
      {
      send ^i
      return
      }

      并把 ^i:: 修改为 $^i::

  9. sqybi说道:

    windows下面vim用不习惯。。

  10. theflash说道:

    支持 这个相当的实用

  11. kiss说道:

    当然支持哈

  12. 李二嫂的猪说道:

    经过无数次试用……
    最终还是认为 VIM 不适合自己。

  13. theflash说道:

    tmpfile=%A_ScriptDir%\%A_Now%ahk_text_edit_in_vim.txt
    我的修改 这样每次的临时文件都不同 可以作为故障恢复的一个办法

    当然千万别写隐私~ 明文记录

  14. hugging说道:

    能不能搞一个emacs的版本出来?

  15. theflash说道:

    在group里讨论了半天,确实够折腾的 过两天有时间再弄,我的vimrc设置了utf8解码 结果好多程序中文部分就是乱码了,

  16. asj说道:

    稍稍改进了一点,献丑了
    WinGetTitle, active_title, A
    这句后面增加
    ;判断文件类型
    filetype=%active_title%
    IfInString, active_title, SQL 查询分析器
    filetype=sql

    根据窗口名称改变临时文件后缀名,这样vim修改的时候就可以自动变为相应高亮格式了
    后面需要稍作修改
    FileDelete, %tmpfile%.*
    tmpfile=%tmpfile%.%filetype%

    需要增加新的格式就加一句IfInString,修改后面窗口名和文件后缀即可

    希望能有点帮助吧

  17. Susie说道:

    嗯吶~試用下~

  18. […] 我在wordpress撰写或修改博文,一向是用gvim手写源代码。当然,用 AutoHotkey 实现了一键操作。但 AutoHotkey fileappend 创建的文件,fenc=cp936,偶尔会保存出错,显然不如utf-8格式方便。尽管知道AutoHotkey不支持unicode,但是否有奇迹能设定fenc呢?Google 『AutoHotkey fileappend utf-8』,第一条结果就见到 AutoHotkeyU,进入后发现,该分支已经合并到 AutoHotkey_L ,下载后测试『FileAppend, %clipboard%, %tmpfile%, UTF-8』成功,再试了上面的sendinput依然成功,于是,写出来与大家共享。 […]

  19. 说道:

    请问,为什么我按ctrl+i弹出VIM,打开的VIM是空白的?正常的话,应该VIM里有原来要编辑的文字才对吧?

  20. 桔子说道:

    Ushare不行了,那些以前的软件换个位置吧

  21. Bin说道:

    winwait %active_title%
    改成
    winactivate %active_title%

  22. chenwei说道:

    剪贴板通用版本会造成乱码:若初始编辑框的内容是英文,所生成的文件是nobomb,这样Vim编辑时加入中文,最后输出到编辑框就会产生乱码

  23. chenwei说道:

    #SingleInstance Force
    #WinActivateForce
    SetTitleMatchMode, 2 ;设定ahk匹配窗口标题的模式
    ^i::
    ;适应Windows 32位和64位系统下gvim的默认安装路径
    ProgramFilesX86 := A_ProgramFiles . (A_PtrSize=8 ? ” (x86)” : “”)
    gvim := ProgramFilesX86 . “\Vim\vim80\gvim.exe”
    tmpfilename := “TempVimEditFile”
    tmpfile := “C:\Downloads\” . tmpfilename . “.txt”

    ;将目标编辑窗口的数据读入剪贴板
    WinGetActiveTitle, VimTargetWindow ;获取目标编辑窗口的标题
    Clipboard = ;清空剪贴板
    Send ^a ;全选
    Send ^c ;复制
    ClipWait ;等待数据进入剪贴板

    ;使用Vim读入剪贴板数据,并进行编辑
    FileDelete, %tmpfile% ;删除旧的临时文件
    FileAppend, %Clipboard%, %tmpfile% ;把剪贴板内容写入临时文件
    Run, %gvim% “%tmpfile%” + ;用Vim打开临时文件
    ;设置UTF的BOMB文件头,应对初始为英文内容的乱码问题
    WinWait, %tmpfilename% ahk_class Vim
    Send :set bomb{enter}
    ;直到关闭编辑临时文件的Vim窗口,才会执行后面的代码
    WinWaitClose, %tmpfilename% ahk_class Vim

    ;将Vim编辑后的内容发送至目标编辑窗口
    FileRead, Clipboard, %tmpfile% ;将临时文件内容读取到剪贴板
    ;FileDelete, %tmpfile% ;删除临时文件
    WinWait %VimTargetWindow% ;等待目标编辑窗口激活
    Send ^v ;粘贴
    return

有不同想法?说说看(首次评论会被人工审核,请耐心等待)