En mode normal: ( <C-M>ici signifie Control+ M, ou appuyez simplement sur Enter/ Return)
"=strftime('%c')<C-M>p
En mode insertion: ( <C-M>a la même signification que ci-dessus, <C-R>signifie Control+ R)
<C-R>=strftime('%c')<C-M>
Si vous voulez insérer le résultat de la même expression plusieurs fois, vous pouvez les mapper sur les clés de votre .vimrc: (ici, le <C-M>et <C-R>devrait être tapé littéralement (une séquence de cinq caractères imprimables - Vim les traduira en interne))
pour obtenir la valeur d'une variable vim (par exemple, sessionoptions): <C-R>=&sessionoptions- il exécute même Wild-mode tab-complete!
Justin M. Keyes
2
: put = strftime ('% c') <CM>
brunch875 Le
En mode insertion, l'utilisation <c-r>=est lente pour une commande qui peut avoir beaucoup de sortie et peut également rompre l'indentation de sorte que le texte de sortie soit illisible. Par exemple, <c-r>=execute('nmap')la sortie sera écrite ligne par ligne, ce qui est très lent.
dateest une commande externe et !appelle des commandes externes tandis que OP demande des commandes vim.
Eelvex
@eelvex non, il ne l'a pas fait. et le ! est un vim et vi, commande. C'est la méthode canonique. Fonctionne pour beaucoup d'autres choses aussi.
Keith
5
@ Keith: yes !est une commande vi (m) qui appelle des commandes externes . Vous avez peut-être raison, OP ne souhaitant pas afficher uniquement des commandes vim, mais s’il le fait, il ne le !fera pas.
Eelvex
11
Ces commandes vont insérer la sortie de strftime("%c")droite là où se trouve votre curseur:
:exe ":normal i" . strftime("%c")
et
:call feedkeys("i". strftime("%c"))
Il y a d'autres façons de faire ce que vous voulez (comme, par exemple, celles sur la réponse de Mikel ).
Edit : Mieux encore, pour l'insertion sur place, utilisez le =registre décrit par Chris Johnsen.
Si vous souhaitez insérer le résultat d'une commande vim (par opposition à la valeur de retour d'un appel de fonction ), vous devez le capturer. Ceci est accompli via la :redircommande, qui vous permet de rediriger l'équivalent de la sortie standard de vim dans une variable, un fichier, un registre ou une autre cible.
:redirest en quelque sorte douloureusement incommode à utiliser; Je voudrais écrire une fonction pour encapsuler sa fonctionnalité d'une manière plus pratique, quelque chose comme
Une fois que vous avez déclaré une telle fonction, vous pouvez utiliser le registre d’expression (comme expliqué par Chris Johnsen) pour insérer le résultat d’une commande à la position du curseur. Donc, en mode normal, cliquez i^R=Exec('ls')pour insérer la liste des tampons actuels de vim.
Sachez que la commande s'exécutera dans l'espace de nom de la fonction. Par conséquent, si vous utilisez une variable globale, vous devrez explicitement le nommer en le préfixant avec g:. Notez également que Exec(), comme indiqué ci-dessus, ajoutera une nouvelle ligne de terminaison à la sortie même d'une ligne. Vous voudrez peut-être ajouter un appel à substitute()dans la fonction pour éviter cela.
Cela fonctionne très bien. J'ai ajouté une set pastecommande avant de renvoyer la sortie et un set nopasteaprès pour éviter le retrait de l'escalier lorsque les lignes commencent par des blancs. En fait, je voulais sauvegarder la valeur de l’option coller actuelle et la renvoyer, mais j’ai été incapable de le faire.
Juan Lanus
1
@JuanLanus Le set nopastene devrait pas fonctionner après return output, car l'instruction return est un point de sortie de la fonction. J'ai mis ma solution à ce problème comme une réponse séparée sur cette page.
Evgeni Sergeev
4
:call append(line('.'), strftime("%c"))
Le mettra sur la ligne suivante, puis vous pourrez appuyer sur J( Shift+ J) pour le rejoindre jusqu'à la position actuelle.
Ou si vous avez besoin de tout cela en une seule commande, vous pouvez le faire
Amélioration de la réponse @intuited pour éviter le problème de l’espacement des blancs et du retrait croissant:
"Examples:
":call Exec('buffers')
"This will include the output of :buffers into the current buffer.
"
"Also try:
":call Exec('ls')
":call Exec('autocmd')
"
funct! Exec(command)
redir =>output
silent exec a:command
redir END
let @o = output
execute "put o"
return ''
endfunct!
Cela va simplement insérer à l'emplacement actuel dans le fichier lorsque vous :call Exec('command')quittez le mode normal. Comme indiqué dans le commentaire , l' =Exec('command')approche Ctrl + R d'origine (mode insertion) permettant de Exec(..)renvoyer une chaîne peut être partiellement corrigée à l'aide de set paste, mais n'offre pas la possibilité de placer le caractère set nopasten'importe où.
C'est comme ça que je le fais. Il le place juste après le curseur car il utilise p.
" save previous yank
let reg_save = @@
" save your text to the '@' register
let @@ = strftime('%c')
" paste it after the cursor
exec "normal! p"
" restore previous yank
let @@ = reg_save
Réponses:
Vous pouvez utiliser le registre d’expression
"=
, avecp
(ouP
) en mode normal ou<C-R>
en mode insertion:En mode normal:
(
<C-M>
ici signifie Control+ M, ou appuyez simplement sur Enter/ Return)En mode insertion:
(
<C-M>
a la même signification que ci-dessus,<C-R>
signifie Control+ R)Si vous voulez insérer le résultat de la même expression plusieurs fois, vous pouvez les mapper sur les clés de votre
.vimrc
:(ici, le
<C-M>
et<C-R>
devrait être tapé littéralement (une séquence de cinq caractères imprimables - Vim les traduira en interne))la source
"=
registre. : - /<C-R>=&sessionoptions
- il exécute même Wild-mode tab-complete!<c-r>=
est lente pour une commande qui peut avoir beaucoup de sortie et peut également rompre l'indentation de sorte que le texte de sortie soit illisible. Par exemple,<c-r>=execute('nmap')
la sortie sera écrite ligne par ligne, ce qui est très lent.:r!date +\%c
voir
:help :r!
la source
date
est une commande externe et!
appelle des commandes externes tandis que OP demande des commandes vim.!
est une commande vi (m) qui appelle des commandes externes . Vous avez peut-être raison, OP ne souhaitant pas afficher uniquement des commandes vim, mais s’il le fait, il ne le!
fera pas.Ces commandes vont insérer la sortie de
strftime("%c")
droite là où se trouve votre curseur:et
Il y a d'autres façons de faire ce que vous voulez (comme, par exemple, celles sur la réponse de Mikel ).
Edit : Mieux encore, pour l'insertion sur place, utilisez le
=
registre décrit par Chris Johnsen.la source
Si vous souhaitez insérer le résultat d'une commande vim (par opposition à la valeur de retour d'un appel de fonction ), vous devez le capturer. Ceci est accompli via la
:redir
commande, qui vous permet de rediriger l'équivalent de la sortie standard de vim dans une variable, un fichier, un registre ou une autre cible.:redir
est en quelque sorte douloureusement incommode à utiliser; Je voudrais écrire une fonction pour encapsuler sa fonctionnalité d'une manière plus pratique, quelque chose commeUne fois que vous avez déclaré une telle fonction, vous pouvez utiliser le registre d’expression (comme expliqué par Chris Johnsen) pour insérer le résultat d’une commande à la position du curseur. Donc, en mode normal, cliquez
i^R=Exec('ls')
pour insérer la liste des tampons actuels de vim.Sachez que la commande s'exécutera dans l'espace de nom de la fonction. Par conséquent, si vous utilisez une variable globale, vous devrez explicitement le nommer en le préfixant avec
g:
. Notez également queExec()
, comme indiqué ci-dessus, ajoutera une nouvelle ligne de terminaison à la sortie même d'une ligne. Vous voudrez peut-être ajouter un appel àsubstitute()
dans la fonction pour éviter cela.Voir également https://stackoverflow.com/questions/2573021/vim-how-to-redirect-ex-command-output-into-current-buffer-or-file/2573054#2573054 pour plus d'informations sur le sujet
redir
et un lien vers une commande associée.la source
set paste
commande avant de renvoyer la sortie et unset nopaste
après pour éviter le retrait de l'escalier lorsque les lignes commencent par des blancs. En fait, je voulais sauvegarder la valeur de l’option coller actuelle et la renvoyer, mais j’ai été incapable de le faire.set nopaste
ne devrait pas fonctionner aprèsreturn output
, car l'instruction return est un point de sortie de la fonction. J'ai mis ma solution à ce problème comme une réponse séparée sur cette page.Le mettra sur la ligne suivante, puis vous pourrez appuyer sur
J
( Shift+ J) pour le rejoindre jusqu'à la position actuelle.Ou si vous avez besoin de tout cela en une seule commande, vous pouvez le faire
ou
selon que vous souhaitiez ou non insérer un espace avant la date.
la source
Amélioration de la réponse @intuited pour éviter le problème de l’espacement des blancs et du retrait croissant:
Cela va simplement insérer à l'emplacement actuel dans le fichier lorsque vous
:call Exec('command')
quittez le mode normal. Comme indiqué dans le commentaire , l'=Exec('command')
approche Ctrl + R d'origine (mode insertion) permettant deExec(..)
renvoyer une chaîne peut être partiellement corrigée à l'aide deset paste
, mais n'offre pas la possibilité de placer le caractèreset nopaste
n'importe où.La
let @o = output
syntaxe définit le registreo
sur le contenu de la variableoutput
, comme expliqué ici: https://stackoverflow.com/a/22738310/1143274La
return ''
ligne est telle que la valeur de retour par défaut de0
ne soit pas insérée dans le tampon.la source
C'est comme ça que je le fais. Il le place juste après le curseur car il utilise
p
.la source