Abrir URL debajo del cursor en Vim con el navegador

104

Estoy usando Twitvim por primera vez. Ver todas las URL allí me hizo preguntarme, ¿hay alguna forma de abrir la URL debajo del cursor en su navegador favorito o en uno específico?

Mauro Morales
fuente
bajo el cursor de texto o el cursor del mouse?
Oleg Mikheev
cursor de texto ... pero si conoce una forma de hacerlo con el cursor del mouse, también sería genial
Mauro Morales
1
Hacer clic con el botón central del mouse en un enlace en vim siempre me ha funcionado, aunque no sé cómo
Oleg Mikheev
2
es probable que el clic central para abrir sea una característica del terminal, no vim.
Leonid Shevtsov

Respuestas:

189

Actualizado: del tweet de tpope de hoy

Presione gx. Puede personalizar el navegador. En Gnome y Mac OS X ya se usa gnome-open/ open. Por lo general, puede configurar g:netrw_browsex_viewerlo que desee.


Respuesta original:

No recuerdo de dónde obtengo esta función. Hay un error con el hash (#) en la URL, pero la función funciona lo suficientemente bien como para que no me moleste en arreglarlo.

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: Si no está en Mac, use gnome-open/ xdg-openpara Linux, o 'ruta a su navegador web' para Windows

tungd
fuente
Creo que usaré su solución :) gracias ... Me gustaría ver si hay una manera de obtener solo la URL debajo del cursor, pero no sé mucho de vimscript, así que tendré que trabajar en eso .
Mauro Morales
14
gxes tan poderoso, gracias! También abre archivos con las aplicaciones apropiadas ™.
blinry
Creo que es g: netrw_browsex_viewer (w / o 'r')
Jack
2
Me gusta abrir una URL con un? y un # en él. Creo que netrw está usando cfile en lugar de cWORD ahora, entonces urls con '?' ya no se pueden abrir con ese método. Probé su solución aquí y '#' en la URL sería reemplazado por el nombre de archivo alternativo. exec "! open" .shellescape (uri, 1) parece haber solucionado el problema.
Chad Skeeters
4
El tweet mencionado anteriormente está aquí: twitter.com/tpope/status/289234166770434048 , en caso de que alguien esté interesado en la discusión.
Antoine Cotten
49

Si está utilizando Vim 7.4 o posterior, en modo normal, coloque el cursor debajo de la URL, luego haga clic gx, la URL se abrirá en el navegador automáticamentedemo operar

jsvisa
fuente
¿Cómo configura el navegador para que sea Chrome en este ejemplo? (o cualquier navegador que sea)
jm3
@ jm3 Intente :h netrw_gx: * para Windows 32 o 64, se utilizan las DLL de URL y FileProtocolHandler. * para Gnome (con gnome-open): se usa gnome-open. * para KDE (con kfmclient): se usa kfmclient * para Mac OS X: se usa open. * de lo contrario, se utiliza el complemento netrwFileHandler.
kba está con Monica
1
fuera de tema un poco, pero ¿cómo se graba la pantalla en un gif? ¡quiéralo!
Peter Perháč
@ jm3 que usa el navegador web predeterminado del sistema
jsvisa
3
@ PeterPerháč Estoy usando github.com/keycastr/keycastr para grabar la entrada del teclado, cockos.com/licecap para grabar la pantalla como gif
jsvisa
9

Utilizo este script para buscar en gooogle keyworddebajo del cursor:

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

Debe usar getline('.')y matchstr()para extraer la URL debajo del cursor. El resto es igual.

kev
fuente
Creo que esto me indicará la solución que estoy buscando eventualmente ... además, esta función será muy útil. ¡Gracias!
Mauro Morales
2

Agregue la siguiente línea al archivo .vimrc:

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

Entonces, en modo normal, presionando \ selecciona la palabra actual y la abre como dirección en el navegador web.

El líder predeterminado es \ (pero lo he asignado a, con let mapleader = ","). De manera similar, usando imap puede mapear alguna secuencia de teclas en el modo de inserción (pero luego, si es una secuencia de 2 teclas, probablemente anulará algún comportamiento predeterminado).

Valdis
fuente
1

Ok, usando las respuestas de @tungd y @kev y un poco de investigación, terminé con este script, que funciona de la manera que necesito. Como dijo @tungd, el # puede dar un problema si está dentro de una URL, pero estoy de acuerdo con eso, si alguien tiene una mejor expresión para la URL, será bienvenido.

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
fuente
1

Llego bastante tarde a esta fiesta, pero aquí hay otra forma de hacerlo que funciona especialmente bien en Windows 7.

  1. Instale vim-shell y vim-misc en vim . Recomiendo hacerlo a través del siempre asombroso plugin Pathogen y luego simplemente cd ~/vimfiles/bundle & git clone [email protected]:xolox/vim-misc.git & git clone [email protected]:xolox/vim-shell.gitdesde msysgit. ( Estos dos complementos abren direcciones URL en su navegador predeterminado sin crear ninguna solicitud de comando adicional u otras tonterías tontas que normalmente se requieren en Windows. Puede abrir direcciones URL en Vim de esta manera:. :Open http://duckduckgo.comPruébelo. Le gustará ) .

  2. Cree algunas asignaciones de vim para que pueda obtener rápidamente la línea debajo del cursor en el navegador. Te asignaría esto a ti (para mí, eso es ,udesde el modo normal). Así es cómo:

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

Para usar este mapeo, escriba su clave de líder desde el modo normal + u. Debería leer la línea debajo del cursor y abrirla en su navegador predeterminado.

Rustavore
fuente
1

Esta es una especie de versión mejorada del script propuesto originalmente por @tungd aquí https://stackoverflow.com/a/9459366/7631731 . Mantiene el contexto de vim y maneja correctamente las URL que contienen "#".

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
fuente
0

Deberías echar un vistazo rápido a este complemento de vim

henrik / vim-open-url

Es básicamente lo que se ha explicado en algunas otras respuestas, pero se necesita una configuración específica si usa un administrador de complementos :)

MoOx
fuente
0

Como se describe anteriormente por @kev , modificado para entornos Linux.

Aparte: cuando se ejecutó esta función (Vim 8.1) en mi terminal, la pantalla de Vim estaba ofuscada (en su mayoría "en blanco", es decir, el texto estaba allí pero no visible). El :redraw!comando (consulte https://stackoverflow.com/a/1117742/1904943 ) vuelve a dibujar la pantalla.

Agregar 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
fuente
0

Esto es simple, simplemente reemplace "start" con cualquier sistema operativo que use

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
fuente
0

Solución para personas que descargaron netrw

Esta es una solución para las personas que eliminaron netrw( :help netrw-noload) en vim / neovim. Por ejemplo, usan un administrador de archivos diferente comovim-dirvish

TLDR:

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

o mapa gx:

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


Así que solo un poco de trasfondo:

También estaba buscando una solución a este problema, ya que en realidad eliminé netrw de cargarse en vim por completo y lo reemplacé con vim-dirvish. Este complemento tiene alrededor de 500 ~ LOC , en comparación con netrw's (11.000+ LOC) .

No uso mucho la edición remota, por lo que vim-dirvishes lo suficientemente potente como para administrar mi flujo de trabajo (en realidad es más rápido que netrw~ el autor afirma 2 veces, siento que es más rápido que eso, es realmente instantáneo ⚡) muy útil en grandes bases de código / repositorios. Incluso lo probé en un repositorio de archivos de 10K, ¡enumerando archivos de forma -instantánea! Alguien probado vim-dirvishcontraNerdtree , puede ver la diferencia.

También lo dejé vim-vinegarporque vim-dirvish tiene el -enlace de todos modos, y la mayor parte de la configuración de vim-vinegares netrwespecífica. Simplemente no lo necesita. ¡Dos pájaros de un tiro!

La belleza de este complemento es que adopta la filosofía de VINE (Vim no es Emacs). Donde aprovecha el poder de otros programas en la terminal para realizar manipulaciones de archivos, en lugar de intentar hacerlo todo por sí mismo. La parte importante es qué tan natural estos programas externos interactúan con vim. Y eso se logra mediante :Shdo, y tiene una tecla conveniente de .(comando de punto , que es mnemónico para el comando de repetición), haz eso tanto en la selección como en la línea real en un vim-dirvishbúfer. Y escriba !rmpara eliminar, !mvpara cambiar el nombre.

Desde que desactivo netrw, ( :help netrw-noload) me encontré gxbuscando de vez en cuando. No quería cargar un complemento para recuperar la gxfuncionalidad.


Ahora, para la solución, hay un enlace en el modo de comando, ctrl-rluego ctrl-a( :help c_CTRL-R_CTRL-A), para pegar lo que tenga en el cursor en la línea de comando, así que si lo combina con :!xdg-open/ :!open(para mac), prácticamente lo establece.

Hay una razón por la :wque no tiene enlaces normales. Me sorprende más la solución no aprovecha el flujo de trabajo del sistema, lo uso ex comandos mucho, :s, :g, :v, :argdo, :cdo, y amigos. Combinando esto con diferentes modos, aprovecha todo el poder de vim. Así que no se quede en un solo modo, intente aprovechar todo el poder de vim.

Entonces, el flujo de trabajo completo. Mientras tiene el cursor en la parte superior de la URL, es solo un paso: 😊

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

Observe el !que indica aprovechar el poder de los programas externos fuera de vim. VINE !

Si desea gxrecuperar la funcionalidad, puede mapear usando el mismo comando:

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

Me gusta silenciar mis ataduras, así que agregar <silent>y :silhará el truco ( :help :map-silent)

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

Nota sobre los programas específicos de la plataforma para abrir una URL:

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

Utilizo las tres plataformas y funcionan muy bien. Puede usar uno de ellos para sus enlaces vim, por ejemplo. :!openy sólo en su alias bashrc/zshrc/fish configdel opencomando para cualquier programa específico de la plataforma que tienen.

p.ej. alias open = wslview

De esa manera, mi vimrcplataforma permanece independiente de la plataforma, y ​​solo lidiaré con las inconsistencias a través de bashrc/zshrc/fish config.

chriz
fuente