ブラウザでVimのカーソル下のURLを開く


103

初めてTwitvimを使用します。そこにあるすべてのURLを見ると不思議に思いましたが、お気に入りのブラウザまたは指定したブラウザでカーソルの下にあるURLを開く方法はありますか?


テキストカーソルまたはマウスカーソルの下?
Oleg Mikheev

テキストカーソル...しかし、マウスカーソルの下で行う方法がわかっている場合は、これもかっこいい
マウロモラレス

1
vimのリンクでマウスの中央ボタンをクリックすると、いつもうまくいきましたが、方法はわかりません
Oleg Mikheev

2
中央クリックで開くのは、おそらくvimではなく、ターミナルの機能です。
Leonid Shevtsov

回答:


188

更新:tpopeの今日のツイートから

を押しgxます。ブラウザをカスタマイズできます。GnomeおよびMac OS Xでは、すでにgnome-open/が使用されていますopen。通常は、好きなように設定できg:netrw_browsex_viewerます。


元の答え:

この関数をどこで取得したか覚えていません。URLにハッシュ(#)のバグがありますが、関数は十分に機能するため、修正する必要はありません。

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
でURLを開くのが好きですか?そして#を入れます。netrwはcWORDではなくcfileを使用していると思うので、URLに「?」その方法ではもはや開くことができません。私はここであなたの解決策を試しました、そしてURLの「#」は代替ファイル名に置き換えられます。exec "!open" .shellescape(uri、1)が問題を修正したようです。
チャドスキーターズ2014年

4
前述のツイートはこちら:twitter.com/tpope/status/289234166770434048、だれかが議論に興味がある場合に備えて。
Antoine Cotten 2016年

49

Vim 7.4以降を使用している場合は、通常モードで、カーソルをURLの下に置いてからをクリックするgxと、URLがブラウザーで自動的に開きますデモが作動する


この例では、ブラウザをChromeにどのように設定していますか?(または、どのようなブラウザでも)
jm3 '11年

@ jm3 Try :h netrw_gx:* Windows 32または64の場合、urlおよびFileProtocolHandler dllが使用されます。* Gnomeの場合(gnome-openを使用):gnome-openが使用されます。* KDEの場合(kfmclientを使用):kfmclientが使用されます* Mac OS Xの場合:openが使用されます *それ以外の場合は、netrwFileHandlerプラグインが使用されます。
kbaはモニカの2016

1
少し話題から外れていますが、どのように画面をgifに記録しますか?大好きです!
PeterPerháč16年

@ jm3システムのデフォルトのWebブラウザを使用する
jsvisa

3
@PeterPerháč キーボード入力を記録するためにgithub.com/keycastr/keycastrを使用し、画面をgifとして記録するためにcockos.com/licecapを使用しています
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

カーソルの下のURLを抽出するにはgetline('.')、and matchstr()を使用する必要があります。残りは同じです。


これは私が最終的に探している解決策を私に示すと思います...そして、この機能は非常に便利になります。ありがとう!
マウロモラレス

2

.vimrcファイルに次の行を追加します。

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

したがって、通常モードでは\を押すと現在の単語が選択され、Webブラウザでアドレスとして開きます。

デフォルトのリーダーは\です(ただし、とにマッピングしていますlet mapleader = ",")。同様に、imapを使用すると、挿入モードでいくつかのキーシーケンスをマップできます(ただし、2つのキーシーケンスの場合、デフォルトの動作をオーバーライドする可能性があります)。


1

OK、@ 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-miscのを vimの中で私が今まで-素晴らしい経由でこれを行うことをお勧めします病原体のプラグインして、単純にcd ~/vimfiles/bundle & git clone git@github.com:xolox/vim-misc.git & git clone git@github.com:xolox/vim-shell.gitmsysgitから。(これらの2つのプラグインは、通常のウィンドウで必要な追加のコマンドプロンプトや他の愚かなナンセンスを作成せずに、デフォルトのブラウザーでURLを開きます。次のようにVimでURLを開くことができます::Open http://duckduckgo.com試してください。気に入ってください。

  2. カーソルの下の行をブラウザにすばやく表示できるように、いくつかのvimマッピングを作成します。私はこれをuにマップします(私にとっては、,u通常モードからのものです)。方法は次のとおりです。

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

このマッピングを使用するには、通常モード+ uでリーダーキーを入力します。カーソルの下の行を読み取り、デフォルトのブラウザーで開きます。


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プラグインをざっと見てください

henrik / 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

これは簡単です。「開始」をOSが使用するものに置き換えてください

go urlの GU

" 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さん(11,000+ LOC)

私は、リモートも多いので編集は使用しませんvim-dirvish(よりそれは実際に高速です、私のワークフローを管理するための強力な十分ですnetrw-著者の主張は2倍、私はそれがより速くよりだと感じ、それは本当に瞬間だ大規模なコードベース/リポジトリに非常に便利⚡)。私は10Kのファイルリポジトリで試してみましたが、-まだインスタント経由でファイルをリストしています テストした人vim-dirvishに対してしたNerdtreeので、違いがわかります。

とにかくvim-vinegarvim-dirvishに-バインディングがあるので、私もドロップしました。ほとんどの構成vim-vinegarnetrw。詳細です。必要ないだけです。一石二鳥!

このプラグインの優れた点は、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は通常のバインディングがない理由があります。私は驚いているほとんどないレバレッジコマンドワークフローは、私は元のコマンドを使用しないソリューション多く、:s:g:v:argdo:cdo、、友人。これをさまざまなモードと組み合わせて、vimの能力を最大限に引き出します。したがって、1つのモードにとどまらず、vimの能力を最大限に活用してみてください。

完全なワークフローです。URLの上にカーソルを置いている間、これはたった1つのステップです:😊

👉 :!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

私は3つすべてのプラットフォームを使用しており、それらはうまく機能します。そのうちの1つをvimバインディングに使用できます。:!openそして単にあなたbashrc/zshrc/fish configのエイリアスopenあなたが持っているものは何でも、プラットフォーム固有のプログラムへのコマンド。

例えば。 alias open = wslview

そうvimrcすれば、私のプラットフォームにとらわれないままで、を介して不整合に対処しますbashrc/zshrc/fish config

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.