เปิด URL ภายใต้เคอร์เซอร์ใน Vim ด้วยเบราว์เซอร์


104

ฉันใช้ Twitvim เป็นครั้งแรก การเห็น URL ทั้งหมดในนั้นทำให้ฉันสงสัยว่ามีวิธีใดในการเปิด URL ภายใต้เคอร์เซอร์ในเบราว์เซอร์ที่คุณชื่นชอบหรือที่ระบุไว้หรือไม่?


ใต้เคอร์เซอร์ข้อความหรือเคอร์เซอร์เมาส์?
Oleg Mikheev

เคอร์เซอร์ข้อความ ... แต่ถ้าคุณรู้วิธีที่จะทำภายใต้เคอร์เซอร์ของเมาส์ที่จะเย็นเกินไป
Mauro Morales

1
การคลิกปุ่มกลางของเมาส์บนลิงค์ในกลุ่มใช้งานได้ตลอดเวลาสำหรับฉันฉันไม่รู้ว่า
Oleg Mikheev

2
การคลิกกลางเพื่อเปิดน่าจะเป็นคุณสมบัติของเทอร์มินัลไม่ใช่กลุ่ม
Leonid Shevtsov

คำตอบ:


189

อัปเดต: จากทวีตของ 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 ให้ใช้gnome-open/ xdg-openสำหรับ Linux หรือ "path to your web browser" สำหรับ Windows


ฉันคิดว่าฉันจะใช้วิธีแก้ปัญหาของคุณ :) ขอบคุณ ... ฉันต้องการดูว่ามีวิธีรับเฉพาะ url ใต้เคอร์เซอร์หรือไม่ แต่ไม่รู้ vimscript มากดังนั้นฉันจะต้องดำเนินการต่อ .
Mauro Morales

14
gxมีพลังมากขอบคุณ! นอกจากนี้ยังเปิดไฟล์ด้วยแอพพลิเคชั่นที่เหมาะสม
blinry

ฉันคิดว่ามันเป็น g: netrw_browsex_viewer (w / o 'r')
แจ็ค

2
ฉันต้องการเปิด url ด้วย? และมี # อยู่ในนั้น ฉันคิดว่า netrw กำลังใช้ cfile แทน cWORD ดังนั้น url ด้วย '?' ไม่สามารถเปิดได้อีกต่อไปโดยใช้วิธีการนั้น ฉันลองวิธีแก้ปัญหาของคุณที่นี่และ '#' ใน url จะถูกแทนที่ด้วยชื่อไฟล์ทางเลือก exec "! open" .shellescape (uri, 1) ดูเหมือนจะแก้ไขปัญหาได้แล้ว
Chad Skeeters

4
ทวีตดังกล่าวอยู่ที่นี่: twitter.com/tpope/status/289234166770434048ในกรณีที่ใครก็ตามที่สนใจในการสนทนา
Antoine Cotten

49

หากคุณใช้ Vim 7.4 หรือใหม่กว่าในโหมดปกติให้วางเคอร์เซอร์ไว้ด้านล่าง URL จากนั้นคลิกgxURL จะเปิดในเบราว์เซอร์โดยอัตโนมัติสาธิตการใช้งาน


คุณตั้งค่าเบราว์เซอร์ให้เป็น Chrome ในตัวอย่างนี้ได้อย่างไร (หรือเบราว์เซอร์อะไรก็ได้)
jm3

@ 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 ยืนคู่กับ Monica

1
ออกหัวข้อเล็กน้อย แต่คุณจะบันทึกหน้าจอเป็น gif ได้อย่างไร? รักเลย!
Peter Perháč

@ jm3 ซึ่งใช้เว็บเบราว์เซอร์เริ่มต้นของระบบ
jsvisa

3
@ PeterPerháčฉันใช้github.com/keycastr/keycastrในการบันทึกอินพุตคีย์บอร์ด, cockos.com/licecapเพื่อบันทึกหน้าจอเป็น gif
jsvisa

9

ฉันใช้สคริปต์นี้เพื่อค้นหา gooogle 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()แยก url ใต้เคอร์เซอร์ ส่วนที่เหลือก็เช่นเดียวกัน


ฉันคิดว่านี่จะชี้ให้ฉันเห็นทางออกที่ฉันกำลังมองหาในที่สุด ... บวกกับฟังก์ชันนี้จะมีประโยชน์มาก ขอบคุณ!
Mauro Morales

2

เพิ่มบรรทัดต่อไปนี้ในไฟล์. vimrc:

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

ดังนั้นในโหมดปกติการกด \ มันจะเลือกคำปัจจุบันและเปิดเป็นที่อยู่ในเว็บเบราว์เซอร์

ผู้นำโดยค่าเริ่มต้นคือ \ (แต่ฉันได้จับคู่กับlet mapleader = ",") ในทำนองเดียวกันการใช้ imap คุณสามารถแมปลำดับคีย์บางส่วนในโหมดแทรกได้ (แต่ถ้าเป็นลำดับคีย์ 2 ลำดับอาจจะแทนที่พฤติกรรมเริ่มต้นบางอย่าง)


2

นี่คือการจัดเรียงของรุ่นปรับปรุงของสคริปต์เดิมที่เสนอโดย @tungd นี่https://stackoverflow.com/a/9459366/7631731 เก็บบริบทเป็นกลุ่มและจัดการ 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>¬

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-shellและvim-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 คุณสามารถเปิด url ใน Vim ได้ดังนี้: :Open http://duckduckgo.comลองดูสิคุณจะชอบ )

  2. สร้างการแมปเป็นกลุ่มเพื่อให้คุณสามารถดึงเส้นใต้เคอร์เซอร์เข้าสู่เบราว์เซอร์ได้อย่างรวดเร็ว ฉันจะจับคู่สิ่งนี้กับคุณ (สำหรับฉันนั่นคือ,uจากโหมดปกติ) วิธีการมีดังนี้

    nnoremap u: exec "เปิด" .getline (".")

หากต้องการใช้การแมปนี้ให้พิมพ์คีย์ผู้นำของคุณจากโหมดปกติ + u ควรอ่านบรรทัดใต้เคอร์เซอร์และเปิดในเบราว์เซอร์เริ่มต้นของคุณ


0

คุณควรดูปลั๊กอินกลุ่มนี้อย่างรวดเร็ว

henrik / vim-open-url

โดยพื้นฐานแล้วสิ่งที่ได้อธิบายไว้ในคำตอบอื่น ๆ แต่จำเป็นต้องกำหนดค่าเฉพาะหากคุณใช้ตัวจัดการปลั๊กอิน :)


0

ตามที่@kev อธิบายไว้ข้างต้นแก้ไขสำหรับสภาพแวดล้อม Linux

นอกเหนือจาก: เมื่อเรียกใช้ฟังก์ชันนี้ (Vim 8.1) ในเทอร์มินัลของฉันหน้าจอ Vim จะสับสน (ส่วนใหญ่เป็น "blanked;" กล่าวคือข้อความอยู่ที่นั่น แต่มองไม่เห็น) :redraw!คำสั่ง (ดูhttps://stackoverflow.com/a/1117742/1904943 ) redraws หน้าจอ

เพิ่มใน~/.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 สำหรับgo url!

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

0

วิธีแก้ปัญหาสำหรับผู้ที่ขนถ่าย netrw

นี่เป็นวิธีแก้ปัญหาสำหรับผู้ที่ลบnetrw( :help netrw-noload) ใน vim / neovim ตัวอย่างเช่นพวกเขาใช้โปรแกรมจัดการไฟล์อื่นเช่นvim-dirvish

TLDR:

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

หรือแผนที่gx:

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


พื้นหลังเพียงเล็กน้อย:

ฉันกำลังค้นหาวิธีแก้ปัญหานี้เช่นกันเนื่องจากฉันลบ netrw ออกจากการโหลดเป็นกลุ่มอย่างสมบูรณ์และแทนที่ด้วยvim-dirvish. ปลั๊กอินนี้จะมีประมาณ500 ~ LOCเมื่อเทียบกับnetrw's (11,000 LOC)

ฉันไม่ได้ใช้การแก้ไขจากระยะไกลมากนักดังนั้นจึงvim-dirvishมีประสิทธิภาพมากพอที่จะจัดการเวิร์กโฟลว์ของฉัน (จริง ๆ แล้วเร็วกว่าnetrw~ ผู้เขียนอ้างว่า 2x ฉันรู้สึกว่ามันเร็วกว่านั้น - มันเป็นแบบทันที ⚡) มีประโยชน์มากใน codebase / ที่เก็บขนาดใหญ่ ฉันได้ลองใช้ใน repo ไฟล์ 10K รายการไฟล์ผ่าน-ยังคงทันที! ใครบางคนที่ผ่านการทดสอบvim-dirvishกับNerdtreeคุณสามารถเห็นความแตกต่าง

ฉันลดลงvim-vinegarเช่นกันเพราะ vim-dirvish มีการ-ผูกอยู่แล้วและการกำหนดค่าส่วนใหญ่vim-vinegarเป็นnetrwข้อมูลเฉพาะ มันไม่จำเป็นต้องใช้ นกสองตัวในก้อนหิน!

ความงามของปลั๊กอินนี้เป็นการรวบรวมปรัชญาของVINE (Vim ไม่ใช่ Emacs) โดยใช้ประโยชน์จากพลังของโปรแกรมอื่น ๆ ในเทอร์มินัลเพื่อทำการจัดการไฟล์แทนที่จะพยายามทำทุกอย่างด้วยตัวเอง ส่วนที่สำคัญคือวิธีที่โปรแกรมภายนอกเหล่านี้โต้ตอบกับกลุ่ม และนั่นคือบรรลุโดย:Shdoและมีคีย์ที่สะดวกของ.(คำสั่ง dotซึ่งเป็นหน่วยความจำสำหรับคำสั่งทำซ้ำ) ให้ทำทั้งสองรายการหรือบรรทัดจริงบน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, และเพื่อน ๆ เมื่อรวมสิ่งนี้กับโหมดต่างๆเข้าด้วยกันจะทำให้พลังเต็มเปี่ยมของกลุ่ม ดังนั้นอย่าอยู่ในโหมดเดียวพยายามใช้พลังเต็มที่ของกลุ่ม

ดังนั้นขั้นตอนการทำงานเต็มรูปแบบ แม้ว่าคุณจะมีเคอร์เซอร์อยู่ด้านบนของ url แต่ก็ทำได้เพียงขั้นตอนเดียว: 😊

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

สังเกตสิ่ง!ที่ระบุถึงการใช้ประโยชน์จากพลังของโปรแกรมภายนอกภายนอกกลุ่มองุ่น !

หากคุณต้องการให้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

ฉันใช้ทั้งสามแพลตฟอร์มและทำงานได้ดี คุณสามารถใช้หนึ่งในนั้นสำหรับการรวมกลุ่มของคุณเช่น :!openและนามแฝงของคุณเพียงแค่ในคำสั่งเพื่อสิ่งที่โปรแกรมเฉพาะแพลตฟอร์มที่คุณมีbashrc/zshrc/fish configopen

เช่น. alias open = wslview

ด้วยวิธีนี้ฉันvimrcจะไม่เชื่อเรื่องพระเจ้าของแพลตฟอร์มและฉันจะจัดการกับความไม่สอดคล้องกันผ่านทางbashrc/zshrc/fish config.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.