Открыть 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такой мощный, спасибо! Он также открывает файлы с соответствующими приложениями ™.
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 , на всякий случай, если кому-то интересно обсуждение.
Антуан Коттен,

49

Если вы используете Vim 7.4 или новее, в обычном режиме поместите курсор под URL-адресом, затем щелкните gx, URL-адрес откроется в браузере автоматически.демонстрационная работа


как вы устанавливаете браузер в качестве Chrome в этом примере? (или любой другой браузер)
jm3

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

1
немного не по теме, а как скрин в гифку записать? любить это!
Петер Перхач,

@ 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-адреса под курсором. В остальном то же самое.


Я думаю, это укажет мне на решение, которое я ищу в конечном итоге ... плюс эта функция станет очень удобной. Спасибо!
Мауро Моралес

2

Добавьте следующую строку в файл .vimrc:

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

Таким образом, в обычном режиме нажатие клавиши \ выбирает текущее слово и открывает его как адрес в веб-браузере.

Лидером по умолчанию является \ (но я сопоставил его с помощью let mapleader = ","). Точно так же, используя imap, вы можете отобразить некоторую последовательность клавиш в режиме вставки (но тогда, если это 2-клавишная последовательность, она, вероятно, переопределит некоторое поведение по умолчанию).


2

Это своего рода улучшенная версия сценария, первоначально предложенного @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>¬

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 Я рекомендую делать это через все удивительном Возбудитель плагин , а затем просто 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. Он должен прочитать строку под вашим курсором и открыть ее в браузере по умолчанию.


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

Это просто, просто замените "start" на то, что использует ваша ОС.

ГУ для 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

TL; DR:

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

или карту gx:

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


Итак, немного предыстории:

Я тоже искал решение этой проблемы, так как фактически полностью удалил netrw из загрузки в vim и заменил его на vim-dirvish. Этот плагин имеет около 500 ~ LOC по сравнению netrwс (11000+ LOC) .

Я не использую удаленное редактирование, поэтому vim-dirvishон достаточно мощный, чтобы управлять моим рабочим процессом (на самом деле он быстрее, чем netrw~ автор утверждает в 2 раза, я чувствую, что это быстрее - это действительно мгновенно ⚡), очень полезно для больших кодовых баз / репозиториев. Я даже попробовал это в репозитории файлов размером 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

Я использую все три платформы, и они отлично работают. Вы можете просто использовать один из них для своих привязок vim, например. :!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.