Otwórz URL pod kursorem w Vimie w przeglądarce

104

Po raz pierwszy używam Twitvim. Gdy zobaczyłem wszystkie adresy URL, zacząłem się zastanawiać, czy istnieje sposób, aby otworzyć adres URL pod kursorem w Twojej ulubionej lub określonej przeglądarce?

Mauro Morales
źródło
pod kursorem tekstowym czy kursorem myszy?
Oleg Mikheev
kursor tekstowy ... ale jeśli znasz sposób na zrobienie tego pod kursorem myszy, to też byłoby fajne
Mauro Morales
1
kliknięcie środkowym przyciskiem myszy w link w vimie zawsze działało dla mnie, chociaż nie wiem jak
Oleg Mikheev
2
środkowe kliknięcie, aby otworzyć, jest prawdopodobnie funkcją terminala, a nie vimem.
Leonid Shevtsov

Odpowiedzi:

189

Zaktualizowano: z dzisiejszego tweeta tpope

Naciśnij gx. Możesz dostosować przeglądarkę. W Gnome i Mac OS X jest już używany gnome-open/ open. Ogólnie możesz ustawić g:netrw_browsex_viewerwszystko, co chcesz.


Oryginalna odpowiedź:

Nie pamiętam, skąd mam tę funkcję. W adresie URL jest błąd z hashem (#), ale funkcja działa na tyle dobrze, że nie będę zawracał sobie głowy jej poprawianiem.

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>

Uwaga: jeśli nie korzystasz z komputera Mac, użyj gnome-open/ xdg-opendla systemu Linux lub „ścieżki do przeglądarki internetowej” dla systemu Windows

tungd
źródło
Myślę, że skorzystam z twojego rozwiązania :) dzięki ... Chciałbym sprawdzić, czy jest sposób, aby uzyskać tylko adres URL pod kursorem, ale nie znam zbyt wiele Vimscript, więc będę musiał nad tym popracować .
Mauro Morales
14
gxjest tak potężny, dzięki! Otwiera również pliki za pomocą odpowiednich aplikacji ™.
blinry
Myślę, że to g: netrw_browsex_viewer (bez 'r')
Jack,
2
Lubię otwierać adres URL z? i # w nim. Myślę, że netrw używa teraz cfile zamiast cWORD, więc adresy URL z '?' nie można ich już otworzyć za pomocą tej metody. Wypróbowałem tutaj twoje rozwiązanie i znak „#” w adresie URL zostałby zastąpiony alternatywną nazwą pliku. exec "! open" .shellescape (uri, 1) prawdopodobnie rozwiązało problem.
Chad Skeeters
4
Wspomniany wyżej tweet jest tutaj: twitter.com/tpope/status/289234166770434048 , na wypadek gdyby ktoś był zainteresowany dyskusją.
Antoine Cotten
49

Jeśli używasz Vim 7.4 lub nowszego, w trybie normalnym, umieść kursor pod adresem URL, a następnie kliknij gx, adres URL zostanie automatycznie otwarty w przeglądarcedemo działać

jsvisa
źródło
jak ustawiasz przeglądarkę na Chrome w tym przykładzie? (lub jakąkolwiek przeglądarkę)
jm3
@ jm3 Try :h netrw_gx: * dla Windows 32 lub 64, używane są pliki DLL z adresem URL i FileProtocolHandler. * dla Gnome (z gnome-open): używany jest gnome-open. * dla KDE (z kfmclient): używany jest kfmclient * dla Mac OS X: używany jest open. * w przeciwnym razie używana jest wtyczka netrwFileHandler.
kba stoi z Moniką
1
trochę nie na temat, ale jak nagrać ekran na gif? kocham to!
Peter Perháč
@ jm3 Który używa domyślnej przeglądarki internetowej systemu
jsvisa
3
@ PeterPerháč Używam github.com/keycastr/keycastr do nagrywania klawiatury, cockos.com/licecap, aby nagrywać ekran jako gif
jsvisa
9

Używam tego skryptu do wyszukiwania gooogle keywordpod kursorem:

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

Powinieneś użyć getline('.')i, matchstr()aby wyodrębnić adres URL pod kursorem. Reszta jest taka sama.

kev
źródło
Myślę, że to wskaże mi ostatecznie rozwiązanie, którego szukam ... plus ta funkcja będzie bardzo przydatna. Dzięki!
Mauro Morales
2

Dodaj następujący wiersz do pliku .vimrc:

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

W normalnym trybie naciśnięcie \ powoduje wybranie bieżącego słowa i otwarcie go jako adresu w przeglądarce internetowej.

Lider domyślnie to \ (ale mapowałem go do, z let mapleader = ","). Podobnie, używając imap, możesz odwzorować jakąś sekwencję klawiszy w trybie wstawiania (ale wtedy, jeśli jest to sekwencja 2 klawiszy, prawdopodobnie nadpisuje niektóre domyślne zachowanie).

Valdis
źródło
1

Ok, więc korzystając z odpowiedzi z @tungd i @kev oraz trochę badań, otrzymałem ten skrypt, który działa dokładnie tak, jak tego potrzebuję. Jak @tungd powiedział, że # może powodować problem, jeśli znajduje się w adresie URL, ale nie przeszkadza mi to, jeśli ktoś ma lepsze wyrażenie dla adresu URL, zostanie to mile widziane.

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
źródło
1

Spóźniłem się na tę imprezę, ale oto inny sposób na zrobienie tego, który działa szczególnie dobrze w systemie Windows 7.

  1. Zainstaluj zarówno vim-shell, jak i vim-misc w vimie. Polecam zrobić to za pomocą niesamowitej wtyczki Pathogen, a następnie po prostu cd ~/vimfiles/bundle & git clone [email protected]:xolox/vim-misc.git & git clone [email protected]:xolox/vim-shell.gitz msysgit. ( Te dwie wtyczki otwierają adresy URL w domyślnej przeglądarce bez tworzenia dodatkowych poleceń lub innych głupich bzdur zwykle wymaganych w oknach. Możesz otwierać adresy URL w Vimie w ten sposób:. :Open http://duckduckgo.comSpróbuj. Spodoba ci się. )

  2. Utwórz kilka mapowań Vima , aby szybko przenieść linię pod kursorem do przeglądarki. Zmapowałbym to na u (dla mnie to ,uz trybu normalnego). Oto jak:

    nnoremap u: exec "Otwórz" .getline (".")

Aby użyć tego mapowania, wpisz swój klawisz Leader z trybu normalnego + u. Powinien przeczytać wiersz pod kursorem i otworzyć go w domyślnej przeglądarce.

Rustavore
źródło
1

To rodzaj ulepszonej wersji skryptu pierwotnie zaproponowanego przez @tungd tutaj https://stackoverflow.com/a/9459366/7631731 . Zachowuje kontekst Vima i poprawnie obsługuje adresy URL zawierające znak „#”.

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
źródło
0

Powinieneś rzucić okiem na tę wtyczkę vim

henrik / vim-open-url

Zasadniczo wyjaśniono to w innych odpowiedziach, ale wymagana jest konkretna konfiguracja, jeśli używasz menedżera wtyczek :)

MoOx
źródło
0

Jak opisano powyżej @kev , zmodyfikowano dla środowisk Linux.

Na marginesie: kiedy ta funkcja została wykonana (Vim 8.1) na moim terminalu, ekran Vima został zaciemniony (przeważnie „wygaszony”; tj. Tekst był tam, ale nie był widoczny). :redraw!Poleceń (patrz https://stackoverflow.com/a/1117742/1904943 ) rysuje ekranu.

Dodaj do ~/.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
źródło
0

To proste, po prostu zastąp „start” tym, czego używa Twój system operacyjny

GU dla go url!

" Open url
if (has('win32') || has('win64'))
   nmap gu :exec "!start <cWORD>"<cr> 
else
   nmap gu :exec "!open <cWORD>"<cr> 
endif
lalo
źródło
0

Rozwiązanie dla osób rozładowujących netrw

Jest to rozwiązanie dla osób, które usunęły netrw( :help netrw-noload) w vim / neovim. Na przykład używają innego menedżera plików, takiego jakvim-dirvish

TLDR:

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

lub mapa gx:

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


Więc tylko trochę tła:

Szukałem również rozwiązania tego problemu, ponieważ w rzeczywistości całkowicie usunąłem netrw z ładowania w vimie i zastąpiłem go vim-dirvish. Wtyczka ta ma około 500 ~ LOC , w porównaniu do netrw„s (11,000+ LOC) .

Nie używam zbytnio zdalnej edycji, więc vim-dirvishjest wystarczająco potężny, aby zarządzać moim przepływem pracy (w rzeczywistości jest szybszy niż netrw~ autor twierdzi 2x, czuję, że jest szybszy - jest naprawdę natychmiastowy ⚡) bardzo przydatny w dużych bazach kodu / repozytoriach. Próbowałem nawet w repozytorium plików 10K, wyświetlając pliki w trybie -natychmiastowym! Ktoś testowane vim-dirvishprzedNerdtree któremu , możesz zobaczyć różnicę.

Rzuciłem vim-vinegarzbyt ponieważ vim-dirvish oddać -w każdym razie wiążące, a większość konfiguracji vim-vinegarjest netrwspecyfika. Po prostu tego nie potrzebuje. Dwie pieczenie na jednym ogniu!

Piękno tej wtyczki polega na tym, że zawiera ona filozofię VINE (Vim to nie Emacs). Tam, gdzie wykorzystuje moc innych programów w terminalu do manipulacji plikami, zamiast próbować robić wszystko samodzielnie. Ważną częścią jest naturalna interakcja tych zewnętrznych programów z vimem. Osiąga się to przez :Shdo, i ma wygodny klawisz .(polecenie kropki , które jest mnemoniczne dla polecenia powtarzania), zrób to zarówno na zaznaczeniu, jak i na rzeczywistej linii w vim-dirvishbuforze. Wpisz, !rmaby usunąć, !mvzmienić nazwę.

Odkąd wyłączam netrw, ( :help netrw-noload) gxod czasu do czasu sięgam . Nie chciałem ładować wtyczki, aby odzyskać gxfunkcjonalność.


Teraz rozwiązanie, istnieje powiązanie w trybie poleceń, ctrl-ra następnie ctrl-a( :help c_CTRL-R_CTRL-A), aby wkleić cokolwiek masz w kursorze do wiersza poleceń, więc jeśli połączysz to z :!xdg-open/:!open (dla mac), prawie ustawisz.

Jest powód, dla którego :wnie ma normalnych wiązań. Dziwię najbardziej rozwiązanie nie dźwigni komenda workflow, używam byłą komendę dużo, :s, :g, :v, :argdo, :cdo, i przyjaciół. Łącząc to z różnymi trybami, wykorzystuje pełną moc vim. Więc nie pozostań w jednym trybie, spróbuj wykorzystać pełną moc vim.

A więc pełny przepływ pracy. Gdy masz kursor na górze adresu URL, to tylko jeden krok: 😊

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

Zwróć uwagę, !co wskazuje na wykorzystanie mocy zewnętrznych programów poza vimem. WINOROŚLI !

Jeśli chcesz gxodzyskać funkcjonalność, możesz po prostu zmapować za pomocą tego samego polecenia:

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

Lubię wyciszać moje wiązania, więc dodanie <silent>i :silzałatwi sprawę ( :help :map-silent)

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

Uwaga na temat programów specyficznych dla platformy do otwierania adresu URL:

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

Używam wszystkich trzech platform i działają świetnie. Możesz po prostu użyć jednego z nich do swoich wiązań vima, np. :!openi zaledwie alias twojej bashrc/zshrc/fish configtej openkomendy do programu niezależnie od platformy masz.

na przykład. alias open = wslview

W ten sposób vimrcpozostanę agnostykiem platformy i zajmę się niespójnościami za pośrednictwem bashrc/zshrc/fish config.

chriz
źródło