Pergunta

Assumindo que o buffer atual é um arquivo aberto para edição, assim :e não exibe E32: No file name.

Gostaria de arrancar um ou todos:

  • O nome do arquivo exatamente como mostram 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
Foi útil?

Solução

TL; DR

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

isso irá copiar o nome do arquivo para o registo unamed , então você pode usar o bom p velho para colá-lo. e, claro, você pode mapear isso para uma chave para uso mais rápido.

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

Você também pode usar isso para caminho completo

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

Explicação

Vim usa o registo anónimo para armazenar texto que foi excluído ou copiado (arrancada), da mesma forma quando você colá-lo lê o texto deste registo.

Usando let podemos armazenar manualmente texto no registo utilizando :let @" = "text" mas também podemos armazenar o resultado de uma expressão.

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

Veja :help let :help expand :help registers para mais detalhes

Outras dicas

Quase o que você está pedindo, e que poderia fazer: Ctrl+R % puxa o nome do arquivo atual para onde você está (prompt de comando, buffer de edição, ...). Consulte esta dica Vim para mais.

Se você quiser colocar o nome do arquivo de buffer atual em sua área de transferência ao nível do sistema, tente alterar o registo para @ +:

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

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

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

Editar 20140421: Eu geralmente usam estes, então eu criei alguns atalhos. Linux Vims aparentemente funcionam de forma ligeiramente diferente do que o Mac Vims , por isso não é um caso especial para isso também. 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

Em seguida, por exemplo <leader>cf irá copiar o caminho relativo do buffer atual (o líder padrão é barra invertida (\)). Costumo usá-los para executar comandos em um arquivo ou fazendo outras coisas na linha de comando. Eu realmente não usar o último nome do arquivo nome / diretório muitas vezes.

Você pode considerar mapeamentos mais intuitivas como <leader>cfr para o parente, <leader>cfa por absoluta, <leader>cff por apenas filename, <leader>cfd para o diretório.

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

Se, como eu, muitas vezes você mudar para o buffer 'alternativo', é muito útil que o seu pleno caminho-and-file-name são colocados no registo #. Você pode colá-lo com "#p, por exemplo.

Note (apenas no caso de este é um comportamento específico para a minha configuração.): Eu estou usando VIM 7.4.52 no Ubuntu 14.04.4 LTS

A combinação de informações a partir de um par de outras respostas: Se você quiser arrancar o caminho completo atual para um arquivo e colocá-lo para o buffer de comando em outra janela, primeiro fazer :let @" = expand("%:p"), em seguida, passar para outro Ctrl+R " janela e digite

útil para copiar um arquivo enquanto permanecer no mesmo diretório e mantendo o antigo aberto. Por exemplo:

Iniciar : Edição src / com / benatkin / pintar / formas / Circle.java

  1. Tipo :let @" = expand("%:p") (O caminho fica arrancou à área de transferência principal.)

  2. Abra uma nova janela com :sp

  3. Tipo :e Ctrl+R"

  4. Utilize as teclas de seta para voltar ao círculo e alterá-lo para Square, e pressione

Fim : Edição src / com / benatkin / pintar / formas / Square.java

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

Eu uso xclip a prancheta acesso de X, então eu uso:

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top