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
¿Fue útil?

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

     
      
  1. Tipo :let @" = expand("%:p") (La ruta se tiró a la memoria intermedia principal portapapeles.)

  2.   
  3. Abre una nueva ventana con :sp

  4.   
  5. Tipo :e Ctrl+R"

  6.   
  7. Utilice las teclas de flecha para volver al círculo y el cambio a la plaza, y presione

  8.   
     

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top