使用浏览器打开Vim中的光标下的URL

时间:2012-02-26 23:25:31

标签: vim

我第一次使用Twitvim。看到那里的所有网址让我想知道,有没有办法在你最喜欢的浏览器或指定的浏览器中打开光标下的URL?

12 个答案:

答案 0 :(得分:147)

更新:今天来自tpope的推文

gx。您可以自定义浏览器。在Gnome和Mac OS X上,它已经使用gnome-open / open。通常,您可以将g:netrw_browsex_viewer设置为您想要的任何内容。


原始答案:

不记得我在哪里获得此功能。 url中有一个hash(#)错误,但该函数运行良好,我不打扰修复它。

function! HandleURL()
  let s:uri = matchstr(getline("."), '[a-z]*:\/\/[^ >,;]*')
  echo s:uri
  if s:uri != ""
    silent exec "!open '".s:uri."'"
  else
    echo "No URI found in line."
  endif
endfunction
map <leader>u :call HandleURL()<cr>

注意:如果您不在Mac上,请使用适用于Linux的gnome-open / xdg-open或适用于Windows的“网络浏览器路径”

答案 1 :(得分:43)

如果您使用的是Vim 7.4或更高版本,请在正常模式下将光标放在网址下方,然后点击gx,网址将自动在浏览器中打开demo operate

答案 2 :(得分:7)

我使用此脚本在Google下搜索keyword光标:

nmap <leader>g :call Google()<CR>
fun! Google()
    let keyword = expand("<cword>")
    let url = "http://www.google.com/search?q=" . keyword
    let path = "C:/Program Files/Mozilla Firefox/"
    exec 'silent !"' . path . 'firefox.exe" ' . url
endfun

您应该使用getline('.')matchstr()来提取光标下的网址。其余的都一样。

答案 3 :(得分:1)

好的,所以使用@tungd和@kev的答案和一些研究,我最终得到了这个脚本,它的工作方式与我需要的一样。就像@tungd所说的那样#如果在网址内可以给出一个问题,但是我很酷,如果有人对网址有更好的表达,那么它会受到欢迎。

function! OpenUrlUnderCursor()
    let path="/Applications/Safari.app"
    execute "normal BvEy"
    let url=matchstr(@0, '[a-z]*:\/\/[^ >,;]*')
    if url != ""
        silent exec "!open -a ".path." '".url."'" | redraw! 
        echo "opened ".url
    else
        echo "No URL under cursor."
    endif
endfunction
nmap <leader>o :call OpenUrlUnderCursor()<CR>

答案 4 :(得分:1)

我参加这个派对的时间已经很晚了,但这是另一种方法,在Windows 7上运行得特别好。

  1. 在vim中安装vim-shellvim-misc 我建议通过非常棒的Pathogen插件执行此操作,然后只需cd ~/vimfiles/bundle & git clone git@github.com:xolox/vim-misc.git & git clone git@github.com:xolox/vim-shell.git来自msysgit。 (这两个插件在您的默认浏览器中打开网址,而不会创建任何额外的命令提示或Windows中通常需要的其他愚蠢的废话。您可以在Vim中打开网址::Open http://duckduckgo.com。尝试一下。你会喜欢它

  2. 创建一些vim映射,以便您可以快速将光标下的行放入浏览器。我将此映射到你(对我来说,这是,u从正常模式)。方法如下:

    nnoremap u:exec“打开”.getline(“。”)

  3. 要使用此映射,请从正常模式+ u键入您的Leader键。它应该读取光标下的行并在默认浏览器中打开它。

答案 5 :(得分:1)

将以下行添加到.vimrc文件中:

nmap <leader><space> yiW:!xdg-open <c-r>" &<cr>

因此在正常模式下按\它选择当前单词并在网络浏览器中将其作为地址打开。

默认情况下,领导者是\(但我已将其映射到let mapleader = ",")。类似地,使用imap可以在插入模式下映射一些键序列(但是,如果它是2键序列,它可能会覆盖一些默认行为)。

答案 6 :(得分:0)

你应该快速浏览一下这个vim插件

henrik/vim-open-url

它基本上是在其他一些响应中解释的,但是如果你使用插件管理器需要特定的配置:)

答案 7 :(得分:0)

这是@tungd在此处https://stackoverflow.com/a/9459366/7631731最初提出的脚本的一种改进版本。 保持vim上下文并正确处理包含“#”的URL。

function! HandleURL()
  let s:uri = matchstr(getline("."), '[a-z]*:\/\/[^ >,;()]*')
  let s:uri = shellescape(s:uri, 1)
  echom s:uri
  if s:uri != ""
    silent exec "!open '".s:uri."'"
    :redraw!
  else
    echo "No URI found in line."
  endif
endfunction

nnoremap <leader>w :call HandleURL()<CR>¬

答案 8 :(得分:0)

As described@kev修改,针对Linux环境进行了修改。

在旁边:当在我的终端中执行此功能(Vim 8.1)时,Vim屏幕被模糊处理(大部分为“空白”;即文本在那里但不可见)。 :redraw!命令(请参阅https://stackoverflow.com/a/1117742/1904943)重新绘制屏幕。

添加到~/.vimrc

nmap <leader>g :call Google()<CR>:redraw!<CR>
fun! Google()
  let keyword = expand("<cword>")
  let url = "http://www.google.com/search?q=" . keyword
  let path = "/usr/bin/"
  exec 'silent !"' . path . 'firefox" ' . url
endfun

答案 9 :(得分:0)

这很简单,只需将“ start”替换为您的操作系统使用的

GU为 go url!

" Open url
if (has('win32') || has('win64'))
   nmap gu :exec "!start <cWORD>"<cr> 
else
   nmap gu :exec "!open <cWORD>"<cr> 
endif

答案 10 :(得分:0)

卸载netrw的人的解决方案

这是在vim / neovim中删除netrw:help netrw-noload)的人们的解决方案。例如,他们使用不同的文件管理器,例如vim-dirvish

TLDR:

?:!open <c-r><c-a>

或地图gx

?nmap gx :!open <c-r><c-a>


所以只是一点背景:

我也在寻找解决这个问题的方法,因为我实际上将netrw完全从vim中卸载了,并用vim-dirvish代替了。与netrw(11,000+ LOC)相比,此插件具有 500〜LOC

我不使用远程编辑,所以vim-dirvish足以管理我的工作流程(实际上比netrw快〜作者声称是2倍,我觉得比这还快- 这真的是瞬时的 ⚡)在大型代码库/存储库中非常有用。我什至在一个10K的文件仓库中尝试了此操作,仍然可以通过-列出文件! Someone tested vim-dirvish against Nerdtree,您可以看到不同之处。

我也放弃了vim-vinegar是因为vim-dirvish仍然具有-绑定,并且vim-vinegar的大多数配置都是netrw的细节。只是不需要它。两只鸟合在一块石头里!

此插件的优点在于它包含 VINE (Vim不是Emacs)的理念。它利用终端中其他程序的功能来进行文件操作,而不是尝试自己完成所有操作。重要的是这些外部程序与vim交互的自然程度。这是通过:Shdo来实现的,它有一个方便的键. (dot command(对于repeat命令来说是助记符),可以同时在选择或vim-dirvish缓冲区的实际行上执行。然后输入!rm进行删除,输入!mv进行重命名。

自从我禁用netrw以来,(:help netrw-noload)我发现自己不时到达gx。我不想加载插件来恢复gx功能。


对于该解决方案,现在在命令模式下有一个绑定,先 ctrl-r 然后 ctrl-a :help c_CTRL-R_CTRL-A)粘贴您所拥有的内容您将光标移至命令行,因此,如果将其与:!xdg-open / :!open(对于Mac)结合使用,就可以完成设置。

:w没有常规绑定是有原因的。令我惊讶的是,大多数解决方案都没有利用命令工作流程,我经常使用前命令,:s:g:v:argdo:cdo , 和朋友。结合不同的模式,充分发挥vim的威力。因此,不要只停留在一种模式下,而是要充分利用vim的全部功能。

因此,完整的工作流程。当您将光标放在url上方时,只需一步:?

?:!open <c-r><c-a>

注意!,它指示利用vim之外的外部程序的功能。

如果您希望恢复gx功能,则可以使用同一命令进行映射:

  • nmap gx :!open <c-r><c-a>

我喜欢使绑定静音,因此添加<silent>:sil可以解决问题(:help :map-silent

?nmap <silent>gx :sil !open <c-r><c-a><cr>

关于打开URL的平台特定程序的说明:

  1. Mac具有:!open
  2. Linux有:!xdg-open
  3. Windows(WSL2)具有:!wslview

我使用所有这三个平台,它们运作良好。您可以只使用其中之一进行vim绑定,例如。 :!open,只是在bashrc/zshrc/fish config命令的open命令中使用别名,以表示所拥有的特定于平台的程序。

例如alias open = wslview

那样,我的vimrc仍然与平台无关,而我将通过bashrc/zshrc/fish config处理不一致之处。

答案 11 :(得分:0)

我从 netrw 中删除了所有不需要的代码,结果只有一行代码:

nnoremap <silent> gx :execute 'silent! !xdg-open ' . shellescape(expand('<cWORD>'), 1)<cr>

这个实现和netrw一样,只是更好。在 macOS 中将 xdg-open 替换为 open,在 Windows 中将 start 替换。