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

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

46004 次浏览

我用这个脚本在谷歌搜索光标下的 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

You should use getline('.') and matchstr() to extract url under cursor. The rest is the same.

Updated: from tpope's tweet today

gx。您可以自定义浏览器。在 Gnome 和 Mac OS X 上,它已经使用了 gnome-open/open。一般来说,你可以设置 g:netrw_browsex_viewer为任何你想要的。


Original answer:

不记得我从哪里得到这个函数了。在 url 中有一个带 hash (#)的 bug,但是这个函数工作得很好,所以我不用费心去修复它。

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 浏览器路径”

好的,使用@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>

我已经来不及参加这个聚会了,但是这里有另外一种方法,在 Windows7上特别有效。

  1. 在 vim 中同时安装 Vim-ShellVim-Misc,我推荐使用非常棒的 病原体插件,然后从 msysgit 中简单地安装 cd ~/vimfiles/bundle & git clone git@github.com:xolox/vim-misc.git & git clone git@github.com:xolox/vim-shell.git。(这两个插件可以在你的默认浏览器中打开网址,而不需要创建任何额外的命令提示或者其他窗口中通常需要的愚蠢的东西。您可以像这样在 Vim 中打开 url: :Open http://duckduckgo.com。试试看。你会喜欢的。)

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

    nnoremap u :exec "Open ".getline(".")

若要使用此映射,请在标准模式 + u 中键入 Leadkey。它应该读取光标下的行并在默认浏览器中打开它。

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

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

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

Leader by default is \ (but I've mapped it to , with let mapleader = ","). Similarly, using imap you can map some key sequence in insert mode (but then, if it is 2 key sequence, it probably will override some default behaviour).

You should take a quick look to this vim plugin

Henrik/vim-open-url

It's basically what has been explained in some other responses, but specific configuration needed if you use a plugin manager :)

如果您正在使用 Vim 7.4或更高版本,在正常模式下,将您的光标放在 URL 下面,然后单击 gx,该 URL 将在浏览器中自动打开demo operate

这是@tungd here https://stackoverflow.com/a/9459366/7631731最初提出的脚本的一种改进版本。 Keeps vim context and handles correctly URLS containing "#".

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>¬

如上面 @ Kev所描述的 ,为 Linux 环境进行了修改。

Aside: when this function was executed (Vim 8.1) in my terminal, the Vim screen was obfuscated (mostly "blanked;" i.e., the text was there but not visible). The :redraw! command (see https://stackoverflow.com/a/1117742/1904943) redraws the screen.

加入 ~/.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


这很简单,只需将“开始”替换为你的操作系统使用的任何东西

GU 代表 加油!

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

为卸载 netrw的人提供的解决方案

这是为删除 vim/nevim 中的 netrw(:help netrw-noload)的用户提供的解决方案,例如,他们使用不同的文件管理器,如 vim-dirvish

TLDR:

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

或地图 gx:

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


所以只是一点背景知识:

我也在寻找这个问题的解决方案,因为我实际上已经完全从 vim 中删除了 netrw,并将其替换为 vim-dirvish。与 netrw(11,000+ LOC)相比,这个插件大约有 500~ LOC

我不经常使用远程编辑,所以 vim-dirvish足够强大,可以管理我的工作流(它实际上比 netrw ~ the author claims 2x, I feel it's faster than that - it's really instantaneous something 快) ,对于大型代码库/存储库非常有用。我甚至尝试在10K 文件回购,列出通过 -文件仍然即时!有人测试了 ABC0和 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-command、 :s:g:v:argdo:cdo和朋友。结合不同的模式,利用 vim 的全部功能。所以不要只停留在一个模式,试着充分利用 Vim 的力量。

所以完整的工作流程,当你把光标放在网址顶部时,只需要一个步骤:

👉 :!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 configopen命令到任何平台特定的程序,你有。

例如 alias open = wslview

That way, my vimrc stays platform-agnostic, and I'll just deal with the inconsistencies via bashrc/zshrc/fish config.

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

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

在 macOS 中用 open代替 xdg-open,在 Windows 中用 start代替 xdg-open

macOS searching google for keyword.

我稍微修改了@kev 解决方案,在 Mac 上实现了相同的解决方案,

nmap <leader>gw :call Google()<CR>
fun! Google()
let keyword = expand("<cword>")
let url = "http://www.google.com/search?q=" . keyword
let path="/Applications/Firefox.app"
"exec 'silent ! path url'
silent exec "!open -a ".path." '".url."'" | redraw!
endfun


如果您使用的是 Lua.init,那么使用

local cmd = vim.cmd
cmd [[
nmap <leader>gw :call Google()<CR>
fun! Google()
let keyword = expand("<cword>")
let url = "http://www.google.com/search?q=" . keyword
let path="/Applications/Firefox.app"
"exec 'silent ! path url'
silent exec "!open -a ".path." '".url."'" | redraw!
endfun
]]

注意

使用 Safari代替使用 let path="/Applications/Safari.app"

对于 MacOS 用户:

nmap <silent> gx :!open <cWORD><cr>

从 vim 开始搜索有很多好主意,下面是一个命令实现:

""" Browser
command! -bar -nargs=1 S call Google(<q-args>)
function! Google(search) range
let url = "http://www.google.com/search?q=" . a:search
exec '!firefox-developer-edition "' . url . '"'
endfunction

用法:

:S film tom medina