Renomeando o arquivo atual no Vim


392

Como devo renomear meu arquivo atual no Vim?

Por exemplo:

  • Estou editando person.html_erb_spec.rb
  • Eu gostaria que fosse renomeado para person.haml_spec.rb
  • Eu gostaria de continuar editando person.haml_spec.rb

Como eu faria isso com elegância?

Respostas:


87

Há um pequeno plugin que permite fazer isso.


9
Esta versão atualizada do Rename.vim manipula o CWD corretamente - sempre salva o arquivo no diretório do original.
sickill 4/09/11

48
P: "que tipo de esquisito sociopata coloca espaços no nome do diretório?" - A: o cara que iniciou o projeto há muito tempo e agora é seu chefe ... promoveu a codificação para sua verdadeira área de especialização: seguir os modismos da metodologia de desenvolvimento e forçá-los à equipe.
precisa saber é

3
@AaronMahan Corrigi o Rename2.vim (desconsiderando a versão mais inteligente, porém mais complexa, do DelvarWorld) para permitir espaços nos caminhos e bifurquei -o aqui: github.com/aehlke/vim-rename3 Sinta-se à vontade para enviar solicitações pull para funcionalidades ainda mais inteligentes!
aehlke

4
@Stabledog Microsoft, aparentemente. Program Files (x86). Sempre que esse diretório precisar ser trabalhado, ele deverá ser colocado entre aspas. O que é muito.
JackHasaKeyboard

5
@JackHasaKeyboard: +10. "Arquivos de programas (x86)" vence o "pior nome de diretório de todos os tempos em um sistema operacional que não possui links simbólicos". :)
Stabledog

451

O comando é chamado :saveas, mas infelizmente não excluirá seu arquivo antigo, você precisará fazer isso manualmente. veja :help saveaspara mais informações.

EDITAR:

A maioria das instalações do vim possui um gerenciador de arquivos integrado, que você pode usar para essas operações. Tente :Exploreno modo de comando (eu na verdade mapeia isso para uma tecla de função, é muito útil). Você pode renomear arquivos Rou excluí-los com D, por exemplo. Mas pressionar <F1>o explorer fornecerá uma visão geral melhor.


6
Eu não acho que seja estranho comparado a outros editores onde você normalmente não pode mover um arquivo. Em vez disso, você deve acessar o gerenciador de arquivos de sua escolha, renomear o arquivo e voltar ao seu editor. Se você tiver sorte, precisará sair e reiniciar o editor, caso não receba a notificação de alteração do nome do arquivo.
Rafael Bugajewski

130
Você também pode gostar de: Sexo (abreviação de split explore :-))
Peter Jankuliak

6
Além disso,: e abrirá o explorar no painel atual. Menos excitante que: Sexo, mas mais eficiente;).
31712 Josh

56
Para os intrépidos, verticais: Sexo é: Vex.
hobbes3

5
@ Josh: E funciona para mim,: e não funciona para mim. Eu uso: e para editar outro arquivo na mesma janela.
omar

159

Se você usa git e já possui o plugin fugitive.vim do tpope, basta:

:Gmove newname

Isso vai:

  1. Renomeie seu arquivo no disco.
  2. Renomeie o arquivo no git repo.
  3. Recarregue o arquivo no buffer atual.
  4. Preservar desfazer histórico.

Se seu arquivo ainda não foi adicionado a um repositório git, adicione-o primeiro:

:Gwrite

4
Lágrimas saindo dos meus olhos. A resposta perfeita!
Farid Nouri Neshat

3
Eu sacrifiquei duas cabras em homenagem a esta resposta! Mas tenho um pequeno problema com isso, porque você precisa digitar o caminho a partir da raiz da árvore de trabalho; e isso geralmente fica bastante longo em qualquer projeto. Existe uma solução para isso?
xor

11
Isso é ótimo! Eu continuo descobrindo coisas novas que os fugitivos podem fazer.
Rich Churcher

8
@xxor: como mencionado na resposta da Mesco, você pode usar Ctrl + R% para inserir o nome do arquivo atual, que pode ser editado.
Deltab

4
Para combinar alguns comentários aqui: :Gmoverequer o caminho relativo para o novo nome do arquivo. Uma boa maneira de fazer isso é digitar o :Gmove <ctrl-r>%que acrescenta o caminho / nome do arquivo atual.
shmup

80

Estou fazendo isso com o plugin NERDTree:

:NERDTreeFind

então aperte m

Para renomear, você pode escolher (m)ove the current nodee alterar o nome do arquivo. Também existem opções como excluir, copiar, mover, etc ...


11
você sabe o que é a principal maneira que eu coisas renomear esses dias
Sam Saffron

2
Este funciona muito bem. Definitivamente recomendo.
Matt Setter

Adoro a ideia. Este será o meu principal método de alteração de nome de arquivo agora.
SLN

72
  • Escreva o arquivo durante a edição - :w newname- para criar uma cópia.
  • Comece a editar a nova cópia - :e#.
  • (Opcionalmente) remova a cópia antiga - :!rm oldname.

No Windows, a 3ª etapa opcional muda um pouco:

  • (Opcionalmente) remova a cópia antiga do Windows - :!del oldname.

3
Eu uso essa abordagem o tempo todo, no entanto, a desvantagem é que você perde o seu desfazer árvore - assim você não pode desfazer nada antes do: e
rampion

7
Agradável. Aparentemente Ctrl-6 faz o mesmo que: e #
Glenn Jackman

você também pode abrir o diretório, mover o cursor para o arquivo e pressionar "D" para excluir um arquivo.
quer

38
A maneira mais direta de imho é 1) renomear o buffer atual :f newname2) salvar :w3) (opcionalmente) !rm oldname. A vantagem é que seu histórico de desfazer é preservado.
Kynan

3
:saveasé melhor nesse sentido, @rampion - e faz o que @kynan escreveu.
9788 Leronyon

36

Se o arquivo já estiver salvo:

:!mv {file location} {new file location}
:e {new file location}

Exemplo:

:!mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala
:e src/test/scala/myNewFile.scala

Requisitos de permissão:

:!sudo mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala

Salvar como:

:!mv {file location} {save_as file location}
:w
:e {save_as file location} 


Para Windows não verificado

:!move {file location} {new file location}
:e {new file location}

5
Você poderia pelo menos explicar por que votou negativamente nesta resposta.
Benjamin

31

Eu recomendaria :Renamedo eunuco do tpope para isso.

Ele também inclui vários outros comandos úteis.

O comando Renomear está definido da seguinte forma no momento (verifique o repositório para ver se há atualizações!):

command! -bar -nargs=1 -bang -complete=file Rename :
  \ let s:file = expand('%:p') |
  \ setlocal modified |
  \ keepalt saveas<bang> <args> |
  \ if s:file !=# expand('%:p') |
  \   call delete(s:file) |
  \ endif |
  \ unlet s:file

31

Você também pode fazer isso usando o netrw

O comando explore abre netrw no diretório do arquivo aberto

:E

Mova o cursor sobre o arquivo que deseja renomear:

R

Digite o novo nome, pressione enter, pressione y.


ótimo! eu nem sabia sobre o netrw.
Javadba 27/06

31

Curto, seguro, sem plug-in:

:sav new_name
:!rm <C-R>#  // or !del <C-R># for windows

control+ R, #será expandido instantaneamente para um arquivo alternativo (caminho editado anteriormente na janela atual) antes de pressionar Enter. Isso nos permite revisar o que exatamente vamos excluir. O uso de canos |nesse caso não é seguro, porque, se savpor algum motivo falhar, #ainda apontará para outro local (ou para nada). Isso significa !rm #ou delete(expand(#))pode excluir um arquivo completamente diferente! Faça-o manualmente com cuidado ou use um bom script (eles são mencionados em muitas respostas aqui).

Educacional

... ou tente criar uma função / comando / script você mesmo. Comece de sth simple como:

command! -nargs=1 Rename saveas <args> | call delete(expand('#')) | bd #

após o vimrc recarregar, basta digitar :Rename new_filename. Qual é o problema com este comando?

Teste de segurança 1: O que faz :Renamesem argumento?

Sim, ele exclui o arquivo oculto em '#'!

Solução: você pode usar, por exemplo. condições ou trydeclaração como essa:

command! -nargs=1 Rename try | saveas <args> | call delete(expand('#')) | bd # | endtry

Teste de segurança 1: :Rename (sem argumento) gera um erro:

E471: Argumento necessário

Teste de segurança 2: E se o nome for o mesmo que o anterior?

Teste de segurança 3: E se o arquivo estiver em um local diferente do seu real?

Conserte você mesmo. Para facilitar a leitura, você pode escrevê-lo desta maneira:

function! s:localscript_name(name):
  try
    execute 'saveas ' . a:name
    ...
  endtry
endfunction
command! -nargs=1 Rename call s:localscript_name(<f-args>)

notas

  • !rm #é melhor que !rm old_name-> você não precisa se lembrar do nome antigo

  • !rm <C-R>#é melhor do que !rm #quando fazê-lo manualmente -> você verá o que realmente remove (motivo de segurança)

  • !rmgeralmente não é muito seguro ... mvpara um local de lixo é melhor

  • call delete(expand('#'))é melhor do que o comando shell (OS agnóstico), mas mais tempo para escrever e impossível de usar control+R

  • try | code1 | code2 | tryend -> quando ocorrer um erro enquanto o código1, não execute o código2

  • :sav(ou :saveas) é equivalente a :f new_name | w- consulte file_f - e preserva o histórico de desfazer

  • expand('%:p')fornece o caminho completo da sua localização ( %) ou da localização do arquivo alternativo ( #)


17
sav person.haml_spec.rb | call delete(expand('#'))

agradável! não sabia sobrecall delete(expand('#'))
Kyle Wild

10

Há uma função no .vimrc de Gary Bernhardt que lida com isso.

function! RenameFile()
let old_name = expand('%')
let new_name = input('New file name: ', expand('%'), 'file')
if new_name != '' && new_name != old_name
    exec ':saveas ' . new_name
    exec ':silent !rm ' . old_name
    redraw!
endif
endfunction
map <leader>n :call RenameFile()<cr>

5
Me deu um voto negativo como quiser. Pelo menos eu posso renomear arquivos.
precisa

Esta é uma ótima resposta, nenhum plug-in extra é necessário.
Wpp 19/02

8
:!mv % %:h/new_name

Registrar %contém o nome do arquivo atual. '%:h'mostra o diretório 'head' que contém o arquivo atual, por exemplo: %:hretorna /abc/defquando o caminho completo do arquivo éabc/dev/my.txt


7

Que tal isso (aprimorado pela sugestão de Jake):

:exe "!mv % newfilename" | e newfilename

Hmmm, eu deveria esclarecer que trabalhou em MacVim ontem, mas eu estava sshed em um servidor e tentou fazê-lo hoje e 2º comando não parece ser tratado como um comando de cólon ...
murftown

11
Na verdade, agora também não está funcionando no MacVim. De volta à prancheta! :)
murftown

2
Deveria ser:exe "!mv % newfilename" | e newfilename
Jake

Obrigado Jake, isso é um pouco melhor que a minha solução. Atualizada.
Murftown #

7

O Vim tem uma renamefunção, mas infelizmente não retém a história.

A maneira mais fácil e independente de OS de renomear um arquivo sem perder o histórico seria:

:saveas new_file_name
:call delete(expand('#:p'))

expand('#:p') retorna o caminho completo do arquivo mais antigo.

Use :bd #se você também deseja excluir o arquivo mais antigo da lista de buffers.

Ou crie um plugin

Se você deseja usar um comando rápido para renomear o arquivo, adicione um novo arquivo em ~ / .vim / plugin com o seguinte conteúdo:

function! s:rename_file(new_file_path)
  execute 'saveas ' . a:new_file_path
  call delete(expand('#:p'))
  bd #
endfunction

command! -nargs=1 -complete=file Rename call <SID>rename_file(<f-args>)

O comando Renameajudará você a renomear rapidamente um arquivo.


: chamada delete ('<Cr> #') é mais fácil de escrever.
MaikoID

7

Existe um plugin bem maior chamado vim-eunuch, de Tim Pope, que inclui uma função de renomeação e outras guloseimas (excluir, encontrar, salvar tudo, chmod, sudo edit, ...).

Para renomear um arquivo no vim-eunuch:

:Move filename.ext

Comparado com rename.vim:

:rename[!] filename.ext

Salva algumas teclas :)


E de fato tem algumas outras funções muito úteis!
Pierre-Adrien Buisson

5

Para renomear arquivos existentes sem usar plug-ins, você deve usar o comando

:Explore

Este comando permite explorar arquivos no diretório, excluí-los ou renomeá-los. você deve navegar para o arquivo necessário no Rcomando explorer than type, que permitirá que você renomeie o nome do arquivo


3

Não sei se esse é o método "mais fácil", mas, assumindo que você já salvou seu arquivo (: w), invocaria o shell (: sh) e faria um simples cp foo foo.bak Para voltar ao editor use Ctrl-D / Sair. Lista útil de comandos do editor vi neste link


Isso irá copiar o arquivo, não renomeá-lo.
innaM

Ah - eu interpretei errado "Eu gostaria de continuar editando person.haml_spec.rb" Meu mal!
DBMarcos99

Suponho que você poderia:! cp foo foo.new e depois: e foo.new?
DBMarcos99

3

Você também pode usar: f seguido por: w


3
Isso não remove o arquivo antigo.
precisa

1

Esse pequeno script não é perfeito (o retorno de carro extra que você precisa pressionar), mas faz o trabalho.

function Rename()
  let new_file_name = input('New filename: ')
  let full_path_current_file = expand("%:p")
  let new_full_path = expand("%:p:h")."/".new_file_name
  bd    
  execute "!mv ".full_path_current_file." ".new_full_path
  execute "e ".new_full_path
endfunction                                                                                                                                                                                                                                 

command! Rename :call Rename()
nmap RN :Rename<CR>

0

Outra maneira é usar o netrw, que é uma parte nativa do vim.

:e path/to/whatever/folder/

Depois, há opções para excluir, renomear etc.

Aqui está um mapa de teclas para abrir o netrw na pasta do arquivo que você está editando:

map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>

0

:sav newfile | !rm #

Observe que ele não remove o arquivo antigo da lista de buffers. Se isso é importante para você, você pode usar o seguinte:

:sav newfile | bd# | !rm #

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.