Apri l'URL sotto il cursore in Vim con il browser


104

Sto usando Twitvim per la prima volta. Vedere tutti gli URL lì dentro mi ha fatto pensare, c'è un modo per aprire l'URL sotto il cursore nel tuo browser preferito o in uno specificato?


sotto il cursore del testo o il cursore del mouse?
Oleg Mikheev

cursore di testo ... ma se conosci un modo per fare sotto il cursore del mouse sarebbe bello anche
Mauro Morales

1
Il clic con il pulsante centrale del mouse su un collegamento in vim ha sempre funzionato per me, non so come, però
Oleg Mikheev

2
il clic centrale per aprire è probabilmente una caratteristica del terminale, non vim.
Leonid Shevtsov,

Risposte:


189

Aggiornato: dal tweet di tpope di oggi

Premere gx. Puoi personalizzare il browser. Su Gnome e Mac OS X è già utilizzato gnome-open/ open. In genere puoi impostare g:netrw_browsex_viewertutto ciò che desideri.


Risposta originale:

Non ricordo dove ottengo questa funzione. C'è un bug con hash (#) nell'URL, ma la funzione funziona abbastanza bene che non mi preoccuperò di risolverlo.

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 non sei su Mac, utilizza gnome-open/ xdg-openper Linux o "percorso del browser web" per Windows


Penso che userò la tua soluzione :) grazie ... vorrei vedere se c'è un modo per ottenere solo l'URL sotto il cursore, ma non conosco molto vimscript quindi dovrò lavorarci sopra .
Mauro Morales

14
gxè così potente, grazie! Inoltre apre i file con le applicazioni appropriate ™.
blinry

Penso che sia g: netrw_browsex_viewer (w / o 'r')
Jack

2
Mi piace aprire un URL con un? e un # in esso. Penso che netrw stia usando cfile invece di cWORD ora, quindi gli URL con "?" non sono più apribili utilizzando quel metodo. Ho provato la tua soluzione qui e "#" nell'URL sarebbe stato sostituito dal nome del file alternativo. exec "! open" .shellescape (uri, 1) sembra aver risolto il problema.
Chad Skeeters

4
Il suddetto tweet è qui: twitter.com/tpope/status/289234166770434048 , nel caso qualcuno fosse interessato alla discussione.
Antoine Cotten

49

Se stai usando Vim 7.4 o successivo, in modalità normale, posiziona il cursore sotto l'URL, quindi fai clic gx, l'URL verrà aperto automaticamente nel browserdemo operare


come imposti il ​​browser come Chrome in questo esempio? (o qualunque browser sia)
jm3

@ jm3 Prova :h netrw_gx: * per Windows 32 o 64, vengono utilizzati l'URL e le DLL FileProtocolHandler. * per Gnome (con gnome-open): viene utilizzato gnome-open. * per KDE (con kfmclient): viene utilizzato kfmclient * per Mac OS X: viene utilizzato open. * altrimenti viene utilizzato il plugin netrwFileHandler.
kba sta con Monica

1
fuori tema un po ', ma come si registra lo schermo in una gif? lo adoro!
Peter Perháč

@ jm3 che utilizza il browser web predefinito del sistema
jsvisa

3
@ PeterPerháč Sto usando github.com/keycastr/keycastr per registrare l'input della tastiera, cockos.com/licecap per registrare lo schermo come gif
jsvisa

9

Uso questo script per cercare su gooogle keywordsotto il cursore:

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

Dovresti usare getline('.')e matchstr()per estrarre l'URL sotto il cursore. Il riposo è lo stesso.


Penso che questo mi indicherà la soluzione che sto cercando alla fine ... inoltre questa funzione diventerà molto utile. Grazie!
Mauro Morales

2

Aggiungi la seguente riga al file .vimrc:

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

Quindi in modalità normale premendo \ seleziona la parola corrente e la apre come indirizzo nel browser web.

Il leader di default è \ (ma l'ho mappato a, con let mapleader = ","). Allo stesso modo, usando imap puoi mappare alcune sequenze di tasti in modalità di inserimento (ma poi, se è una sequenza di 2 tasti, probabilmente sovrascriverà un comportamento predefinito).


1

Ok, quindi usando le risposte di @tungd e @kev e un po 'di ricerca sono finito con questo script, che funziona proprio come mi serve. Come ha detto @tungd, # può dare un problema se all'interno di un URL, ma a me va bene, se qualcuno ha un'espressione migliore per l'URL, sarà il benvenuto.

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

Sono abbastanza in ritardo per questa festa, ma ecco un altro modo per farlo che funziona particolarmente bene su Windows 7.

  1. Installa sia vim-shell che vim-misc in vim, ti consiglio di farlo tramite il fantastico plugin Pathogen e poi semplicemente cd ~/vimfiles/bundle & git clone git@github.com:xolox/vim-misc.git & git clone git@github.com:xolox/vim-shell.gitda msysgit. ( Questi due plugin aprono gli URL nel browser predefinito senza creare alcun prompt dei comandi aggiuntivo o altre sciocchezze assurde solitamente richieste in Windows. Puoi aprire gli URL in Vim in questo modo:. :Open http://duckduckgo.comProvalo. Ti piacerà. )

  2. Crea alcune mappature vim in modo da poter portare rapidamente la linea sotto il cursore nel browser. Lo mapperei a te (per me, è ,udalla modalità normale). Ecco come:

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

Per utilizzare questa mappatura, digita il tuo tasto Leader dalla modalità normale + u. Dovrebbe leggere la riga sotto il cursore e aprirla nel browser predefinito.


1

Questa è una sorta di versione migliorata dello script originariamente proposto da @tungd qui https://stackoverflow.com/a/9459366/7631731 . Mantiene il contesto di vim e gestisce correttamente gli URL contenenti "#".

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

Dovresti dare una rapida occhiata a questo plugin vim

henrik / vim-open-url

È fondamentalmente ciò che è stato spiegato in altre risposte, ma è necessaria una configurazione specifica se si utilizza un gestore di plugin :)


0

Come descritto sopra da @kev , modificato per ambienti Linux.

A parte: quando questa funzione è stata eseguita (Vim 8.1) nel mio terminale, lo schermo di Vim era offuscato (per lo più "oscurato", cioè il testo era lì ma non visibile). Il :redraw!comando (vedere https://stackoverflow.com/a/1117742/1904943 ) ridisegna lo schermo.

Aggiungi 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


0

Questo è semplice, basta sostituire "start" con qualunque cosa utilizzi il tuo sistema operativo

GU per go url!

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

0

Soluzione per persone che scaricano netrw

Questa è una soluzione per le persone che hanno rimosso netrw( :help netrw-noload) in vim / neovim. Ad esempio, usano un diverso file manager comevim-dirvish

TLDR:

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

o mappa gx:

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


Quindi solo un po 'di background:

Stavo cercando una soluzione anche a questo problema poiché in realtà ho rimosso completamente netrw dal caricamento in vim e l'ho sostituito con vim-dirvish. Questo plugin ha circa 500 ~ LOC , rispetto a netrw's (11.000 LOC) .

Non uso molto l'editing remoto, quindi vim-dirvishè abbastanza potente da gestire il mio flusso di lavoro (in realtà è più veloce di netrw~ l'autore afferma 2x, sento che è più veloce di così - è davvero istantaneo ⚡) molto utile su grandi basi di codice / repository. L'ho persino provato in un repository di file da 10K, elencando i file tramite -still instant! Qualcuno testato vim-dirvishcontroNerdtree , puoi vedere la differenza.

Ho abbandonato vim-vinegaranche perché vim-dirvish ha il -binding comunque, e la maggior parte della configurazione di vim-vinegarè netrwspecifica. Semplicemente non ne ha bisogno. Due piccioni in una fava!

La bellezza di questo plugin è che abbraccia la filosofia di VINE (Vim non è Emacs). Dove sfrutta la potenza di altri programmi nel terminale per manipolare i file, invece di provare a fare tutto da solo. La parte importante è il modo naturale in cui questi programmi esterni interagiscono con vim. E questo si ottiene con :Shdo, e ha un comodo tasto di .(comando punto , che è mnemonico per il comando di ripetizione), fallo sia sulla selezione che sulla riga effettiva su un vim-dirvishbuffer. E digita !rmper rimuovere, !mvper rinominare.

Da quando ho disabilitato netrw, ( :help netrw-noload) mi sono ritrovato a gxcercare di tanto in tanto. Non volevo caricare un plug-in per gxripristinare la funzionalità.


Ora per la soluzione, c'è un'associazione in modalità comando, ctrl-rquindi ctrl-a( :help c_CTRL-R_CTRL-A), per incollare tutto ciò che hai nel cursore sulla riga di comando, quindi se lo combini con :!xdg-open/:!open (per mac), praticamente imposti.

C'è un motivo per cui :wnon ha attacchi normali. Mi sorprende che la maggior parte soluzione non leva il flusso di lavoro di comando, io uso l'ex comando di un sacco, :s, :g, :v, :argdo, :cdo, e gli amici. Combinando questo con diverse modalità, sfrutta tutta la potenza di vim. Quindi non restare in una sola modalità, prova a sfruttare tutta la potenza di vim.

Quindi l'intero flusso di lavoro. Mentre hai il cursore sopra l'URL, è solo un singolo passaggio: 😊

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

Notare !che indica di sfruttare la potenza di programmi esterni al di fuori di vim. VITE !

Se desideri gxripristinare la funzionalità, puoi eseguire la mappatura utilizzando lo stesso comando:

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

Mi piace silenziare le mie associazioni, quindi aggiungere <silent>e :silfarà il trucco ( :help :map-silent)

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

Nota sui programmi specifici della piattaforma per aprire un URL:

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

Uso tutte e tre le piattaforme e funzionano alla grande. Puoi semplicemente usarne uno per i tuoi attacchi vim, ad es. :!openea soli alias nel vostro bashrc/zshrc/fish configlaopen comando per qualsiasi programma dalla piattaforma specifico che si hanno.

per esempio. alias open = wslview

In questo modo, il mio vimrcrimane indipendente dalla piattaforma e mi occuperò solo delle incongruenze tramite bashrc/zshrc/fish config.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.