已实现:用火狐开启gVim中的URL - gVim中调用外部程序,但不要gVim去等它结束

Vim、Emacs配置和使用
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

已实现:用火狐开启gVim中的URL - gVim中调用外部程序,但不要gVim去等它结束

#1

帖子 lilydjwg » 2009-05-18 13:16

文件中经常会有一些URL,所以想加个键映射,方便地打开URL:

代码: 全选

nmap tf :!firefox <url><CR> "<url>代指要打开的URL
可是这样的话,gVim就会等待火狐结束(除非火狐已经由其它方式打开)。

我希望火狐能在后台打开。加过 & 了,结果gVim除了显示它执行了这条命令外,就什么反应也没有了(根本没有执行火狐)。
不知哪位有办法教教我?
上次由 lilydjwg 在 2009-05-18 16:18,总共编辑 1 次。
iny
帖子: 142
注册时间: 2008-05-22 9:43

Re: 怎样实现:gVim中调用外部程序,但不要gVim去等它结束

#2

帖子 iny » 2009-05-18 13:55

代码: 全选

nmap <silent> tf :!firefox <url><CR> "<url>代指要打开的URL
iny
帖子: 142
注册时间: 2008-05-22 9:43

Re: 怎样实现:gVim中调用外部程序,但不要gVim去等它结束

#3

帖子 iny » 2009-05-18 14:00

怎么设置使用Ctrl + Click就打开URL链接?
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 怎样实现:gVim中调用外部程序,但不要gVim去等它结束

#4

帖子 lilydjwg » 2009-05-18 14:13

回2楼:我也试过silent,没有用的,还是得等火狐结束。

回3楼:左键的话

代码: 全选

nmap <C-LeftMouse> <open_url>  "<open_url>部分依你的需求自己写吧
iny
帖子: 142
注册时间: 2008-05-22 9:43

Re: 怎样实现:gVim中调用外部程序,但不要gVim去等它结束

#5

帖子 iny » 2009-05-18 14:49

的确不行,等到高人
PS:open_url不会写,呵呵
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

分享:gVim打开光标处的URL函数

#6

帖子 lilydjwg » 2009-05-18 15:53

累了好久,终于写出个像样的了,只是仍不能排除结尾的英文句号(.)。
第一个函数改自VimExplorer,第二个改自Vimwiki

代码: 全选

"  平台判断[[[2
function Lilydjwg_haswin32()
  if (has("win32") || has("win95") || has("win64") || has("win16"))
    return 1
  else
    return 0
  endif
endfunction

"  取得光标处的匹配[[[2
function Lilydjwg_get_pattern_at_cursor(pat) "{{{
  let col = col('.') - 1
  let line = getline('.')
  let ebeg = -1
  let cont = match(line, a:pat, 0)
  while (ebeg >= 0 || (0 <= cont) && (cont <= col))
    let contn = matchend(line, a:pat, cont)
    if (cont <= col) && (col < contn)
      let ebeg = match(line, a:pat, cont)
      let elen = contn - ebeg
      break
    else
      let cont = match(line, a:pat, contn)
    endif
  endwh
  if ebeg >= 0
    return strpart(line, ebeg, elen)
  else
    return ""
  endif
endfunction

"  用火狐打开链接[[[2
function Lilydjwg_open_url()
  let s:url = Lilydjwg_get_pattern_at_cursor('\v(https?://|ftp://|file:/{3}|www\.)((\w|-)+\.)+(\w|-)+(:\d+)?/((\w|[~@#$%^&+=/?.-])+)?')
  "  echo s:url
  if s:url == ""
    echohl WarningMsg
    echomsg '在光标处未发现URL!'
    echohl None
  else
    if !Lilydjwg_haswin32()
      call system("firefox " . s:url . " &")
    else
      call system("start " . s:url)
    endif
  endif
    unlet s:url
  endfunction
目前未经充分测试,若发现问题请回复我。
starwing
帖子: 100
注册时间: 2008-09-19 1:03

Re: 已实现:用火狐开启gVim中的URL - gVim中调用外部程序,但不要gVim去等它结束

#7

帖子 starwing » 2009-05-18 18:21

不一定非要firefox。你可以用gnome-open,或者跟winmanager一样,做几个脚本,比如start.gnome, start.kde等等,这样比较方便。

还有,在我的9.04, 火狐3.5.b4上面,直接:!firefox火狐就自己fork出去了,只剩下一个hitenter提示……所以貌似不需要这么麻烦……
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 已实现:用火狐开启gVim中的URL - gVim中调用外部程序,但不要gVim去等它结束

#8

帖子 lilydjwg » 2009-05-18 19:38

starwing 写了: 还有,在我的9.04, 火狐3.5.b4上面,直接:!firefox火狐就自己fork出去了,只剩下一个hitenter提示……所以貌似不需要这么麻烦……
我的火狐是3.0.10的,fork不出去啊!gnome-open倒可以一试。
iny
帖子: 142
注册时间: 2008-05-22 9:43

Re: 分享:gVim打开光标处的URL函数

#9

帖子 iny » 2009-05-19 1:21

lilydjwg 写了:累了好久,终于写出个像样的了,只是仍不能排除结尾的英文句号(.)。
第一个函数改自VimExplorer,第二个改自Vimwiki

代码: 全选

"  平台判断[[[2
function Lilydjwg_haswin32()
  if (has("win32") || has("win95") || has("win64") || has("win16"))
    return 1
  else
    return 0
  endif
endfunction

"  取得光标处的匹配[[[2
function Lilydjwg_get_pattern_at_cursor(pat) "{{{
  let col = col('.') - 1
  let line = getline('.')
  let ebeg = -1
  let cont = match(line, a:pat, 0)
  while (ebeg >= 0 || (0 <= cont) && (cont <= col))
    let contn = matchend(line, a:pat, cont)
    if (cont <= col) && (col < contn)
      let ebeg = match(line, a:pat, cont)
      let elen = contn - ebeg
      break
    else
      let cont = match(line, a:pat, contn)
    endif
  endwh
  if ebeg >= 0
    return strpart(line, ebeg, elen)
  else
    return ""
  endif
endfunction

"  用火狐打开链接[[[2
function Lilydjwg_open_url()
  let s:url = Lilydjwg_get_pattern_at_cursor('\v(https?://|ftp://|file:/{3}|www\.)((\w|-)+\.)+(\w|-)+(:\d+)?/((\w|[~@#$%^&+=/?.-])+)?')
  "  echo s:url
  if s:url == ""
    echohl WarningMsg
    echomsg '在光标处未发现URL!'
    echohl None
  else
    if !Lilydjwg_haswin32()
      call system("firefox " . s:url . " &")
    else
      call system("start " . s:url)
    endif
  endif
    unlet s:url
  endfunction
目前未经充分测试,若发现问题请回复我。
相当的爽,不过有个地方有问题Windows下把start改成explorer就可以了 :em11
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 已实现:用火狐开启gVim中的URL - gVim中调用外部程序,但不要gVim去等它结束

#10

帖子 lilydjwg » 2009-05-19 12:40

iny 写了: 相当的爽,不过有个地方有问题Windows下把start改成explorer就可以了 :em11
谢谢支持!
Windows下没试过,不知道是什么问题。不过要改的话,我宁愿改成 firefox (我已经把一个包含 firefox.lnk 的文件夹加到%PATH%里去了。)
iny
帖子: 142
注册时间: 2008-05-22 9:43

Re: 已实现:用火狐开启gVim中的URL - gVim中调用外部程序,但不要gVim去等它结束

#11

帖子 iny » 2009-05-19 13:05

lilydjwg 写了:
iny 写了: 相当的爽,不过有个地方有问题Windows下把start改成explorer就可以了 :em11
谢谢支持!
Windows下没试过,不知道是什么问题。不过要改的话,我宁愿改成 firefox (我已经把一个包含 firefox.lnk 的文件夹加到%PATH%里去了。)
嗯,我反复测试了,只要把start改成explorer就可以用IE打开了,Windows上用IE方便,毕竟这是集成了,呵呵

另外有个问题请教,能不能抓取鼠标所在位置?否则还得把光标放到url的地方才能操作,如果能抓取鼠标位置,那就简直完美了。 :em02
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 已实现:用火狐开启gVim中的URL - gVim中调用外部程序,但不要gVim去等它结束

#12

帖子 lilydjwg » 2009-05-19 18:16

iny 写了: 另外有个问题请教,能不能抓取鼠标所在位置?否则还得把光标放到url的地方才能操作,如果能抓取鼠标位置,那就简直完美了。 :em02
要鼠标操作的话,你点两下就可以了嘛:第一下把光标移过去,第二下打开链接。
愿意看代码的话,可以看看VimExplorer的,它似乎做到了。
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 已实现:用火狐开启gVim中的URL - gVim中调用外部程序,但不要gVim去等它结束

#13

帖子 lilydjwg » 2009-05-19 18:22

Try this:

代码: 全选

nmap <2-LeftMouse> :call Lilydjwg_open_url()<CR>
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

新发现:在终端的Vim中用鼠标双击(或右键有弹出菜单)链接即可打开链接!

#14

帖子 lilydjwg » 2009-05-21 22:09

RT。看来终端也是很好用的~!
头像
O_O_BOT
帖子: 2461
注册时间: 2009-05-20 19:32

Re: 已实现:用火狐开启gVim中的URL - gVim中调用外部程序,但不要gVim去等它结束

#15

帖子 O_O_BOT » 2009-05-21 22:12

irc <fvw> say: 那是终端的扩展 rxvt就有。
irc 聊天室
ubuntu-cn 的irc 频道为
irc.ubuntu.com 8001 #ubuntu-cn
UTF8编码 可用 irssi xchat pidgin weechat 登录

http://webchat.freenode.net/?channels=ubuntu-cn
[url]irc://irc.freenode.net/ubuntu-cn[/url]
回复