Відкрийте URL-адресу під курсором у Vim за допомогою браузера


104

Я вперше використовую Twitvim. Переглядаючи всі URL-адреси, які там знаходяться, змусило мене замислитися, чи є можливість відкрити URL-адресу під курсором у вашому улюбленому браузері чи вказаному?


під текстовим курсором чи курсором миші?
Олег Міхеєв

текстовий курсор ... але якщо ви знаєте спосіб зробити під курсором миші, це теж було б круто
Мауро Моралес

1
клацання середньої кнопки миші на посилання в vim завжди працювало на мене, я не знаю як, але
Олег Міхеєв,

2
середнє клацання для відкриття, ймовірно, є функцією терміналу, а не vim.
Леонід Шевцов

Відповіді:


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 або "шлях до веб-браузера" для Windows


Я думаю, я буду використовувати ваше рішення :) дякую ... Я хотів би побачити, чи є спосіб отримати лише URL під курсором, але не знаю багато vimscript, тому мені доведеться працювати над цим .
Мауро Моралес

14
gxтака потужна, дякую! Він також відкриває файли з відповідними програмами ™.
блін

Я думаю, що це g: netrw_browsex_viewer (з / п 'r')
Джек

2
Мені подобається відкривати URL з? і # в ньому. Я думаю, що netrw використовує cfile замість cWORD зараз, тому URL-адреси з '?' більше не можна відкрити за допомогою цього методу. Я спробував ваше рішення тут, і "#" в URL-адресі буде замінено на ім'я альтернативного файлу. exec "! open" .shellescape (uri, 1), здається, вирішив проблему.
Чад Скітер

4
Вищезгаданий твіт тут: twitter.com/tpope/status/289234166770434048 , про всяк випадок, коли когось зацікавить дискусія.
Антуан Коттен

49

Якщо ви використовуєте Vim 7.4 або новішу версію, у звичайному режимі поставте курсор нижче URL-адреси, а потім клацніть gx, URL-адреса відкриється в браузері автоматичнодемо-операція


як у цьому прикладі ви налаштовуєте браузер на Chrome? (або будь-який браузер, який є)
jm3

@ jm3 Спробуйте :h netrw_gx: * для Windows 32 або 64 використовуються клітини url та FileProtocolHandler. * для Gnome (з gnome-open): використовується gnome-open. * для KDE (з kfmclient): kfmclient використовується * для Mac OS X: використовується open. * інакше використовується плагін netrwFileHandler.
kba стоїть з Монікою

1
трохи поза темою, але як записати екран у gif? любити це!
Пітер Пергач

@ jm3 Який веб-браузер за замовчуванням використовує систему
jsvisa

3
@ PeterPerháč Я використовую github.com/keycastr/keycastr для запису введення з клавіатури, cockos.com/licecap для запису екрана як gif
jsvisa

9

Я використовую цей скрипт для пошуку в Google 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 під курсором. Решта ж.


Я думаю, що це вкаже мене на рішення, яке я шукаю в кінцевому підсумку ... плюс ця функція стане дуже зручною. Дякую!
Мауро Моралес

2

Додайте наступний рядок у файл .vimrc:

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

Тож у звичайному режимі натискаючи \, він вибирає поточне слово та відкриває його як адресу у веб-браузері.

Лідер за замовчуванням - \ (але я відобразив його з, за ​​допомогою let mapleader = ","). Аналогічно, за допомогою Imap ви можете зіставити деяку послідовність клавіш у режимі вставки (але тоді, якщо це 2 послідовності клавіш, це, ймовірно, переможе деяку поведінку за замовчуванням).


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 у vim, я рекомендую зробити це через постійно приголомшливий плагін 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. Створіть кілька відображень vim, щоб ви могли швидко отримати рядок під курсором у браузері. Я б переказав це на u (для мене це так,u звичайному режимі). Ось як:

    nnoremap u: exec "Відкрити" .getline (".")

Щоб скористатися цим відображенням, введіть клавішу Leader у звичайному режимі + 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

Це просто, просто замініть "старт" тим, що використовує ваша ОС

GU для 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 повністю і замінив його vim-dirvish. Цей плагін має близько 500 ~ LOC , порівняно з netrw's (11,000+ LOC) .

Я не використовую віддалене редагування, настільки vim-dirvishдостатньо потужний, щоб керувати своїм робочим процесом (це насправді швидше, ніж netrw~ автор стверджує, що 2x, я вважаю, що це швидше, ніж це - це справді миттєвий ⚡), дуже корисний для великих кодових баз даних / сховищ. Я навіть спробував це у 10-кілограмовому репо-файлі, перелічуючи файли через -ще миттєвий! Хтось протестував vim-dirvishпроти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немає нормальних прив’язок. Я здивований самим рішення не команда робочого важеля, я використовую екс-команди багато, :s, :g, :v, :argdo, :cdo, і друзі. Поєднуючи це в різних режимах, ви використовуєте всю потужність vim. Тому не залишайтеся лише в одному режимі, намагайтеся використовувати всю силу vim.

Отже, повний робочий процес. Хоча курсор у верхній частині URL-адреси, це лише один крок: 😊

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

Я використовую всі три платформи, і вони чудово працюють. Ви можете просто використовувати одну з них для прив'язки вім, наприклад. :!openі просто псевдонім у вашій bashrc/zshrc/fish configКНИЗІopen команді на будь-якій платформі конкретної програми у вас є.

напр. alias open = wslview

Таким чином, мій vimrcзалишається платформою-агностиком, і я просто вирішу невідповідності через bashrc/zshrc/fish config.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.