Ouvrir l'URL sous le curseur dans Vim avec navigateur

104

J'utilise Twitvim pour la première fois. Voir toutes les URL là-dedans m'a fait me demander, y a-t-il un moyen d'ouvrir l'URL sous le curseur dans votre navigateur préféré ou dans celui spécifié?

Mauro Morales
la source
sous le curseur de texte ou le curseur de la souris?
Oleg Mikheev
curseur de texte ... mais si vous connaissez un moyen de faire sous le curseur de la souris, ce serait cool aussi
Mauro Morales
1
Cliquez sur le bouton du milieu de la souris sur un lien dans vim a toujours fonctionné pour moi, je ne sais pas comment, cependant
Oleg Mikheev
2
le clic du milieu pour ouvrir est probablement une fonctionnalité du terminal, pas de vim.
Leonid Shevtsov

Réponses:

189

Mise à jour: du tweet de tpope aujourd'hui

Appuyez sur gx. Vous pouvez personnaliser le navigateur. Sur Gnome et Mac OS X, il utilise déjà gnome-open/ open. En règle générale, vous pouvez régler g:netrw_browsex_viewerce que vous voulez.


Réponse originale:

Je ne me souviens pas d'où j'obtiens cette fonction. Il y a un bogue avec hash (#) dans l'url, mais la fonction fonctionne assez bien pour que je ne prenne pas la peine de le réparer.

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>

Remarque: si vous n'êtes pas sur Mac, utilisez gnome-open/ xdg-openpour Linux ou 'chemin d'accès à votre navigateur Web' pour Windows

tungd
la source
Je pense que je vais utiliser votre solution :) merci ... je voudrais voir s'il existe un moyen d'obtenir uniquement l'url sous le curseur, mais je ne connais pas grand chose de vimscript donc je vais devoir travailler dessus .
Mauro Morales
14
gxest si puissant, merci! Il ouvre également les fichiers avec les applications appropriées ™.
blinry
Je pense que c'est g: netrw_browsex_viewer (w / o 'r')
Jack
2
J'aime ouvrir une URL avec un? et un # dedans. Je pense que netrw utilise maintenant cfile au lieu de cWORD, donc les URL avec '?' ne peuvent plus être ouverts avec cette méthode. J'ai essayé votre solution ici et «#» dans l'URL serait remplacé par le nom de fichier alternatif. exec "! open" .shellescape (uri, 1) semble avoir résolu le problème.
Chad Skeeters
4
Le tweet susmentionné est ici: twitter.com/tpope/status/289234166770434048 , juste au cas où quelqu'un serait intéressé par la discussion.
Antoine Cotten
49

Si vous utilisez Vim 7.4 ou version ultérieure, en mode normal, placez votre curseur sous l'URL, puis cliquez sur gx, l'URL sera ouverte dans le navigateur automatiquementdémo opérer

jsvisa
la source
comment configurez-vous le navigateur pour qu'il soit Chrome dans cet exemple? (ou quel que soit le navigateur)
jm3
@ jm3 Essayez :h netrw_gx: * pour Windows 32 ou 64, les dll url et FileProtocolHandler sont utilisées. * pour Gnome (avec gnome-open): gnome-open est utilisé. * pour KDE (avec kfmclient): kfmclient est utilisé * pour Mac OS X: open est utilisé. * sinon, le plugin netrwFileHandler est utilisé.
kba se tient avec Monica
1
hors sujet un peu, mais comment enregistrer l'écran dans un gif? aimer!
Peter Perháč
@ jm3 qui utilise le navigateur Web par défaut du système
jsvisa
3
@ PeterPerháč J'utilise github.com/keycastr/keycastr pour enregistrer l'entrée au clavier, cockos.com/licecap pour enregistrer l'écran sous forme de gif
jsvisa
9

J'utilise ce script pour rechercher gooogle keywordsous le curseur:

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

Vous devez utiliser getline('.')et matchstr()pour extraire l'url sous le curseur. Le reste est le même.

kev
la source
Je pense que cela m'indiquera la solution que je recherche éventuellement ... et cette fonction deviendra très pratique. Merci!
Mauro Morales
2

Ajoutez la ligne suivante au fichier .vimrc:

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

Donc, en mode normal, appuyez sur \ pour sélectionner le mot actuel et l'ouvrir comme adresse dans le navigateur Web.

Le leader par défaut est \ (mais je l'ai mappé à, avec let mapleader = ","). De même, en utilisant imap, vous pouvez mapper une séquence de touches en mode insertion (mais dans ce cas, s'il s'agit d'une séquence de 2 touches, elle remplacera probablement un comportement par défaut).

Valdis
la source
1

Ok, donc en utilisant les réponses de @tungd et @kev et un peu de recherche, je me suis retrouvé avec ce script, qui fonctionne exactement comme je le souhaite. Comme @tungd l'a dit, le # peut poser un problème s'il se trouve dans une URL, mais cela me convient, si quelqu'un a une meilleure expression pour l'URL, alors elle sera la bienvenue.

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
la source
1

Je suis assez en retard à cette fête, mais voici une autre façon de faire qui fonctionne particulièrement bien sur Windows 7.

  1. Installez à la fois vim-shell et vim-misc dans vim.Je recommande de le faire via le plugin Pathogen toujours génial , puis simplement à cd ~/vimfiles/bundle & git clone [email protected]:xolox/vim-misc.git & git clone [email protected]:xolox/vim-shell.gitpartir de msysgit. ( Ces deux plugins ouvrent les URL dans votre navigateur par défaut sans créer aucune invite de commande supplémentaire ou autre absurdité généralement requise dans Windows. Vous pouvez ouvrir des URL dans Vim comme ceci:. :Open http://duckduckgo.comEssayez-le. Vous l'aimerez. )

  2. Créez des mappages vim afin que vous puissiez rapidement obtenir la ligne sous le curseur dans le navigateur. Je mapperais cela à vous (pour moi, c'est du ,umode normal). Voici comment:

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

Pour utiliser ce mappage, saisissez votre touche Leader à partir du mode normal + u. Il devrait lire la ligne sous votre curseur et l'ouvrir dans votre navigateur par défaut.

Rustavore
la source
1

Il s'agit d'une sorte de version améliorée du script initialement proposé par @tungd ici https://stackoverflow.com/a/9459366/7631731 . Conserve le contexte de vim et gère correctement les URL contenant "#".

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
la source
0

Vous devriez jeter un coup d'œil à ce plugin vim

henrik / vim-open-url

C'est essentiellement ce qui a été expliqué dans d'autres réponses, mais une configuration spécifique est nécessaire si vous utilisez un gestionnaire de plugins :)

MoOx
la source
0

Comme décrit ci - dessus par @kev , modifié pour les environnements Linux.

A part: lorsque cette fonction a été exécutée (Vim 8.1) dans mon terminal, l'écran de Vim était obscurci (principalement «masqué»; c'est-à-dire que le texte était là mais pas visible). La :redraw!commande (voir https://stackoverflow.com/a/1117742/1904943 ) redessine l'écran.

Ajouter à ~/.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
la source
0

C'est simple, remplacez simplement "start" par tout ce que votre système d'exploitation utilise

GU pour go url!

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

Solution pour les personnes qui ont déchargé netrw

C'est une solution pour les personnes qui ont supprimé netrw( :help netrw-noload) dans vim / neovim. Par exemple, ils utilisent un gestionnaire de fichiers différent commevim-dirvish

TLDR:

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

ou carte gx:

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


Alors juste un peu de contexte:

Je cherchais également une solution à ce problème car j'ai en fait supprimé netrw du chargement dans vim complètement et le remplacer par vim-dirvish. Ce plugin a environ 500 ~ LOC , comparé à celui netrwde (11 000+ LOC) .

Je n'utilise pas beaucoup l'édition à distance, donc vim-dirvishc'est assez puissant pour gérer mon flux de travail (c'est en fait plus rapide que netrw~ l'auteur le prétend 2x, je pense que c'est plus rapide que ça - c'est vraiment instantané ⚡) très utile sur de grandes bases de code / référentiels. Je l'ai même essayé dans un repo de fichiers 10K, listant les fichiers via -toujours instantané! Quelqu'un testé vim-dirvishcontreNerdtree , vous pouvez voir la différence.

J'ai abandonné vim-vinegaraussi parce que vim-dirvish a de -toute façon la liaison, et la plupart de la configuration de vim-vinegarest netrwspécifique. Il n'en a tout simplement pas besoin. Deux oiseaux en une pierre!

La beauté de ce plugin est qu'il embrasse la philosophie de VINE (Vim n'est pas Emacs). Où il exploite la puissance d'autres programmes du terminal pour faire des manipulations de fichiers, au lieu d'essayer de tout faire par lui-même. La partie importante est la façon dont ces programmes externes interagissent naturellement avec vim. Et cela est réalisé par :Shdo, et il a une touche pratique de .(commande point , qui est mnémonique pour la commande de répétition), faites cela à la fois sur la sélection ou sur la ligne réelle sur un vim-dirvishtampon. Et tapez !rmpour supprimer, !mvpour renommer.

Depuis que j'ai désactivé netrw, ( :help netrw-noload) je me suis retrouvé à atteindre gxde temps en temps. Je ne voulais pas charger un plugin pour récupérer la gxfonctionnalité.


Maintenant, pour la solution, il y a une liaison en mode commande, ctrl-rpuis ctrl-a( :help c_CTRL-R_CTRL-A), pour coller ce que vous avez dans votre curseur sur la ligne de commande, donc si vous combinez cela avec :!xdg-open/ :!open(pour mac), vous définissez à peu près.

Il y a une raison pour laquelle il :wn'y a pas de liaisons normales. Je suis surpris la solution la plus ne fait pas un effet de levier flux de travail de commande, j'utiliser ex-commande beaucoup, :s, :g, :v, :argdo, :cdo, et amis. En combinant cela avec différents modes, exploite toute la puissance de vim. Alors ne restez pas dans un seul mode, essayez d'exploiter toute la puissance de vim.

Donc, le flux de travail complet. Pendant que vous avez votre curseur au-dessus de l'url, il n'y a qu'une seule étape: 😊

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

Notez le !qui indique l'exploitation de la puissance des programmes externes en dehors de vim. LA VIGNE !

Si vous souhaitez gxrécupérer la fonctionnalité, vous pouvez simplement mapper en utilisant la même commande:

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

J'aime faire taire mes liaisons, donc ajouter <silent>et :silfera l'affaire ( :help :map-silent)

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

Remarque sur les programmes spécifiques à la plate-forme pour ouvrir une URL:

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

J'utilise les trois plates-formes et elles fonctionnent très bien. Vous pouvez simplement utiliser l'un d'entre eux pour vos liaisons vim, par exemple. :!openet alias seulement dans votre bashrc/zshrc/fish configla opencommande à tout programme spécifique à la plate - forme que vous avez.

par exemple. alias open = wslview

De cette façon, je vimrcreste indépendant de la plate-forme et je traiterai simplement les incohérences via bashrc/zshrc/fish config.

chriz
la source