¿Cómo inserto el nombre de archivo actual en el contenido de Vim?

39

Después de algunas búsquedas, llegué a saber que :echo @%muestra el nombre del archivo actual en la línea inferior de vim-screen.

Me gustaría volcar el nombre de archivo (con y sin ruta completa) en el contenido del archivo sin salir vim.

¿Hay alguna forma de hacer esto?

mtk
fuente

Respuestas:

28

Estoy seguro de que hay otras formas de hacer esto ... pero el comando principal que desea es el :r[ead]que inserta la salida de un comando en el búfer.

Entonces, para insertar solo el nombre del archivo:

:r! echo %

Y, para incluir la ruta completa:

:r! echo %:p

Para más información:

:help read
:help filename-modifiers 
JC Yamokoski
fuente
37

El nombre de archivo actual está en el "%registro, por lo que puede insertarlo (mientras está en modo de inserción) con <c-r>%; la ruta completa se puede insertar con <c-r>=expand("%:p"). Podría hacer una macro si lo usa con frecuencia. Para más, trucos similares, ver :h expandy :h "=.

Kevin
fuente
Tal vez estoy malinterpretando eso, pero ¿no está <c-r>asignado como comando rehacer?
JC Yamokoski
10
En modo de inserción, <c-r>especifica que el siguiente carácter es un registro.
Kevin
Righto, gracias. Olvidé por
completo
También puedes hacerlo "%pen modo normal o visual.
naught101
15

Como se puede ver en :h registers, el "%registro contiene el nombre del archivo actual. El :pu[t]comando inserta el contenido de un registro en el texto.

Entonces, para insertar el nombre de archivo real, puede escribir cualquiera de estos, en modo comando:

:put %

o

"%p

Para insertar el nombre de archivo con la ruta completa, escriba

:put=expand('%:p')

en modo comando.


Más información:

:h pu[t]

Al escribir "rppuede pegar el contenido del registro "r.

braunmagrin
fuente
3
El :put "%:p"no parece funcionar para mí. Parece funcionar solo con expand () , como en:, :put =expand('%:p')lo que lo hace no mucho menos engorroso que <c-r>=expand('%:p')desafortunadamente.
akavel
@akavel Tienes razón, actualizaré la respuesta. ¡Gracias! ;) Y, de hecho, ambos son igualmente detallados.
braunmagrin
5

Una forma simple es ejecutar:

!!echo %
  • !! está reemplazando la línea actual con el resultado del comando que la sigue.

  • % se reemplaza por el nombre del archivo editado en el comando para que esto efectivamente inserte ese nombre en el archivo editado.

El nombre de archivo es el que pasó al comando vi (m) y puede contener una ruta relativa o absoluta. Si desea eliminarlo y solo conservar el nombre del archivo, ejecute

!!basename %
jlliagre
fuente
1

Si necesita hacer esto con frecuencia, puede ser útil vincular una secuencia de teclas a lo que desea, según http://vim.wikia.com/wiki/Insert_current_filename

inserta el nombre de archivo actual sin la extensión en la posición del cursor, cuando está en modo de inserción.

:inoremap \fn <C-R>=expand("%:t:r")<CR>

Para mantener la extensión use:

:inoremap \fn <C-R>=expand("%:t")<CR>

Para insertar la ruta absoluta del directorio el archivo está en uso:

:inoremap \fn <C-R>=expand("%:p:h")<CR>

Para insertar la ruta relativa del directorio el archivo está en uso:

:inoremap \fn <C-R>=expand("%:h")<CR>

Todo lo anterior funciona directamente vimpara la sesión, o puede ponerlo en el .vimrc(donde los dos puntos iniciales en la línea son opcionales).

Randall
fuente
0

Estaba buscando en Google la forma más simple de insertar el nombre del archivo actual (sin ruta o extensión) a la posición actual (sin nueva línea, sin reemplazar la línea actual). Entonces, combinando respuestas anteriores y este enlace , esto es lo que estaba buscando.

En modo de inserción :

<C-R>=expand("%:t:r")

Luego, la próxima vez (con el comando ya en el historial):

<C-R>=<UP>
kub1x
fuente