Como insiro o nome do arquivo atual no conteúdo do Vim?

39

Após algumas pesquisas, soube que :echo @%exibe o nome do arquivo atual na linha inferior da tela do vim.

Gostaria de despejar o nome do arquivo (com e sem o caminho completo) no conteúdo do arquivo sem sair vim.

Há alguma maneira de fazer isso?

mtk
fonte

Respostas:

28

Tenho certeza de que existem outras maneiras de fazer isso ... mas o comando principal que você deseja é :r[ead]inserir a saída de um comando no buffer.

Então, para inserir apenas o nome do arquivo:

:r! echo %

E, para incluir o caminho completo:

:r! echo %:p

Para mais informações:

:help read
:help filename-modifiers 
JC Yamokoski
fonte
37

O nome do arquivo atual está no "%registro, para que você possa inseri-lo (enquanto estiver no modo de inserção) com <c-r>%; o caminho completo pode ser inserido com <c-r>=expand("%:p"). Você pode fazer uma macro se a usar com frequência. Para mais, truques semelhantes, consulte :h expande :h "=.

Kevin
fonte
Talvez eu esteja interpretando mal isso, mas não está <c-r>mapeado como o comando refazer?
JC Yamokoski
10
No modo de inserção, <c-r>especifica que o próximo caractere é um registro.
Kevin
Bem, obrigado. Totalmente esqueceu de mudar para o modo de inserção ...
JC Yamokoski
Você também pode fazer "%pnos modos normal ou visual.
precisa saber é o seguinte
15

Como pode ser visto em :h registers, o "%registro contém o nome do arquivo atual. O :pu[t]comando insere o conteúdo de um registro no texto.

Portanto, para inserir o nome do arquivo real, você pode digitar um destes, no modo de comando:

:put %

ou

"%p

Para inserir o nome do arquivo com o caminho completo, digite

:put=expand('%:p')

no modo de comando.


Mais informações:

:h pu[t]

Digitando, "rpvocê pode colar o conteúdo do registro "r.

braunmagrin
fonte
3
A :put "%:p"não parece trabalhar para mim. Parece funcionar apenas com expand () , como em :put =expand('%:p'):, o que o torna não menos complicado do que <c-r>=expand('%:p')infelizmente.
akavel 16/09/15
@akavel Você está correto, eu vou atualizar a resposta. Obrigado! ;) E, de fato, ambos são igualmente detalhados.
braunmagrin
5

Uma maneira simples é executar:

!!echo %
  • !! está substituindo a linha atual pelo resultado do comando a seguir.

  • % é substituído pelo nome do arquivo editado no comando, para que ele efetivamente insira esse nome no arquivo editado.

O nome do arquivo é aquele que você passou para o comando vi (m) e pode conter um caminho relativo ou absoluto. Se você desejar removê-lo e reter apenas o nome do arquivo, execute

!!basename %
jlliagre
fonte
1

Se você precisar fazer isso com frequência, pode ser útil vincular uma sequência de chaves ao que você deseja, conforme http://vim.wikia.com/wiki/Insert_current_filename

insere o nome do arquivo atual sem a extensão na posição do cursor, quando você estiver no modo de inserção.

:inoremap \fn <C-R>=expand("%:t:r")<CR>

Para manter a extensão, use:

:inoremap \fn <C-R>=expand("%:t")<CR>

Para inserir o caminho absoluto do diretório em que o arquivo está sendo usado:

:inoremap \fn <C-R>=expand("%:p:h")<CR>

Para inserir o caminho relativo do diretório em que o arquivo está sendo usado:

:inoremap \fn <C-R>=expand("%:h")<CR>

Acima, todos trabalham diretamente vimpara a sessão ou você pode colocá-lo no .vimrc(onde os dois pontos principais na linha são opcionais).

Randall
fonte
0

Eu estava pesquisando no Google uma maneira mais simples de inserir o nome do arquivo atual (sem caminho ou extensão) na posição atual (sem nova linha, sem substituir a linha atual). Então, combinando respostas anteriores e este link , é isso que eu estava procurando.

No modo de inserção :

<C-R>=expand("%:t:r")

Da próxima vez (com o comando já no histórico):

<C-R>=<UP>
kub1x
fonte