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?

Sam Saffron
fonte

Respostas:

87

Há um pequeno plugin que permite fazer isso.

innaM
fonte
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.

soulmerge
fonte
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
ISQ
fonte
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 ...

woto
fonte
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.
gimel
fonte
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}
Benjamin
fonte
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
Gavin Gilmour
fonte
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.

Ben
fonte
ó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 ( #)

Mesco
fonte
17
sav person.haml_spec.rb | call delete(expand('#'))
Maxim Kim
fonte
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>
Jezen Thomas
fonte
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

Yossarian42
fonte
7

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

:exe "!mv % newfilename" | e newfilename
Murftown
fonte
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.

Alex
fonte
: 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 :)

sh78
fonte
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

Наглый Спамер
fonte
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

DBMarcos99
fonte
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


fonte
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>
Jonas Geiregat
fonte
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>
dechimp
fonte
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 #

sitaktif
fonte