2009-05-27 19 views
145

Suponiendo que el búfer actual es un archivo abierto para editar, :e no muestra E32: No file name.Yank nombre de archivo/ruta del búfer actual en Vim

me gustaría dar un tirón a una o todas:

  • El nombre del archivo exactamente como se muestra en la línea de estado, por ejemplo, ~\myfile.txt
  • Una ruta de acceso completa al archivo, p. c:\foo\bar\myfile.txt
  • Solo el nombre del archivo, p. myfile.txt
+0

similares a http://stackoverflow.com/q/741024/80161 y http://stackoverflow.com/q/2233905/80161 –

+0

al portapapeles: http: //vi.stackexchange.com/questions/3686/copy-the-full-path-of-current-buffer-to-clipboard –

Respuesta

167

Prueba esto:

:let @" = expand("%")

este copiará el nombre del archivo para el registro unamed, a continuación, puede utilizar el bueno de 'p' para pegarlo. y, por supuesto, puede asignar esto a una clave para un uso más rápido.

:nmap cp :let @" = expand("%")

se puede también utilizar esto para la ruta completa

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

uso: ayudar a expandir para más detalles

+19

fresca acaba de agregar esto a mi vimrc: noremap : dejar que @ + = ampliar ("%: p") ThePosey

+5

En Windows, se debe utilizar en su lugar: dejar que @ * = ampliar ("%"), si quieres que esté en el portapapeles de _Windows_. – KFL

+8

Si está usando 'unnamedplus' como su portapapeles use' let @ + = expand ("%") ' –

76

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, ...). Vea this Vim Tip para más.

+0

Al salir del modo de edición puede agregar el nombre del archivo: ctrl- "ctrl-% p – stefanB

+1

stefanB: No puedo hacer que funcione :( – dwc

+9

'Ctrl + R%' funciona mientras está en el modo 'insert', pero en el modo' edit', 'Ctrl + R' significa rehacer. –

4

combinando la información de un par de otras respuestas: Si desea dar un tirón a la corriente completa ruta a un archivo y colóquelo en el búfer de comando en otra ventana, primero haga :let @" = expand("%:p"), luego muévase a otra ventana y escriba Ctrl+R ".

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

Start: Edición src/com/benatkin/pintura/formas/Circle.java

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

  2. abierto una nueva ventana con :sp

  3. Tipo :e Ctrl+R"

  4. Use las teclas de flecha para volver al círculo y el cambio a la plaza, y presione <CR>

Fin: Edición src/com/benatkin/pintura/formas/Cuadrado.java

44

Si usted quiere poner el nombre del archivo búfer en el portapapeles a nivel de sistema, pruebe a cambiar el registro para @ +:

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

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

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

Editar 20140421: comúnmente utilizo estos , así que creé algunos atajos. Linux Vims apparently operate slightly differently than Mac Vims, entonces hay 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 

Entonces, por ejemplo, <leader>cf copiará la ruta relativa del búfer en uso (el líder por defecto es la barra invertida (\)). A menudo los utilizo para ejecutar comandos en un archivo o hacer otras cosas en la línea de comando. Realmente no uso el último nombre de archivo/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.

+1

en Windows y Mac ' "* 'y'"' + son equivalentes, por lo que se puede prescindir de la plataforma cheques y sólo tiene que utilizar '' @ + –

+0

Curiosamente esto no parece funcionar en una función Vimscript: "nombre-búfer de eco ('%: p')" está en blanco, pero se puede solucionar este problema con el "fnamemodify (nombre-búfer más largo ('%'),':pag')" –

0

utilizo xclip acceder a portapapeles de X, por lo que utilizo:

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR> 
4

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

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

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

0

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> 
" }}} 
Cuestiones relacionadas