Buka URL di bawah kursor di Vim dengan browser


104

Saya menggunakan Twitvim untuk pertama kalinya. Melihat semua URL di sana membuat saya bertanya-tanya, adakah cara untuk membuka URL di bawah kursor di browser favorit Anda atau yang ditentukan?


di bawah kursor teks atau kursor mouse?
Oleg Mikheev

kursor teks ... tetapi jika Anda tahu cara melakukannya di bawah kursor mouse, itu akan keren juga
Mauro Morales

1
klik tombol tengah mouse pada tautan di vim selalu berhasil untuk saya, meskipun saya tidak tahu caranya
Oleg Mikheev

2
klik tengah untuk membuka kemungkinan merupakan fitur terminal, bukan vim.
Leonid Shevtsov

Jawaban:


189

Diperbarui: dari tweet tpope hari ini

Tekan gx. Anda dapat menyesuaikan browser. Di Gnome dan Mac OS X sudah menggunakan gnome-open/ open. Umumnya Anda dapat mengatur g:netrw_browsex_viewerapa pun yang Anda inginkan.


Jawaban asli:

Tidak ingat di mana saya mendapatkan fungsi ini. Ada bug dengan hash (#) di url, tetapi fungsinya bekerja cukup baik sehingga saya tidak akan repot-repot memperbaikinya.

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>

Catatan: Jika Anda tidak menggunakan Mac, gunakan gnome-open/ xdg-openuntuk Linux, atau 'jalur ke browser web Anda' untuk Windows


Saya rasa saya akan menggunakan solusi Anda :) terima kasih ... Saya ingin melihat apakah ada cara untuk hanya mendapatkan url di bawah kursor, tetapi tidak tahu banyak tentang vimscript jadi saya harus mengerjakannya .
Mauro Morales

14
gxsangat kuat, terima kasih! Ini juga membuka file dengan aplikasi ™ yang sesuai.
blinry

Saya pikir ini adalah g: netrw_browsex_viewer (w / o 'r')
Jack

2
Saya suka membuka url dengan? dan # di dalamnya. Saya pikir netrw menggunakan cfile dan bukan cWORD sekarang, jadi url dengan '?' tidak lagi dapat dibuka menggunakan metode itu. Saya mencoba solusi Anda di sini dan '#' di url akan diganti dengan nama file alternatif. exec "! open" .shellescape (uri, 1) tampaknya telah memperbaiki masalah tersebut.
Chad Skeeters

4
Tweet tersebut ada di sini: twitter.com/tpope/status/289234166770434048 , untuk berjaga-jaga jika ada yang tertarik dengan diskusi.
Antoine Cotten

49

Jika Anda menggunakan Vim 7.4 atau yang lebih baru, dalam mode normal, letakkan kursor Anda di bawah URL, lalu klik gx, URL akan terbuka di browser otomatisdemo beroperasi


bagaimana Anda menyetel browser menjadi Chrome dalam contoh ini? (atau browser apa pun itu)
jm3

@ jm3 Coba :h netrw_gx: * untuk Windows 32 atau 64, url dan FileProtocolHandler dll digunakan. * untuk Gnome (dengan gnome-open): gnome-open digunakan. * untuk KDE (dengan kfmclient): kfmclient digunakan * untuk Mac OS X: open digunakan. * jika tidak, plugin netrwFileHandler akan digunakan.
kba berdiri bersama Monica

1
keluar dari topik sedikit, tetapi bagaimana Anda merekam layar menjadi gif? suka!
Peter Perháč

@ jm3 Yang menggunakan browser web default Sistem
jsvisa

3
@ PeterPerháč Saya menggunakan github.com/keycastr/keycastr untuk merekam masukan Keyboard, cockos.com/licecap untuk merekam layar sebagai gif
jsvisa

9

Saya menggunakan skrip ini untuk mencari gooogle di keywordbawah kursor:

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

Anda harus menggunakan getline('.')dan matchstr()mengekstrak url di bawah kursor. Selebihnya sama saja.


Saya rasa ini akan mengarahkan saya ke solusi yang saya cari pada akhirnya ... ditambah fungsi ini akan menjadi sangat berguna. Terima kasih!
Mauro Morales

2

Tambahkan baris berikut ke file .vimrc:

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

Jadi dalam mode normal itu menekan \ itu memilih kata saat ini dan membukanya sebagai alamat di browser web.

Leader secara default adalah \ (tapi saya telah memetakannya ke, dengan let mapleader = ","). Demikian pula, menggunakan imap Anda dapat memetakan beberapa urutan kunci dalam mode penyisipan (tetapi kemudian, jika itu adalah urutan 2 kunci, mungkin akan menimpa beberapa perilaku default).


1

Ok jadi menggunakan jawaban dari @tungd dan @kev dan sedikit penelitian saya berakhir dengan skrip ini, yang berfungsi seperti yang saya butuhkan. Seperti kata @tungd, # dapat memberikan masalah jika di dalam url tapi saya tidak keberatan, jika ada yang memiliki ekspresi yang lebih baik untuk url tersebut maka itu akan disambut.

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

Saya cukup terlambat ke pesta ini, tetapi inilah cara lain untuk melakukan ini yang bekerja dengan sangat baik di Windows 7.

  1. Instal vim-shell dan vim-misc di vim. Saya sarankan melakukan ini melalui plugin Pathogen yang luar biasa dan kemudian hanya cd ~/vimfiles/bundle & git clone git@github.com:xolox/vim-misc.git & git clone git@github.com:xolox/vim-shell.gitdari msysgit. ( Kedua plugin ini membuka url di browser default Anda tanpa membuat perintah perintah tambahan atau omong kosong konyol lainnya yang biasanya diperlukan di windows. Anda dapat membuka url di Vim seperti ini:. :Open http://duckduckgo.comCobalah. Anda akan menyukainya. )

  2. Buat beberapa pemetaan vim sehingga Anda dapat dengan cepat memasukkan baris di bawah kursor ke dalam browser. Saya akan memetakan ini ke Anda (bagi saya, itu ,udari mode normal). Begini caranya:

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

Untuk menggunakan pemetaan ini, ketik kunci Leader Anda dari mode normal + u. Ini harus membaca baris di bawah kursor Anda dan membukanya di browser default Anda.


1

Ini adalah semacam versi perbaikan dari skrip yang awalnya diusulkan oleh @tungd di sini https://stackoverflow.com/a/9459366/7631731 . Menjaga konteks vim dan menangani dengan benar URL yang berisi "#".

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

Anda harus melihat sekilas plugin vim ini

henrik / vim-open-url

Ini pada dasarnya apa yang telah dijelaskan dalam beberapa tanggapan lain, tetapi konfigurasi khusus diperlukan jika Anda menggunakan pengelola plugin :)


0

Seperti dijelaskan di atas oleh @kev , dimodifikasi untuk lingkungan Linux.

Selain: ketika fungsi ini dijalankan (Vim 8.1) di terminal saya, layar Vim dikaburkan (kebanyakan "kosong;" yaitu, teks ada di sana tetapi tidak terlihat). The :redraw!perintah (lihat https://stackoverflow.com/a/1117742/1904943 ) redraws layar.

Tambahkan ke ~/.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

Ini sederhana, cukup ganti "mulai" dengan apa pun yang digunakan OS Anda

GU untuk go url!

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

0

Solusi untuk orang yang bongkar muat netrw

Ini adalah solusi untuk orang yang menghapus netrw( :help netrw-noload) di vim / neovim. Misalnya, mereka menggunakan pengelola file yang berbeda sepertivim-dirvish

TLDR:

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

atau peta gx:

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


Jadi hanya sedikit dari latar belakang:

Saya sedang mencari solusi untuk masalah ini juga karena saya benar-benar menghapus netrw agar tidak dimuat di vim sepenuhnya dan menggantinya dengan vim-dirvish. Plugin ini memiliki sekitar 500 ~ LOC , dibandingkan dengan netrw's (11.000 LOC) .

Saya tidak banyak menggunakan pengeditan jarak jauh sehingga vim-dirvishcukup kuat untuk mengelola alur kerja saya (Ini sebenarnya lebih cepat dari netrw~ penulis mengklaim 2x, saya merasa ini lebih cepat dari itu - ini benar-benar instan ⚡) sangat berguna pada basis kode / repositori besar. Saya bahkan mencobanya dalam repo file 10K, daftar file -masih instan! Seseorang diuji vim-dirvishterhadapNerdtree , Anda bisa melihat perbedaannya.

Saya turun vim-vinegarjuga karena vim-dirvish memiliki -pengikatan, dan sebagian besar konfigurasi vim-vinegarbersifat netrwspesifik. Itu tidak membutuhkannya. Dua burung dalam satu batu!

Keindahan dari plugin ini adalah menganut filosofi VINE (Vim is not Emacs). Di mana ia memanfaatkan kekuatan program lain di terminal untuk melakukan manipulasi file, alih-alih mencoba melakukan semuanya sendiri. Bagian yang penting adalah seberapa natural program eksternal ini berinteraksi dengan vim. Dan itu dicapai dengan :Shdo, dan itu memiliki kunci yang nyaman .(perintah titik , yang merupakan mnemonik untuk perintah pengulangan), lakukan itu pada kedua pilihan atau baris sebenarnya pada vim-dirvishbuffer. Dan ketik !rmuntuk hapus, !mvuntuk mengganti nama.

Sejak saya menonaktifkan netrw, ( :help netrw-noload) saya menemukan diri saya meraih gxwaktu ke waktu. Saya tidak ingin memuat plugin untuk mendapatkan gxfungsinya kembali.


Sekarang untuk solusinya, ada pengikatan dalam mode perintah, ctrl-rlalu ctrl-a( :help c_CTRL-R_CTRL-A), untuk menempelkan apa pun yang Anda miliki di kursor ke baris perintah, jadi jika Anda menggabungkannya dengan :!xdg-open/ :!open(untuk mac), Anda cukup banyak mengaturnya.

Ada alasan mengapa :wtidak memiliki binding normal. Saya terkejut paling solusi tidak maksimal perintah alur kerja, saya menggunakan ex-perintah banyak, :s, :g, :v, :argdo, :cdo, dan teman-teman. Gabungkan ini dengan mode berbeda, ketuk kekuatan penuh vim. Jadi jangan hanya bertahan dalam satu mode, coba manfaatkan kekuatan penuh vim.

Jadi alur kerja lengkapnya. Meskipun Anda menempatkan kursor di atas url, itu hanya satu langkah: 😊

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

Perhatikan !yang menunjukkan peningkatan kekuatan program eksternal di luar vim. Vine !

Jika Anda ingin gxfungsinya kembali, Anda cukup memetakan menggunakan perintah yang sama:

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

Saya suka membungkam binding saya, jadi menambahkan <silent>dan :silakan melakukan triknya ( :help :map-silent)

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

Catatan tentang program khusus platform untuk membuka url:

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

Saya menggunakan ketiga platform dan mereka bekerja dengan baik. Anda bisa menggunakan salah satunya untuk pengikatan vim Anda, misalnya. :!opendan hanya alias di Anda bashrc/zshrc/fish configyang openperintah untuk program apa pun yang platform-spesifik yang Anda miliki.

misalnya. alias open = wslview

Dengan begitu, saya vimrctetap platform-agnostik, dan saya hanya akan menangani ketidakkonsistenan melalui bashrc/zshrc/fish config.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.