Открыть 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.

Tungd
источник
Думаю, я воспользуюсь вашим решением :) спасибо ... Я бы хотел посмотреть, есть ли способ получить только 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-адрес откроется в браузере автоматически.демонстрационная работа

jsvisa
источник
как вы устанавливаете браузер в качестве 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

Это в основном то, что было объяснено в некоторых других ответах, но требуется конкретная конфигурация, если вы используете диспетчер плагинов :)

MoOx
источник
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.

Chriz
источник