Nombre de archivo Yank/ruta del búfer actual en Vim
Pregunta
Suponiendo que el búfer actual es un archivo abierto para editar, entonces :e
no muestra E32: No file name
.
Me gustaría tirar uno o todos de:
- El nombre del archivo exactamente como se muestra en la línea de estado, p.e.
~\myfile.txt
- Una ruta completa al archivo, p.e.
c:\foo\bar\myfile.txt
- Sólo el nombre del archivo, p.e.
myfile.txt
Solución
TL;DR
:let @" = expand("%")
>
esto copiará el nombre del archivo al registro sin nombre, entonces puedes usar el viejo p
para pegarlo.y, por supuesto, puede asignar esto a una clave para un uso más rápido.
:nmap cp :let @" = expand("%")<cr>
También puedes usar esto para la ruta completa.
:let @" = expand("%:p")
Explicación
vim usa el registro sin nombre para almacenar texto que ha sido eliminado o copiado (tirado), de igual manera al pegarlo lee el texto de este registro.
Usando let
Podemos almacenar texto manualmente en el registro usando :let @" = "text"
pero también podemos almacenar el resultado de una expresión.
En el ejemplo anterior usamos la función expand
que expande los comodines y las palabras clave.en nuestro ejemplo usamos expand('%')
para expandir el nombre del archivo actual.Podemos modificarlo como expand('%:p')
para obtener el nombre completo del archivo.
Ver :help let
:help expand
:help registers
para detalles
Otros consejos
Casi lo que estás pidiendo, y que podría hacer: Ctrl+R %
tira el nombre del archivo actual en donde se encuentre (símbolo del sistema, memoria intermedia de edición, ...). Ver este Vim Consejo por más.
Si usted quiere poner el nombre del archivo en el búfer en el portapapeles a nivel de sistema, trate de cambiar el registro para @ +:
" relative path
:let @+ = expand("%")
" full path
:let @+ = expand("%:p")
" just filename
:let @+ = expand("%:t")
Editar 20140421:
Utilizo habitualmente estos, así que creé algunos atajos. Linux VIMS aparentemente funcionan de manera algo diferente que Mac VIMS , por lo que es un caso especial para eso también. Si pones lo siguiente en su ~/.vimrc
:
" copy current file name (relative/absolute) to system clipboard
if has("mac") || has("gui_macvim") || has("gui_mac")
" relative path (src/foo.txt)
nnoremap <leader>cf :let @*=expand("%")<CR>
" absolute path (/something/src/foo.txt)
nnoremap <leader>cF :let @*=expand("%:p")<CR>
" filename (foo.txt)
nnoremap <leader>ct :let @*=expand("%:t")<CR>
" directory name (/something/src)
nnoremap <leader>ch :let @*=expand("%:p:h")<CR>
endif
" copy current file name (relative/absolute) to system clipboard (Linux version)
if has("gui_gtk") || has("gui_gtk2") || has("gui_gnome") || has("unix")
" relative path (src/foo.txt)
nnoremap <leader>cf :let @+=expand("%")<CR>
" absolute path (/something/src/foo.txt)
nnoremap <leader>cF :let @+=expand("%:p")<CR>
" filename (foo.txt)
nnoremap <leader>ct :let @+=expand("%:t")<CR>
" directory name (/something/src)
nnoremap <leader>ch :let @+=expand("%:p:h")<CR>
endif
A continuación, por ejemplo <leader>cf
copiará la ruta relativa del búfer en uso (el líder por defecto es la barra invertida (\
)). A menudo utilizo estos para la ejecución de comandos en un archivo o haciendo otras cosas en la línea de comandos. Yo realmente no uso el último nombre de archivo de nombre / directorio a menudo.
Usted podría considerar asignaciones más intuitivas como <leader>cfr
para el pariente, para <leader>cfa
absoluta, <leader>cff
por sólo el nombre de archivo, <leader>cfd
para el directorio.
Si :reg
verá el nombre del archivo actual en el registro %
. Se puede pegar con "%p
, por ejemplo.
Si, como yo, a menudo se cambia al búfer 'alternativo', es muy útil que a su paso y archivo-nombre completo se ponen en el registro #
. Se puede pegar con "#p
, por ejemplo.
Nota (si acaso se trata de un comportamiento específico a mi configuración.): Estoy usando VIM 04/07/52 en Ubuntu 14.04.4 LTS
Combinando la información de un par de otras respuestas: Si usted quiere pegar la ruta completa actual a un archivo y ponerlo en el búfer de comandos en otra ventana, primero hacer :let @" = expand("%:p")
, a continuación, pasar a otra ventana y el tipo Ctrl+R "
útil para copiar un archivo que se hospedan en el mismo directorio y manteniendo la antigua abierta. Por ejemplo:
Inicio Edición de src / com / benatkin / pintura / formas / Circle.java
Tipo
:let @" = expand("%:p")
(La ruta se tiró a la memoria intermedia principal portapapeles.)Abre una nueva ventana con
:sp
Tipo
:e Ctrl+R"
Utilice las teclas de flecha para volver al círculo y el cambio a la plaza, y presione
Fin Edición de src / com / benatkin / pintura / formas / Square.java
Aquí está mi solución:
" filename / dirname of the current file {{{
" copy result to the system clipboard and echo the result
" the cb> prompt means the clipboard
" *f*ile *n*ame, ex. init.vim
map <Leader>fn :let @+ = expand("%:t") \| echo 'cb> ' . @+<CR>
" *f*ile *p*ath, ex. /home/user/nvim/init.vim
map <Leader>fp :let @+ = expand("%:p") \| echo 'cb> ' . @+<CR>
" *d*irectory *p*ath, ex. /home/user/nvim
map <Leader>dp :let @+ = expand("%:p:h") \| echo 'cb> ' . @+<CR>
" *d*irectory *n*ame, ex. nvim
map <Leader>dn :let @+ = expand("%:p:h:t") \| echo 'cb> ' . @+<CR>
" }}}
Yo uso xclip acceder a portapapeles de X, por lo que utilizo:
nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>