Por ejemplo, :echo strftime(%c)
mostrará la hora actual en la parte inferior, pero ¿cómo insertar esta cadena de tiempo en el texto (justo después del cursor)?
Por ejemplo, :echo strftime(%c)
mostrará la hora actual en la parte inferior, pero ¿cómo insertar esta cadena de tiempo en el texto (justo después del cursor)?
Respuestas:
Puede usar el registro de expresión "=
, con p
(o P
) en modo normal o <C-R>
en modo inserción:
En modo normal:
( <C-M>
aquí significa Control+ M, o simplemente presione Enter/ Return)
"=strftime('%c')<C-M>p
En modo de inserción:
( <C-M>
tiene el mismo significado que el anterior, <C-R>
significa Control+ R)
<C-R>=strftime('%c')<C-M>
Si desea insertar el resultado de la misma expresión muchas veces, es posible que desee asignarlos a las teclas en su .vimrc
:
(aquí el <C-M>
y <C-R>
debe escribirse literalmente (una secuencia de cinco caracteres imprimibles: Vim los traducirá internamente))
:nmap <F2> "=strftime('%c')<C-M>p
:imap <F2> <C-R>=strftime('%c')<C-M>
"=
registro : - /
<C-R>=&sessionoptions
incluso completa la pestaña de modo salvaje!
<c-r>=
es lento para el comando, que puede tener mucha salida y también puede romper la sangría para que el texto de salida sea ilegible. Por ejemplo, <c-r>=execute('nmap')
la salida se escribirá línea por línea, lo cual es muy lento.
:r!date +\%c
ver :help :r!
date
es un comando externo y !
llama a comandos externos mientras OP solicita los comandos vim.
!
es un comando vi (m) que llama a comandos externos . Puede tener razón OP no queriendo generar solo comandos vim pero si lo hace, !
no lo hará.
Estos comandos insertarán la salida de la strftime("%c")
derecha donde está el cursor:
:exe ":normal i" . strftime("%c")
y
:call feedkeys("i". strftime("%c"))
Hay otras formas de hacer lo que quieras (como, por ejemplo, las de la respuesta de Mikel ).
Editar : Aún mejor, para insertar en el lugar, use el =
registro como describe Chris Johnsen
Si desea insertar la salida de un comando vim (a diferencia del valor de retorno de una llamada de función ), debe capturarlo. Esto se logra a través del :redir
comando, que le permite redirigir el equivalente de vim de la salida estándar a una variable, archivo, registro u otro objetivo.
:redir
es dolorosamente inconveniente de usar; Escribiría una función para encapsular su funcionalidad de una manera más conveniente, algo así como
funct! Exec(command)
redir =>output
silent exec a:command
redir END
return output
endfunct!
Una vez que haya declarado dicha función, puede usar el registro de expresión (como explicó Chris Johnsen) para insertar la salida de un comando en la posición del cursor. Entonces, desde el modo normal, presione i^R=Exec('ls')
para insertar la lista de los búferes actuales de vim.
Tenga en cuenta que el comando se ejecutará en el espacio de nombres de la función, por lo que si utiliza una variable global, tendrá que explícitamente asignarle un espacio de nombres con el prefijo g:
. También tenga en cuenta que Exec()
, como se escribió anteriormente, agregará una nueva línea de terminación incluso a la salida de una línea. Es posible que desee agregar una llamada a substitute()
la función para evitar esto.
Consulte también https://stackoverflow.com/questions/2573021/vim-how-to-redirect-ex-command-output-into-current-buffer-or-file/2573054#2573054 para obtener más información sobre redir
y un enlace a Un comando relacionado.
set paste
comando antes de devolver la salida y un set nopaste
después, para evitar la sangría de la escalera cuando las líneas comienzan con espacios en blanco. En realidad, quería guardar el valor de la opción de pegar actual y devolverlo, pero no pude hacerlo.
set nopaste
no debería funcionar después return output
, porque la declaración return es un punto de salida fuera de la función. He puesto mi solución a este problema como una respuesta separada en esta página.
:call append(line('.'), strftime("%c"))
Lo colocará en la siguiente línea, luego puede presionar J
( Shift+ J) para unirlo a la posición actual.
O si lo necesita todo en un solo comando, podría hacer
:call setline(line('.'), getline(line('.')) . strftime("%c"))
o
:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))
dependiendo de si desea insertar un espacio antes de la fecha o no.
Mejorando la respuesta @intuited para evitar el problema con espacios en blanco líderes y sangría creciente:
"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!
Esto simplemente se insertará en la ubicación actual del archivo cuando salga :call Exec('command')
del modo normal. Como se señaló en el comentario , el =Exec('command')
enfoque Ctrl + R original (modo de inserción) con la Exec(..)
devolución de una cadena podría corregirse parcialmente mediante el uso set paste
, pero no ofrece la oportunidad de colocarlo en set nopaste
cualquier lugar.
La let @o = output
sintaxis establece el registro o
en el contenido de la variable output
, como se explica aquí: https://stackoverflow.com/a/22738310/1143274
La return ''
línea es para que el valor de retorno predeterminado de 0
no se inserte en el búfer.
Así es como lo hago. Lo coloca justo después del cursor porque lo usa 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