Nombre de archivo Yank / ruta del búfer actual en Vim

188

Asumiendo que el búfer actual es un archivo abierto para editar, :eno se 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, por ejemplo ~\myfile.txt
  • Una ruta completa al archivo, p. Ej. c:\foo\bar\myfile.txt
  • Solo el nombre del archivo, por ejemplo myfile.txt
davetapley
fuente
Al portapapeles: vi.stackexchange.com/questions/3686/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

209

TL; DR

:let @" = expand("%")>

esto copiará el nombre del archivo en el registro sin nombre , luego puede usar el viejo ppara 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 utiliza el registro sin nombre para almacenar texto que se ha eliminado o copiado (eliminado), del mismo modo que cuando lo pega, lee el texto de este registro.

Usando letpodemos almacenar manualmente el texto en el registro usando, :let @" = "text"pero también podemos almacenar el resultado de una expresión.

En el ejemplo anterior, utilizamos la función expandque expande comodines y palabras clave. en nuestro ejemplo, usamos expand('%')para expandir el nombre del archivo actual. Podemos modificarlo expand('%:p')para el nombre completo del archivo.

Ver :help let :help expand :help registerspara más detalles

JD Frias
fuente
23
Cool acaba de agregar esto a mi vimrc: noremap <silent> <F4>: let @ + = expand ("%: p") <CR>
ThePosey
9
En Windows, debería usar: let @ * = expand ("%"), si desea que esté en el portapapeles de Windows .
KFL
15
Si está utilizando unnamedpluscomo su uso portapapeleslet @+ = expand("%")
Kevin Cox
44
Use "%:h"para obtener la ruta completa sin el nombre del archivo.
Polymorphix
Relacionado, en particular si necesita el directorio sin nombre de archivo - stackoverflow.com/a/2233924/1882064
arcseldon el
94

Casi lo que está pidiendo, y podría hacer: Ctrl+R %extrae el nombre del archivo actual donde está (símbolo del sistema, búfer de edición, ...). Vea este Consejo Vim para más información.

dwc
fuente
1
cuando salga del modo de edición, puede agregar el nombre del archivo: ctrl- "ctrl-% p
stefanB
13
Ctrl+R %funciona mientras está en insertmodo, pero en editmodo Ctrl+Rsignifica rehacer.
Kevin Panko
3
Lo que stefanB quería decir era "% p para el modo normal / comando. Es lo mismo que <Cr>% en modo insert / cmdline.
graywh
Solo para resumir o indicar de manera diferente: las respuestas para graywh y dwc son "pegar desde el registro%". Uno hace esto para el modo de inserción, el otro para el modo normal. En macvim, parece que el registro% no se puede sobrescribir.
Eric Hu
¿existe el mismo comando simple para obtener el número de lino? ) gracias por la solución
itsnikolay
73

Si desea poner el nombre de archivo del búfer actual en su portapapeles a nivel del sistema, intente cambiar el registro a @ +:

" relative path
:let @+ = expand("%")

" full path
:let @+ = expand("%:p")

" just filename
:let @+ = expand("%:t")

Editar 20140421: Normalmente los uso, así que creé algunos accesos directos. Los Vims de Linux aparentemente funcionan de manera ligeramente diferente a los Vims de Mac , por lo que también hay un caso especial para eso. Si pones lo siguiente en tu ~/.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

Luego, por ejemplo <leader>cf, copiará la ruta relativa del búfer actual (el líder predeterminado es la barra invertida ( \)). A menudo los uso para ejecutar comandos en un archivo o hacer otras cosas en la línea de comandos. Realmente no uso el último nombre de archivo / nombre de directorio a menudo.

Puede considerar asignaciones más intuitivas como <leader>cfrpara relativo, <leader>cfapara absoluto, <leader>cffsolo para nombre de archivo, <leader>cfdpara directorio.

Anthony Panozzo
fuente
2
En Windows y Mac "*y "+son equivalentes, por lo que puede prescindir de las comprobaciones de la plataforma y simplemente usar@+
Gabe Moothart
1
Por extraño que parezca, esto no parece funcionar en una función vimscript: "echo bufname ('%: p')" está en blanco, pero puede solucionar esto con el más largo "fnamemodify (bufname ('%'), ': p' ) "
David Ljung Madison Stellar
6

Si lo hace :reg, verá el nombre del archivo actual en el %registro. Puedes pegarlo con "%p, por ejemplo.

Si, como yo, a menudo cambia al búfer 'alternativo', es muy útil que su ruta completa y nombre de archivo se coloquen en el #registro. Puedes pegarlo con "#p, por ejemplo.

Nota (en caso de que este sea un comportamiento específico de mi configuración): estoy usando VIM 7.4.52 en Ubuntu 14.04.4 LTS.

Robert
fuente
4

Combinación de información de un par de otras respuestas: si desea extraer la ruta completa actual a un archivo y colocarla en el búfer de comandos en otra ventana, primero haga :let @" = expand("%:p"), luego vaya a otra ventana y escriba Ctrl+R ".

Útil para copiar un archivo mientras permanece en el mismo directorio y mantiene abierto el antiguo. Por ejemplo:

Inicio : Edición de src / com / benatkin / paint / shapes / Circle.java

  1. Tipo :let @" = expand("%:p") (La ruta se extrae del búfer del portapapeles principal).

  2. Abre una nueva ventana con :sp

  3. Tipo :e Ctrl+R"

  4. Use las teclas de flecha para volver a Circle y cambiarlo a Square, y presione <CR>

Fin : Edición de src / com / benatkin / paint / shapes / Square.java

Benjamin Atkin
fuente
1

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>
" }}}
Jabba
fuente
-1

Uso xclip para acceder al portapapeles de X, así que uso:

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>
usuario189557
fuente
"+ o" * hacen lo mismo de forma nativa en vim sin tener que usar un comando externo.
Dorian B.