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


104

我是第一次使用Twitvim。看到其中的所有URL令我感到奇怪,有什么方法可以在您喜欢的浏览器或指定的浏览器中的光标下方打开URL?


在文本光标或鼠标光标下?
Oleg Mikheev'2

文本光标...但是如果您知道在鼠标光标下也很酷的方法
Mauro Morales 2012年

1
用鼠标中键单击vim中的链接一直对我
有用

2
单击中键可能是终端的功能,而不是vim。
列昂尼德·舍甫佐夫

Answers:


189

更新:从今天tpope的推文

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


原始答案:

不记得我在哪里得到这个功能。网址中有一个带有井号(#)的错误,但该功能运行良好,因此我不会费心去修复它。

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则使用“ Web浏览器的路径”


我想我将使用您的解决方案:)谢谢...我确实想看看是否有一种方法只能将光标下的url获取,但是对vimscript的了解并不多,所以我将不得不对其进行处理。 。
莫罗·莫拉莱斯

14
gx非常强大,谢谢!它还会使用适当的应用程序打开文件。
blinry 2013年

我认为它是g:netrw_browsex_viewer(w / o'r')
杰克

2
我喜欢用?打开一个网址。和其中的#。我认为netrw现在正在使用cfile而不是cWORD,所以带有'?'的网址 不能使用该方法打开。我在这里尝试了您的解决方案,URL中的“#”将替换为备用文件名。exec“!open” .shellescape(uri,1)似乎已经解决了问题。
乍得斯基特队,2014年

4
前面提到的推文在这里:twitter.com/tpope/status/289234166770434048,以防万一有人对讨论感兴趣。
Antoine Cotten

49

如果您使用的是Vim 7.4或更高版本,则在正常模式下,将光标置于URL下方,然后单击gx,URL将在浏览器自动打开。演示操作


在此示例中,如何将浏览器设置为Chrome?(或任何其他浏览器)
jm3,2016年

@ jm3尝试:h netrw_gx:*对于Windows 32或64,使用url和FileProtocolHandler dll。*对于Gnome(具有gnome-open):使用gnome-open。*对于KDE(带有kfmclient):使用kfmclient *对于Mac OS X:使用open。*否则,将使用netrwFileHandler插件。
kba与莫妮卡站在

1
稍微偏离主题,但是如何将屏幕记录为gif?爱它!
彼得·佩拉奇(PeterPerháč)

@ jm3使用系统的默认Web浏览器
jsvisa

3
@PeterPerháč我正在使用github.com/keycastr/keycastr记录键盘输入,cockos.com / licecap将屏幕记录为gif
jsvisa

9

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

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()提取光标所在的网址。其余部分相同。


我认为这将使我最终找到我要寻找的解决方案……加上此功能将非常方便。谢谢!
莫罗·莫拉莱斯

2

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

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

因此,在正常模式下,按\可以选择当前单词并在Web浏览器中将其打开为地址。

默认情况下,Leader是\(但我已将它映射到了,并带有let mapleader = ",")。同样,使用imap可以在插入模式下映射一些键序列(但是,如果它是2个键序列,则它可能会覆盖某些默认行为)。


1

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

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>

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进行。(这两个插件可在默认浏览器中打开url,而无需在Windows中创建通常需要的任何其他命令提示符或其他无聊的废话。您可以像这样在Vim中打开url::Open http://duckduckgo.com尝试一下。您会喜欢的。

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

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

要使用此映射,请从普通模式+ u键入Lead键。它应读取光标下方的行,并在默认浏览器中将其打开。


1

这是@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>¬

0

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

亨里克/ vim-open-url

基本上,这是其他一些答复中已经解释的内容,但是如果您使用插件管理器,则需要特定的配置:)


0

如所描述的由上述@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


0

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

GU的URL!

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

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。这个插件具有围绕500〜LOC,相比netrw(11000 LOC)

我不使用远程编辑,所以vim-dirvish功能强大到足以管理我的工作流程(实际上比netrw声称作者2倍,我觉得它比那还要快- 确实是瞬时 ⚡)在大型代码库/存储库上非常有用。我什至在一个10K的文件仓库中尝试了它,-还可以即时列出文件!有人vim-dirvish针对进行了测试Nerdtree,您可以看到其中的区别。

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

这个插件的优点在于它包含了VINE的理念(Vim不是Emacs)。它利用终端中其他程序的功能来进行文件操作,而不是尝试自己做所有事情。重要的是这些外部程序与vim交互的自然程度。这是通过来实现的:Shdo,它具有一个方便的键.(点命令,对于重复命令而言是助记符),既可以在选择上执行,也可以在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没有正常绑定是有原因的。我很惊讶,大多数的解决方案没有利用命令的工作流程,我用ex命令了不少,: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绑定,例如。:!openbashrc/zshrc/fish configopen命令中使用别名作为您拥有的任何特定于平台的程序的别名。

例如。 alias open = wslview

这样,我就vimrc不会在平台上了解任何东西,而我将通过来处理不一致之处bashrc/zshrc/fish config

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.