Arranque o nome do arquivo / caminho do buffer atual no Vim

188

Supondo que o buffer atual seja um arquivo aberto para edição, :eele não será exibido E32: No file name.

Gostaria de arrancar um ou todos:

  • O nome do arquivo exatamente como mostrado na linha de status, por exemplo ~\myfile.txt
  • Um caminho completo para o arquivo, por exemplo c:\foo\bar\myfile.txt
  • Apenas o nome do arquivo, por exemplo myfile.txt
Davetapley
fonte
Para a área de transferência: vi.stackexchange.com/questions/3686/…
Ciro Santilli escreveu:

Respostas:

209

TL; DR

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

isso copiará o nome do arquivo para o registro sem nome e você poderá usá p-lo para colá-lo. e é claro que você pode mapear isso para uma chave para uso mais rápido.

:nmap cp :let @" = expand("%")<cr>

você também pode usar isso para o caminho completo

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

Explicação

O Vim usa o registro sem nome para armazenar o texto que foi excluído ou copiado (arrancado), da mesma forma que quando você o cola, o texto é lido desse registro.

Usando letpodemos armazenar manualmente o texto no registro usando, :let @" = "text"mas também podemos armazenar o resultado de uma expressão.

No exemplo acima, usamos a função expandque expande curingas e palavras-chave. no nosso exemplo, usamos expand('%')para expandir o nome do arquivo atual. Podemos modificá-lo como expand('%:p')para o nome completo do arquivo.

Veja :help let :help expand :help registerspara detalhes

JD Frias
fonte
23
Legal apenas adicionado este ao meu vimrc: noremap <silêncio> <F4>: deixe @ + = expandir ( "%: p") <CR>
ThePosey
9
No Windows, você deve usar: deixe @ * = expandir ("%"), se quiser que esteja na área de transferência do Windows .
KFL
15
Se você estiver usando unnamedpluscomo seu uso pranchetalet @+ = expand("%")
Kevin Cox
4
Use "%:h"para obter o caminho completo sem o nome do arquivo.
Polymorphix
Relacionadas, em especial, se você precisa do diretório sem nome - stackoverflow.com/a/2233924/1882064
arcseldon
94

Quase o que você está pedindo, e isso pode fazer: Ctrl+R %puxa o nome do arquivo atual para onde você está (prompt de comando, editar buffer, ...). Veja esta dica do Vim para obter mais informações.

dwc
fonte
1
quando sair do modo de edição você pode adicionar o nome do arquivo: Ctrl" Ctrl% p
stefanB
13
Ctrl+R %funciona enquanto estiver no insertmodo - mas no editmodo, Ctrl+Rsignifica refazer.
precisa saber é o seguinte
3
O que stefanB quis dizer foi "% p para o modo de comando / normal que é o mesmo que <CR>% em insert / cmdline-mode..
graywh
Apenas para resumir ou declarar de maneira diferente: as respostas para graywh e dwc são "paste from register%". Um faz isso no modo de inserção, o outro no modo normal. No macvim, parece que o% register não pode ser substituído.
Eric Hu
existe o mesmo comando simples para obter roupa de cama? ) thx para solução
itsnikolay 15/05
73

Se você deseja colocar o nome do arquivo do buffer atual na área de transferência no nível do sistema, tente alterar o registro para @ +:

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

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

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

Edit 20140421: Eu costumo usá-los, então criei alguns atalhos. Aparentemente, o Linux Vims opera de maneira um pouco diferente do Mac Vims ; portanto, também existe um caso especial. Se você colocar o seguinte em seu ~/.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

Então, por exemplo <leader>cf, copiará o caminho relativo do buffer atual (o líder padrão é barra invertida ( \)). Costumo usá-los para executar comandos em um arquivo ou fazer outras coisas na linha de comando. Eu realmente não uso o último nome de arquivo / diretório com freqüência.

Você pode considerar mapeamentos mais intuitivos, como <leader>cfrpara relativo, <leader>cfapara absoluto, <leader>cffapenas para nome de arquivo, <leader>cfdpara diretório.

Anthony Panozzo
fonte
2
Em Windows e Mac "*e "+são equivalentes, para que possa suprimir os controlos plataforma e use apenas@+
Gabe Moothart
1
Curiosamente, isso parece não funcionar em uma função vimscript: "echo bufname ('%: p')" está em branco, mas você pode corrigir isso com mais "fnamemodify (bufname ('%'), ': p' ) "
David Ljung Madison Stellar
6

Se você :regver o nome do arquivo atual no %registro. Você pode colá-lo com "%p, por exemplo.

Se, como eu, você costuma alternar para o buffer 'alternativo', é muito útil que seu nome completo do caminho e do arquivo seja colocado no #registro. Você pode colá-lo com "#p, por exemplo.

Nota (apenas no caso de comportamento específico da minha instalação): Estou usando o VIM 7.4.52 no Ubuntu 14.04.4 LTS.

Robert
fonte
4

Combinando informações de algumas outras respostas: Se você deseja puxar o caminho completo atual para um arquivo e colocá-lo no buffer de comando em outra janela, faça-o primeiro :let @" = expand("%:p")e depois vá para outra janela e digite Ctrl+R ".

Útil para copiar um arquivo enquanto permanece no mesmo diretório e mantém o antigo aberto. Por exemplo:

Início : Edição src / com / benatkin / paint / shapes / Circle.java

  1. Tipo :let @" = expand("%:p") (o caminho é puxado para o buffer principal da área de transferência.)

  2. Abra uma nova janela com :sp

  3. Tipo :e Ctrl+R"

  4. Use as setas do teclado para voltar ao círculo, altere-o para quadrado e pressione <CR>

Fim : Edição src / com / benatkin / paint / shapes / Square.java

Benjamin Atkin
fonte
1

Aqui está a minha solução:

" 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
fonte
-1

Eu uso o xclip para acessar a área de transferência do X, então eu uso:

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>
user189557
fonte
"+ ou" * fazem a mesma coisa nativamente no vim sem precisar usar um comando externo.
Dorian B.