Abra o URL sob o cursor no Vim com o navegador

104

Estou usando o Twitvim pela primeira vez. Ver todos os URLs lá me fez pensar, há alguma maneira de abrir o URL sob o cursor em seu navegador favorito ou em um especificado?

Mauro Morales
fonte
sob o cursor de texto ou cursor do mouse?
Oleg Mikheev
cursor de texto ... mas se você souber uma maneira de fazer sob o cursor do mouse, isso seria legal também
Mauro Morales
1
clicar com o botão do meio do mouse em um link no vim sempre funcionou para mim, mas não sei como
Oleg Mikheev
2
clique com o botão do meio para abrir é provavelmente um recurso do terminal, não do vim.
Leonid Shevtsov

Respostas:

189

Atualizado: do tweet de tpope hoje

Pressione gx. Você pode personalizar o navegador. No Gnome e no Mac OS X ele já usa gnome-open/ open. Geralmente você pode definirg:netrw_browsex_viewer que quiser.


Resposta original:

Não me lembro de onde obtive essa função. Há um bug com hash (#) na url, mas a função funciona bem o suficiente para que não me preocupe em corrigi-la.

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>

Nota: Se você não estiver no Mac, use gnome-open/ xdg-openpara Linux ou 'caminho para seu navegador da web' para Windows

Tungd
fonte
Acho que vou usar sua solução :) obrigado ... Gostaria de ver se há uma maneira de colocar apenas o url sob o cursor, mas não conheço muito vimscript, então terei que trabalhar nisso .
Mauro Morales
14
gxé tão poderoso, obrigado! Ele também abre arquivos com os aplicativos apropriados ™.
blinry
Eu acho que é g: netrw_browsex_viewer (sem 'r')
Jack
2
Gosto de abrir um url com um? e um # nele. Eu acho que netrw está usando cfile em vez de cWORD agora, então urls com '?' não podem mais ser abertos usando esse método. Tentei sua solução aqui e '#' no url seria substituído pelo nome de arquivo alternativo. exec "! open" .shellescape (uri, 1) parece ter corrigido o problema.
Chad Skeeters
4
O referido tweet está aqui: twitter.com/tpope/status/289234166770434048 , caso alguém esteja interessado na discussão.
Antoine Cotten de
49

Se você estiver usando o Vim 7.4 ou posterior, no modo normal, coloque o cursor abaixo da URL e clique em gx, a URL será aberta no navegador automáticodemo operar

jsvisa
fonte
como você está configurando o navegador para ser Chrome neste exemplo? (ou qualquer navegador que seja)
jm3
@ jm3 Experimente :h netrw_gx: * para Windows 32 ou 64, o url e as DLLs de FileProtocolHandler são usados. * para Gnome (com gnome-open): gnome-open é usado. * para KDE (com kfmclient): kfmclient é usado * para Mac OS X: aberto é usado. * caso contrário, o plug-in netrwFileHandler é usado.
kba está com Monica
1
um pouco fora do assunto, mas como gravar a tela em um GIF? adoro!
Peter Perháč de
@ jm3 Que usando o navegador da web padrão do sistema
jsvisa
3
@ PeterPerháč Estou usando github.com/keycastr/keycastr para gravar a entrada do teclado, cockos.com/licecap para gravar a tela como GIF
jsvisa
9

Eu uso este script para pesquisar keywordsob o cursor no Gooogle :

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

Você deve usar getline('.')e matchstr()para extrair url sob o cursor. O resto é o mesmo.

kev
fonte
Acho que isso vai me apontar para a solução que estou procurando ... além disso, essa função se tornará muito útil. Obrigado!
Mauro Morales
2

Adicione a seguinte linha ao arquivo .vimrc:

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

Então, no modo normal, pressione \ para selecionar a palavra atual e abri-la como endereço no navegador da web.

O líder por padrão é \ (mas eu mapeei para, com let mapleader = ","). Da mesma forma, usando o imap, você pode mapear algumas sequências de teclas no modo de inserção (mas, se for uma sequência de 2 teclas, provavelmente substituirá algum comportamento padrão).

Valdis
fonte
1

Ok, então, usando as respostas de @tungd e @kev e um pouco de pesquisa, acabei com este script, que funciona do jeito que eu preciso. Como @tungd disse o # pode dar um problema se estiver dentro de uma url mas estou bem com isso, se alguém tiver uma expressão melhor para a url será bem-vindo.

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>
Mauro Morales
fonte
1

Estou muito atrasado para esta festa, mas aqui está outra maneira de fazer isso que funciona especialmente bem no Windows 7.

  1. Instale o vim-shell e o vim-misc no vim . Recomendo fazer isso por meio do incrível plugin Pathogen e simplesmente a cd ~/vimfiles/bundle & git clone [email protected]:xolox/vim-misc.git & git clone [email protected]:xolox/vim-shell.gitpartir do msysgit. ( Esses dois plug-ins abrem urls em seu navegador padrão sem criar qualquer prompt de comando extra ou outras bobagens absurdas geralmente exigidas no Windows. Você pode abrir urls no Vim assim:. :Open http://duckduckgo.comExperimente. Você vai gostar. )

  2. Crie alguns mapeamentos de vim para que você possa colocar rapidamente a linha sob o cursor no navegador. Eu mapearia isso para u (para mim, isso é ,udo modo normal). Veja como:

    nnoremap u: exec "Abrir" .getline (".")

Para usar este mapeamento, digite sua chave Leader no modo normal + u. Ele deve ler a linha sob o cursor e abri-lo no navegador padrão.

Rustavore
fonte
1

Esta é uma espécie de versão aprimorada do script originalmente proposto por @tungd aqui https://stackoverflow.com/a/9459366/7631731 . Mantém o contexto do vim e lida corretamente com URLs contendo "#".

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>¬
pappix
fonte
0

Você deve dar uma olhada rápida neste plugin vim

henrik / vim-open-url

É basicamente o que foi explicado em algumas outras respostas, mas é necessária uma configuração específica se você usar um gerenciador de plug-ins :)

MoOx
fonte
0

Conforme descrito acima por @kev , modificado para ambientes Linux.

À parte: quando esta função foi executada (Vim 8.1) no meu terminal, a tela do Vim foi ofuscada (principalmente "em branco;" ou seja, o texto estava lá, mas não visível). O :redraw!comando (consulte https://stackoverflow.com/a/1117742/1904943 ) redesenha a tela.

Adicionar a ~/.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

Victoria Stuart
fonte
0

Isso é simples, basta substituir "start" por qualquer que seja o seu sistema operacional

GU para ir url!

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

Solução para pessoas que descarregaram netrw

Esta é uma solução para pessoas que removeram netrw( :help netrw-noload) no vim / neovim. Por exemplo, eles usam um gerenciador de arquivos diferente, comovim-dirvish

TLDR:

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

ou mapa gx:

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


Então, apenas um pouco de contexto:

Eu também estava procurando por uma solução para este problema, já que removi completamente o netrw de ser carregado no vim e o substituí por vim-dirvish. Este plugin tem cerca de 500 ~ LOC , em comparação com netrwo de (11.000+ LOC) .

Eu não uso muito a edição remota, então vim-dirvishé poderosa o suficiente para gerenciar meu fluxo de trabalho (é realmente mais rápido do que netrw~ o autor afirma 2x, eu sinto que é mais rápido do que isso - é realmente instantâneo ⚡) muito útil em grandes bases de código / repositórios. Eu até tentei em um repositório de arquivos de 10K, listando arquivos via -still instantâneo! Alguém testado vim-dirvishcontraNerdtree , você pode ver a diferença.

Eu abandonei vim-vinegartambém porque vim-dirvish tem a -ligação de qualquer maneira, e a maior parte da configuração de vim-vinegarénetrw específica. Simplesmente não precisa disso. Dois pássaros na mesma pedra!

A beleza deste plugin é que ele abraça a filosofia do VINE (Vim não é Emacs). Onde ele aproveita o poder de outros programas no terminal para fazer manipulações de arquivos, em vez de tentar fazer tudo sozinho. A parte importante é quão natural esses programas externos interagem com o vim. E isso é conseguido por :Shdo, e tem uma tecla conveniente de .(comando ponto , que é mnemônico para o comando de repetição), faça isso na seleção ou na linha real em um vim-dirvishbuffer. E digite !rmpara remover, !mvpara renomear.

Já que desabilitei o netrw, ( :help netrw-noload) me peguei tentando acessar gxde vez em quando. Eu não queria carregar um plugin para obter a gxfuncionalidade de volta.


Agora, para a solução, há um vínculo no modo de comando, ctrl-rentão ctrl-a( :help c_CTRL-R_CTRL-A), para colar o que quer que você tenha em seu cursor na linha de comando, então se você combinar isso com :!xdg-open/:!open (para mac), você praticamente define.

Há uma razão pela qual :wnão tem ligações normais. Eu estou surpreendido mais solução não fluxo de trabalho de comando alavancagem, eu uso o ex-comando muito, :s, :g, :v, :argdo,:cdo , e amigos. Combinando isso com diferentes modos, aproveita todo o poder do vim. Portanto, não fique apenas em um modo, tente aproveitar todo o poder do vim.

Portanto, todo o fluxo de trabalho. Enquanto você posiciona o cursor no topo da url, é apenas uma etapa:

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

Observe o !que indica o aproveitamento do poder de programas externos fora do vim. VIDEIRA !

Se você quiser a gxfuncionalidade de volta, basta mapear usando o mesmo comando:

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

Gosto de silenciar minhas ligações, então adicionar <silent>e :silresolverá ( :help :map-silent)

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

Observação sobre programas específicos de plataforma para abrir um url:

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

Eu uso as três plataformas e elas funcionam muito bem. Você pode apenas usar um deles para suas ligações vim, por exemplo. :!opene apenas alias no seu bashrc/zshrc/fish configo opencomando para qualquer programa específico da plataforma que você tem.

por exemplo. alias open = wslview

Dessa forma, meu vimrcpermanece agnóstico em relação à plataforma, e irei apenas lidar com as inconsistências via bashrc/zshrc/fish config.

chriz
fonte