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é?
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
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.
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 automatiquement
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
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).
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>
Je suis assez en retard à cette fête, mais voici une autre façon de faire qui fonctionne particulièrement bien sur Windows 7.
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. )
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.
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>¬
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 :)
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.
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:
Mac a :!open
Linux a :!xdg-open
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.
Réponses:
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églerg:netrw_browsex_viewer
ce 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.
Remarque: si vous n'êtes pas sur Mac, utilisez
gnome-open
/xdg-open
pour Linux ou 'chemin d'accès à votre navigateur Web' pour Windowsla source
gx
est si puissant, merci! Il ouvre également les fichiers avec les applications appropriées ™.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 automatiquementla source
: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é.J'utilise ce script pour rechercher gooogle
keyword
sous le curseur:Vous devez utiliser
getline('.')
etmatchstr()
pour extraire l'url sous le curseur. Le reste est le même.la source
Ajoutez la ligne suivante au fichier .vimrc:
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).la source
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.
la source
Je suis assez en retard à cette fête, mais voici une autre façon de faire qui fonctionne particulièrement bien sur Windows 7.
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.git
partir 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.com
Essayez-le. Vous l'aimerez. )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
,u
mode 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.
la source
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 "#".
la source
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 :)
la source
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
:la source
C'est simple, remplacez simplement "start" par tout ce que votre système d'exploitation utilise
GU pour go url!
la source
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é à celuinetrw
de (11 000+ LOC) .Je n'utilise pas beaucoup l'édition à distance, donc
vim-dirvish
c'est assez puissant pour gérer mon flux de travail (c'est en fait plus rapide quenetrw
~ 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-dirvish
contreNerdtree
, vous pouvez voir la différence.J'ai abandonné
vim-vinegar
aussi parce que vim-dirvish a de-
toute façon la liaison, et la plupart de la configuration devim-vinegar
estnetrw
spé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 unvim-dirvish
tampon. Et tapez!rm
pour supprimer,!mv
pour renommer.Depuis que j'ai désactivé netrw, (
:help netrw-noload
) je me suis retrouvé à atteindregx
de temps en temps. Je ne voulais pas charger un plugin pour récupérer lagx
fonctionnalité.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
:w
n'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
gx
ré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:sil
fera 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:
:!open
:!xdg-open
:!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.
:!open
et alias seulement dans votrebashrc/zshrc/fish config
laopen
commande à tout programme spécifique à la plate - forme que vous avez.par exemple.
alias open = wslview
De cette façon, je
vimrc
reste indépendant de la plate-forme et je traiterai simplement les incohérences viabashrc/zshrc/fish config
.la source