web-dev-qa-db-fra.com

Comment insérer le résultat d'une commande dans le texte dans Vim?

Par exemple, :echo strftime(%c) indique l'heure actuelle en bas, mais comment insérer cette chaîne de temps au texte (juste après le curseur)?

50
xzhu

Vous pouvez utiliser le registre d'expression, "=, avec p (ou P) en mode normal ou <C-R> en mode insertion:

En mode normal:
(<C-M> Ici signifie Control+M, ou juste appuyer sur Enter/Return)

"=strftime('%c')<C-M>p

En mode insertion:
(<C-M> a la même signification que ci-dessus, <C-R> moyens Control+R)

<C-R>=strftime('%c')<C-M>

Si vous souhaitez insérer le résultat de la même expression plusieurs fois, vous voudrez peut-être les cartographier sur les touches de votre .vimrc:
(ici le <C-M> et <C-R> devrait être typée littéralement (une séquence de cinq caractères imprimables-VIM les traduira en interne))

:nmap <F2> "=strftime('%c')<C-M>p
:imap <F2> <C-R>=strftime('%c')<C-M>
55
Chris Johnsen

Si vous souhaitez insérer la sortie d'une commande Vim (par opposition à la valeur de retour d'un appel de la fonction ), vous devez le capturer. Ceci est accompli via la commande :redir, Qui vous permet de rediriger l'équivalent de Vim de la sortie standard dans une variable, un fichier, un registre ou une autre cible.

:redir Est une sorte de douloureusement gênant à utiliser; J'écrirais une fonction pour encapsuler sa fonctionnalité de manière plus pratique, quelque chose comme

funct! Exec(command)
    redir =>output
    silent exec a:command
    redir END
    return output
endfunct!

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 la sortie d'une commande à la position du curseur. Donc, à partir du mode normal, appuyez sur 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 noms de fonction, donc si vous utilisez une variable globale, vous devrez explicitement l'espace d'espace en le préfixant avec g:. Notez également que Exec(), comme écrit ci-dessus, ajoutera une nouvelle ligne à une sortie à une seule 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 pour plus Blâment sur environ redir et un lien vers une commande connexe.

12
intuited

Ces commandes inséreront la sortie de strftime("%c") droite où votre curseur est:

:exe ":normal i" . strftime("%c")

et

:call feedkeys("i". strftime("%c"))

Il y a d'autres moyens de faire ce que vous voulez (comme, par exemple, ceux qui sont sur Réponse de Mikel ).

Edit : Même mieux, pour insert sur place, utilisez le = Inscrivez-vous comme Chris Johnsen décrit

11
Eelvex
:call append(line('.'), strftime("%c"))

Mettra la ligne suivante, puis vous pouvez appuyer sur J (Shift+J) Joindre cela à la position actuelle.

Ou si vous en avez besoin tout en une seule commande, vous pourriez faire

:call setline(line('.'), getline(line('.')) . strftime("%c"))

ou

:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))

selon si vous voulez un espace inséré avant la date ou non.

4
Mikel

C'est comme ça que je le fais. Il le pose 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
2
Juan Ibiapina