Mở URL dưới con trỏ trong Vim bằng trình duyệt


103

Tôi đang sử dụng Twitvim lần đầu tiên. Nhìn thấy tất cả các URL trong đó khiến tôi tự hỏi, có cách nào để mở URL dưới con trỏ trong trình duyệt yêu thích của bạn hoặc một trình duyệt cụ thể không?


dưới con trỏ văn bản hay con trỏ chuột?
Oleg Mikheev

con trỏ văn bản ... nhưng nếu bạn biết một cách để làm điều dưới con trỏ chuột mà sẽ được mát mẻ quá
Mauro Morales

1
chuột giữa nút nhấp chuột vào liên kết trong vim đã luôn luôn làm việc cho tôi, tôi không biết làm thế nào, mặc dù
Oleg MIKHEEV

2
nhấp chuột giữa để mở có thể là một tính năng của thiết bị đầu cuối, không phải vim.
Leonid Shevtsov

Câu trả lời:


188

Cập nhật: từ tweet của tpope ngày hôm nay

Nhấn gx. Bạn có thể tùy chỉnh trình duyệt. Trên Gnome và Mac OS X, nó đã được sử dụng gnome-open/ open. Nói chung, bạn có thể đặt g:netrw_browsex_viewerthành bất kỳ thứ gì bạn muốn.


Câu trả lời ban đầu:

Không nhớ tôi lấy chức năng này ở đâu. Có một lỗi với hash (#) trong url, nhưng chức năng hoạt động đủ tốt nên tôi sẽ không bận tâm sửa nó.

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>

Lưu ý: Nếu bạn không sử dụng Mac, hãy sử dụng gnome-open/ xdg-opencho Linux hoặc 'đường dẫn đến trình duyệt web của bạn' cho Windows


Tôi nghĩ tôi sẽ sử dụng giải pháp của bạn :) cảm ơn ... Tôi muốn xem có cách nào để chỉ lấy url dưới con trỏ, nhưng không biết nhiều về vimscript nên tôi sẽ phải làm việc đó .
Mauro Morales

14
gxrất mạnh mẽ, cảm ơn! Nó cũng mở các tập tin với các ứng dụng thích hợp ™.
nhấp nháy

Tôi nghĩ đó là g: netrw_browsex_viewer (w / o 'r')
Jack

2
Tôi muốn mở một url bằng? và một dấu # trong đó. Tôi nghĩ bây giờ netrw đang sử dụng cfile thay vì cWORD, vì vậy url có '?' không thể mở được nữa bằng cách sử dụng phương pháp đó. Tôi đã thử giải pháp của bạn ở đây và '#' trong url sẽ được thay thế bằng tên tệp thay thế. executive "! open" .shellescape (uri, 1) dường như đã khắc phục được sự cố.
Chad Skeeters

4
Tweet nói trên ở đây: twitter.com/tpope/status/289234166770434048 , đề phòng có ai quan tâm đến cuộc thảo luận.
Antoine Cotten

49

Nếu bạn đang sử dụng Vim 7.4 trở lên, ở chế độ bình thường, hãy đặt con trỏ bên dưới URL, sau đó nhấp vào gx, URL sẽ tự động được mở trong trình duyệthoạt động demo


Làm thế nào để bạn đặt trình duyệt là Chrome trong ví dụ này? (hoặc bất kỳ trình duyệt đó là)
jm3

@ jm3 Hãy thử :h netrw_gx: * đối với Windows 32 hoặc 64, url và tệp FileProtocolHandler được sử dụng. * đối với Gnome (với gnome-open): gnome-open được sử dụng. * cho KDE (với kfmclient): kfmclient được sử dụng * cho Mac OS X: mở được sử dụng. * nếu không, plugin netrwFileHandler được sử dụng.
kba đứng với Monica

1
lạc chủ đề một chút, nhưng làm thế nào để bạn ghi lại màn hình thành ảnh gif? yêu nó!
Peter Perháč

@ jm3 Sử dụng trình duyệt web mặc định của Hệ thống
jsvisa 16/02/17

3
@ PeterPerháč Tôi đang sử dụng github.com/keycastr/keycastr để ghi dữ liệu nhập từ Bàn phím, cockos.com/licecap để ghi lại màn hình dưới dạng gif
jsvisa 16/02/17

9

Tôi sử dụng tập lệnh này để tìm kiếm trên gooogle keyworddưới con trỏ:

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

Bạn nên sử dụng getline('.')matchstr()trích xuất url dưới con trỏ. Phần còn lại là như nhau.


Tôi nghĩ rằng điều này sẽ chỉ cho tôi giải pháp mà tôi đang tìm kiếm cuối cùng ... cộng với chức năng này sẽ trở nên rất tiện dụng. Cảm ơn!
Mauro Morales

2

Thêm dòng sau vào tệp .vimrc:

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

Vì vậy, ở chế độ bình thường, nó nhấn \ nó chọn từ hiện tại và mở nó làm địa chỉ trong trình duyệt web.

Lãnh đạo theo mặc định là \ (nhưng tôi đã ánh xạ nó tới, với let mapleader = ","). Tương tự, sử dụng imap, bạn có thể ánh xạ một số chuỗi khóa trong chế độ chèn (nhưng sau đó, nếu đó là chuỗi 2 khóa, nó có thể sẽ ghi đè một số hành vi mặc định).


1

Được rồi, bằng cách sử dụng các câu trả lời từ @tungd và @kev và một nghiên cứu nhỏ, tôi đã kết thúc với tập lệnh này, nó hoạt động theo cách tôi cần. Giống như @tungd đã nói # có thể gây ra vấn đề nếu bên trong một url nhưng tôi rất tuyệt với điều đó, nếu bất kỳ ai có biểu hiện tốt hơn cho url thì nó sẽ được hoan nghênh.

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

Tôi đến với bữa tiệc này khá muộn, nhưng đây là một cách khác để thực hiện việc này đặc biệt hiệu quả trên Windows 7.

  1. Cài đặt cả vim-shellvim-misc trong vim Tôi khuyên bạn nên thực hiện việc này thông qua plugin Pathogen tuyệt vời và sau đó chỉ cần cd ~/vimfiles/bundle & git clone git@github.com:xolox/vim-misc.git & git clone git@github.com:xolox/vim-shell.gittừ msysgit. ( Hai plugin này mở url trong trình duyệt mặc định của bạn mà không cần tạo thêm bất kỳ lời nhắc lệnh nào hoặc những thứ vô nghĩa ngớ ngẩn khác thường được yêu cầu trong windows. Bạn có thể mở url trong Vim như thế này:. :Open http://duckduckgo.comHãy thử. Bạn sẽ thích nó. )

  2. Tạo một số ánh xạ vim để bạn có thể nhanh chóng đưa dòng dưới con trỏ vào trình duyệt. Tôi sẽ ánh xạ điều này với bạn (đối với tôi, đó là ,utừ chế độ bình thường). Đây là cách thực hiện:

    nnoremap u: execute "Mở" .getline (".")

Để sử dụng ánh xạ này, hãy nhập phím Lãnh đạo của bạn từ chế độ bình thường + u. Nó sẽ đọc dòng dưới con trỏ của bạn và mở nó trong trình duyệt mặc định của bạn.


1

Đây là một loại phiên bản cải tiến của tập lệnh do @tungd đề xuất ban đầu tại đây https://stackoverflow.com/a/9459366/7631731 . Giữ ngữ cảnh vim và xử lý chính xác các URL có chứa "#".

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

Bạn nên xem nhanh plugin vim này

henrik / vim-open-url

Về cơ bản đó là những gì đã được giải thích trong một số câu trả lời khác, nhưng cần có cấu hình cụ thể nếu bạn sử dụng trình quản lý plugin :)


0

Như được mô tả ở trên bởi @kev , được sửa đổi cho môi trường Linux.

Ngoài ra: khi chức năng này được thực thi (Vim 8.1) trong thiết bị đầu cuối của tôi, màn hình Vim bị xáo trộn (chủ yếu là "trống;" tức là văn bản ở đó nhưng không hiển thị). Các :redraw!lệnh (xem https://stackoverflow.com/a/1117742/1904943 ) vẽ lại màn hình.

Thêm vào ~/.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

Điều này rất đơn giản, chỉ cần thay thế "start" bằng bất cứ thứ gì hệ điều hành của bạn sử dụng

Url GU cho go!

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

0

Giải pháp cho những người không tải netrw

Đây là một giải pháp cho những người đã loại bỏ netrw( :help netrw-noload) trong vim / neovim. Ví dụ: họ sử dụng một trình quản lý tệp khác nhưvim-dirvish

TLDR:

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

hoặc bản đồ gx:

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


Vì vậy, chỉ một chút nền tảng:

Tôi cũng đang tìm kiếm giải pháp cho vấn đề này vì tôi đã thực sự xóa netrw khỏi tải trong vim hoàn toàn và thay thế nó bằng vim-dirvish. Plugin này có khoảng 500 ~ LOC , so với netrwcủa (11.000+ LOC) .

Tôi không sử dụng chỉnh sửa từ xa nhiều nên vim-dirvishnó đủ mạnh để quản lý quy trình làm việc của tôi (Nó thực sự nhanh hơn netrw~ tác giả tuyên bố gấp 2 lần, tôi cảm thấy nó nhanh hơn thế - nó thực sự tức thời ⚡) rất hữu ích trên các kho / kho codebase lớn. Tôi thậm chí đã thử nó trong kho lưu trữ tệp 10K, liệt kê các tệp qua -vẫn ngay lập tức! Ai đó đã thử nghiệm vim-dirvishchống lạiNerdtree , bạn có thể thấy sự khác biệt.

Tôi cũng bỏ qua vim-vinegar-dù sao thì vim-dirvish cũng có ràng buộc và hầu hết cấu hình của vim-vinegarnetrw chi tiết cụ thể. Nó chỉ là không cần nó. Hai con chim trong một hòn đá!

Vẻ đẹp của plugin này là nó bao hàm triết lý của VINE (Vim không phải là Emacs). Nơi nó tận dụng sức mạnh của các chương trình khác trong thiết bị đầu cuối để thực hiện các thao tác trên tệp, thay vì cố gắng tự làm mọi thứ. Phần quan trọng là các chương trình bên ngoài này tương tác với vim tự nhiên như thế nào. Và điều đó đạt được bằng cách :Shdo, và nó có một phím thuận tiện là .(lệnh dấu chấm , là cách ghi nhớ của lệnh lặp lại), thực hiện điều đó trên cả vùng chọn hoặc dòng thực trên vim-dirvishbộ đệm. Và gõ !rmđể loại bỏ, !mvđể đổi tên.

Vì tôi vô hiệu hóa netrw, ( :help netrw-noload) tôi thấy mình đã đạt gxđến thời gian. Tôi không muốn tải một plugin để lấy gxlại chức năng.


Bây giờ đối với giải pháp, có một ràng buộc trong chế độ lệnh, ctrl-rsau đó ctrl-a( :help c_CTRL-R_CTRL-A), để dán bất kỳ thứ gì bạn có trong con trỏ của mình vào dòng lệnh, vì vậy nếu bạn kết hợp nó với :!xdg-open/:!open (đối với mac), bạn đã đặt khá nhiều.

Có một lý do tại sao :wkhông có ràng buộc bình thường. Tôi ngạc nhiên nhất giải pháp không đòn bẩy lệnh công việc, tôi sử dụng cựu chỉ huy rất nhiều, :s, :g, :v, :argdo, :cdo, và bạn bè. Kết hợp điều này với các chế độ khác nhau, khai thác toàn bộ sức mạnh của vim. Vì vậy, đừng chỉ ở trong một chế độ, hãy cố gắng tận dụng toàn bộ sức mạnh của khí lực.

Vì vậy, quy trình làm việc đầy đủ. Mặc dù bạn có con trỏ ở trên cùng của url, nhưng chỉ cần thực hiện một bước duy nhất: 😊

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

Lưu ý !điều đó chỉ ra việc tận dụng sức mạnh của các chương trình bên ngoài bên ngoài vim. CÂY NHO !

Nếu bạn muốn gxchức năng trở lại, bạn chỉ có thể ánh xạ bằng lệnh tương tự:

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

Tôi thích im lặng các ràng buộc của mình, vì vậy việc thêm <silent>:silsẽ thực hiện thủ thuật ( :help :map-silent)

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

Lưu ý về các chương trình dành riêng cho nền tảng để mở url:

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

Tôi sử dụng cả ba nền tảng và chúng hoạt động tuyệt vời. Bạn chỉ có thể sử dụng một trong số chúng cho các ràng buộc vim của mình, ví dụ. :!openvà chỉ bí danh trong bạn bashrc/zshrc/fish configcác openlệnh để bất cứ chương trình nền tảng cụ thể mà bạn có.

ví dụ. alias open = wslview

Bằng cách đó, tôi vimrcvẫn là nền tảng bất khả tri và tôi sẽ chỉ giải quyết những mâu thuẫn thông qua bashrc/zshrc/fish config.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.