Öffnen Sie die URL unter dem Cursor in Vim mit dem Browser

103

Ich benutze Twitvim zum ersten Mal. Als ich alle URLs dort sah, fragte ich mich, ob es eine Möglichkeit gibt, die URL unter dem Cursor in Ihrem bevorzugten Browser oder einem bestimmten zu öffnen.

Mauro Morales
quelle
unter Textcursor oder Mauszeiger?
Oleg Mikheev
Textcursor ... aber wenn Sie eine Möglichkeit kennen, unter dem Mauszeiger zu tun, wäre das auch cool
Mauro Morales
1
mittlere Maustaste auf einen Link in vim klicken hat immer für mich funktioniert, ich weiß aber nicht wie
Oleg Mikheev
2
Ein mittlerer Klick zum Öffnen ist wahrscheinlich eine Funktion des Terminals, nicht vim.
Leonid Shevtsov

Antworten:

188

Aktualisiert: von tpopes Tweet heute

Drücken Sie gx. Sie können den Browser anpassen. Auf Gnome und Mac OS X es bereits verwenden gnome-open/ open. Im Allgemeinen können Sie g:netrw_browsex_vieweralles einstellen , was Sie wollen.


Ursprüngliche Antwort:

Ich erinnere mich nicht, woher ich diese Funktion habe. Es gibt einen Fehler mit Hash (#) in der URL, aber die Funktion funktioniert gut genug, dass ich mich nicht darum kümmere, ihn zu beheben.

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>

Hinweis: Wenn Sie nicht auf dem Mac arbeiten, verwenden Sie gnome-open/ xdg-openfür Linux oder "Pfad zu Ihrem Webbrowser" für Windows

Tungd
quelle
Ich denke, ich werde Ihre Lösung verwenden :) Danke ... Ich würde gerne sehen, ob es eine Möglichkeit gibt, nur die URL unter den Cursor zu bekommen, aber ich kenne nicht viel Vimscript, also muss ich daran arbeiten .
Mauro Morales
14
gxist so mächtig, danke! Es werden auch Dateien mit geeigneten Anwendungen ™ geöffnet.
Blinry
Ich denke, es ist g: netrw_browsex_viewer (ohne 'r')
Jack
2
Ich öffne gerne eine URL mit einem? und ein # drin. Ich denke, netrw verwendet jetzt cfile anstelle von cWORD, also URLs mit '?' sind mit dieser Methode nicht mehr zu öffnen. Ich habe hier Ihre Lösung ausprobiert und '#' in der URL wird durch den alternativen Dateinamen ersetzt. exec "! open" .shellescape (uri, 1) scheint das Problem behoben zu haben.
Chad Skeeters
4
Der oben genannte Tweet ist hier: twitter.com/tpope/status/289234166770434048 , nur für den Fall, dass jemand an der Diskussion interessiert ist.
Antoine Cotten
49

Wenn Sie Vim 7.4 oder höher verwenden, setzen Sie den Cursor im normalen Modus unter die URL und klicken Sie auf gx. Die URL wird automatisch im Browser geöffnetDemo betreiben

jsvisa
quelle
Wie stellen Sie den Browser in diesem Beispiel auf Chrome ein? (oder welcher Browser auch immer)
jm3
@ jm3 Try :h netrw_gx: * Für Windows 32 oder 64 werden die URLs url und FileProtocolHandler verwendet. * für Gnome (mit Gnome-Open): Gnome-Open wird verwendet. * für KDE (mit kfmclient): kfmclient wird verwendet * für Mac OS X: open wird verwendet. * Andernfalls wird das Plugin netrwFileHandler verwendet.
kba steht mit Monica
1
ein wenig vom Thema abweichend, aber wie zeichnet man den Bildschirm in ein GIF auf? Liebe es!
Peter Perháč
@ jm3 Welche mit dem Standard-Webbrowser des Systems
jsvisa
3
@ PeterPerháč Ich benutze github.com/keycastr/keycastr , um Tastatureingaben aufzuzeichnen, cockos.com/licecap , um den Bildschirm als gif
aufzuzeichnen
9

Ich benutze dieses Skript, um keywordunter dem Cursor nach Google zu suchen :

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

Sie sollten getline('.')und verwenden matchstr(), um URL unter Cursor zu extrahieren. Der Rest ist der gleiche.

kev
quelle
Ich denke, dies wird mich auf die Lösung hinweisen, nach der ich irgendwann suche ... und diese Funktion wird sehr praktisch sein. Vielen Dank!
Mauro Morales
2

Fügen Sie der .vimrc-Datei die folgende Zeile hinzu:

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

Im normalen Modus wird durch Drücken von \ das aktuelle Wort ausgewählt und als Adresse im Webbrowser geöffnet.

Leader ist standardmäßig \ (aber ich habe es mit zugeordnet let mapleader = ","). In ähnlicher Weise können Sie mit imap eine Tastenfolge im Einfügemodus zuordnen (wenn es sich jedoch um eine 2-Tastenfolge handelt, wird wahrscheinlich ein Standardverhalten außer Kraft gesetzt).

Valdis
quelle
1

Ok, also mit den Antworten von @tungd und @kev und ein wenig Recherche bin ich zu diesem Skript gekommen, das genau so funktioniert, wie ich es brauche. Wie @tungd sagte, kann das # ein Problem geben, wenn es sich in einer URL befindet, aber ich finde das cool. Wenn jemand einen besseren Ausdruck für die URL hat, wird es begrüßt.

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

Ich bin ziemlich spät zu dieser Party, aber hier ist eine andere Möglichkeit, die unter Windows 7 besonders gut funktioniert.

  1. Installieren Sie sowohl vim-shell als auch vim-misc in vim. Ich empfehle, dies über das fantastische Pathogen- Plugin und dann einfach cd ~/vimfiles/bundle & git clone [email protected]:xolox/vim-misc.git & git clone [email protected]:xolox/vim-shell.gitüber msysgit zu tun. ( Diese beiden Plugins öffnen URLs in Ihrem Standardbrowser, ohne zusätzliche Eingabeaufforderungen oder anderen albernen Unsinn zu erstellen, der normalerweise in Windows erforderlich ist. Sie können URLs in Vim folgendermaßen öffnen : :Open http://duckduckgo.com. Probieren Sie es aus. Es wird Ihnen gefallen. )

  2. Erstellen Sie einige Vim-Zuordnungen, damit Sie die Zeile unter dem Cursor schnell in den Browser übertragen können. Ich würde dir das zuordnen (für mich ist das ,uaus dem normalen Modus). Hier ist wie:

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

Um diese Zuordnung zu verwenden, geben Sie Ihre Leader-Taste im normalen Modus + u ein. Es sollte die Zeile unter Ihrem Cursor lesen und in Ihrem Standardbrowser öffnen.

Rustavore
quelle
1

Dies ist eine Art verbesserte Version des Skripts, das ursprünglich von @tungd hier https://stackoverflow.com/a/9459366/7631731 vorgeschlagen wurde . Behält den vim-Kontext bei und behandelt URLs mit "#" korrekt.

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

Sie sollten einen kurzen Blick auf dieses Vim-Plugin werfen

henrik / vim-open-url

Es ist im Grunde das, was in einigen anderen Antworten erklärt wurde, aber eine spezielle Konfiguration ist erforderlich, wenn Sie einen Plugin-Manager verwenden :)

MoOx
quelle
0

Wie oben von @kev beschrieben , modifiziert für Linux-Umgebungen.

Nebenbei: Als diese Funktion in meinem Terminal ausgeführt wurde (Vim 8.1), war der Vim-Bildschirm verschleiert (meistens "ausgeblendet"; dh der Text war vorhanden, aber nicht sichtbar). Der :redraw!Befehl (siehe https://stackoverflow.com/a/1117742/1904943 ) zeichnet den Bildschirm neu.

Hinzufügen zu ~/.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
quelle
0

Dies ist einfach. Ersetzen Sie einfach "Start" durch das, was Ihr Betriebssystem verwendet

GU für go url!

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

Lösung für Leute, die entladen netrw

Dies ist eine Lösung für Personen, die netrw( :help netrw-noload) in vim / neovim entfernt haben. Zum Beispiel verwenden sie einen anderen Dateimanager wievim-dirvish

TLDR:

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

oder Karte gx:

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


Also nur ein bisschen Hintergrund:

Ich habe auch nach einer Lösung für dieses Problem gesucht, da ich netrw tatsächlich aus dem vollständigen Laden in vim entfernt und durch ersetzt habe vim-dirvish. Dieses Plugin hat ungefähr 500 ~ LOC im Vergleich zu netrw's (11.000+ LOC) .

Ich verwende die Fernbearbeitung nicht viel und bin daher vim-dirvishleistungsstark genug, um meinen Workflow zu verwalten (es ist tatsächlich schneller als netrw~ der Autor behauptet 2x, ich denke , es ist schneller als das - es ist wirklich augenblicklich ⚡), sehr nützlich bei großen Codebasen / Repositorys. Ich habe es sogar in einem 10K-Datei-Repo versucht und Dateien über -noch sofort aufgelistet! Jemand getestet vim-dirvishgegenNerdtree , können Sie den Unterschied sehen.

Ich fiel vim-vinegarauch , weil vim-dirvish haben die -ohnehin verbindlich, und die meisten der Konfiguration vim-vinegarist netrwSpezifika. Es braucht es einfach nicht. Zwei Fliegen in einer Klappe!

Das Schöne an diesem Plugin ist, dass es die Philosophie von VINE umfasst (Vim ist nicht Emacs). Wo es die Leistung anderer Programme im Terminal nutzt, um Dateimanipulationen durchzuführen, anstatt zu versuchen, alles selbst zu tun. Der wichtige Teil ist, wie natürlich diese externen Programme mit vim interagieren. Und das wird erreicht durch :Shdo, und es hat eine bequeme Taste von .(Punktbefehl , der für den Wiederholungsbefehl mnemonisch ist), dies sowohl für die Auswahl als auch für die tatsächliche Zeile in einem vim-dirvishPuffer zu tun . Und geben Sie !rmzum Entfernen und !mvUmbenennen ein.

Da ich netrw deaktiviere, ( :help netrw-noload) griff ich gxvon Zeit zu Zeit. Ich wollte kein Plugin laden, um die gxFunktionalität wieder herzustellen .


Jetzt für die Lösung, es gibt eine im Befehlsmodus zu binden, ctrl-rdann ctrl-a( :help c_CTRL-R_CTRL-A) einfügen , was Sie in Ihren Cursor an die Befehlszeilen haben, wenn Sie also , dass mit kombinieren :!xdg-open/ :!open(für Mac), Sie ziemlich viel Set.

Es gibt einen Grund, warum :wes keine normalen Bindungen gibt. Ich bin die meisten Lösung überrascht nicht Hebel Befehl Workflow, ich viel ex-Befehl zu verwenden, :s, :g, :v, :argdo, :cdo, und Freunde. Wenn Sie dies mit verschiedenen Modi kombinieren, können Sie die volle Leistung von vim nutzen. Bleiben Sie also nicht nur in einem Modus, sondern versuchen Sie, die volle Leistung von vim zu nutzen.

Also der volle Workflow. Während Sie Ihren Cursor über der URL haben, ist dies nur ein einziger Schritt: 😊

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

Beachten Sie, !was darauf hinweist, dass die Leistung externer Programme außerhalb von vim genutzt wird. WEIN !

Wenn Sie die gxFunktionalität wiederherstellen möchten , können Sie sie einfach mit demselben Befehl zuordnen:

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

Ich mag meine Bindungen zu schweigen, so dass das Hinzufügen <silent>und :silden Trick ( :help :map-silent)

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

Hinweis zu plattformspezifischen Programmen zum Öffnen einer URL:

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

Ich benutze alle drei Plattformen und sie funktionieren großartig. Sie können einfach eine davon für Ihre Vim-Bindungen verwenden, z. :!openund nur Alias in Ihrem bashrc/zshrc/fish configden openBefehl zu , was plattformspezifischen Programm , das Sie haben.

z.B. alias open = wslview

Auf diese Weise vimrcbleibt meine Plattform plattformunabhängig und ich werde mich nur über mit den Inkonsistenzen befassen bashrc/zshrc/fish config.

chriz
quelle