Vim'de geçerli dosyayı yeniden adlandırma


392

Vim'deki mevcut dosyamı nasıl yeniden adlandırmalıyım?

Örneğin:

  • Ben düzenliyorum person.html_erb_spec.rb
  • Yeniden adlandırılmasını istiyorum person.haml_spec.rb
  • Düzenlemeye devam etmek istiyorum person.haml_spec.rb

Bunu zarif bir şekilde nasıl yapabilirim?

Yanıtlar:


87

Bunu yapmanıza izin veren küçük bir eklenti var.


9
Rename.vim'in bu güncellenmiş sürümü CWD'yi doğru şekilde işler - dosyayı her zaman orijinal olanın dizinine kaydeder.
sickill

48
S: "Ne tür bir sosyopatik garip dir adına boşluk koyar?" - A: uzun zaman önce patronunuz olan projeye başlayan adam ... gerçek uzmanlık alanına kodlamadan terfi etti: kalkınma metodolojisi heveslerini takip etmek ve takımda zorlamak.
Stabledog

3
@AaronMahan Yollardaki alanlara izin vermek için Rename2.vim'i (daha akıllı ama daha karmaşık DelvarWorld sürümünü göz ardı ederek) düzelttim ve burada çatalladım : github.com/aehlke/vim-rename3 Daha akıllı işlevsellik için çekme istekleri göndermekten çekinmeyin!
aehlke

4
@Stabledog Microsoft, görünüşe göre. Program Files (x86). Bu dizinin birlikte çalışması gereken her zaman tırnak işaretleri içine alınmalıdır. Bu çok, çok.
JackHasaKeyboard

5
@JackHasaKeyboard: +10. "Program Files (x86)" her zaman "Symlinks yok olan bir işletim sisteminde en kötü dizin adı" kazanır. :)
Stabledog

451

Komut çağrılır :saveas, ancak maalesef eski dosyanızı silmez, bunu manuel olarak yapmanız gerekir. :help saveasdaha fazla bilgi için bakınız .

DÜZENLE:

Çoğu vim kurulumunda, bu tür işlemler için kullanabileceğiniz entegre bir dosya gezgini vardır. :ExploreKomut modunda deneyin (aslında bir işlev tuşuyla eşleştiririm, çok kullanışlıdır). Örneğin, dosyaları yeniden adlandırabilir Rveya silebilirsiniz D. Ancak kaşifin üzerine basmak <F1>size daha iyi bir genel bakış sunacaktır.


6
Normalde bir dosyayı taşıyamayacağınız diğer editörlere kıyasla garip olduğunu düşünmüyorum. Bunun yerine, istediğiniz dosya yöneticisine gitmeniz, dosyayı yeniden adlandırmanız ve düzenleyicinize geri dönmeniz gerekir. Şanslıysanız, dosya adı bildirim bildirimi almadıysa düzenleyicinizden çıkmanız ve yeniden başlatmanız gerekir.
Rafael Bugajewski

130
Şunu

6
Ayrıca,: e geçerli bölmede keşfetmeyi açacaktır. Daha az heyecan verici: Seks ama daha verimli;).
Josh

56
Cesur, dikey için: Cinsiyet: Vex.
hobbes3

5
@Josh: E benim için çalışıyor,: e benim için çalışmıyor. Aynı pencerede başka bir dosyayı düzenlemek için: e kullanıyorum.
omar

159

Git kullanıyorsanız ve zaten tpope'nin eklentisi fugitive.vim'i kullanıyorsanız :

:Gmove newname

Bu irade:

  1. Diskteki dosyanızı yeniden adlandırın.
  2. Git deposunda dosyayı yeniden adlandırın.
  3. Dosyayı geçerli arabelleğe yeniden yükleyin.
  4. Geri alma geçmişini koru.

Dosyanız henüz bir git deposuna eklenmediyse, önce ekleyin:

:Gwrite

4
Gözlerimden gözyaşları geliyor. Mükemmel cevap!
Farid Nouri Neshat

3
Bu cevabın onuruna iki keçiyi feda ettim! Ama bununla ilgili küçük bir sorunum var, çünkü çalışma ağacının kökünden yolu yazmanız gerekiyor; ve bu genellikle herhangi bir projede oldukça uzar. Bunun bir çözümü var mı?
xor

1
Bu harika! Kaçakların yapabileceği yeni şeyler bulmaya devam ediyorum.
Rich Churcher

8
@xxor: Mesco'nun cevabında belirtildiği gibi, geçerli dosya adını eklemek için Ctrl + R% kullanabilirsiniz, daha sonra düzenlenebilir.
deltab

4
Burada birkaç yorumu birleştirmek için: :Gmoveyeni dosya adı için göreceli yol gerekir. Bunu yapmanın güzel bir yolu :Gmove <ctrl-r>%, geçerli yolu / dosya adını ekleyen türü yazmaktır.
shmup

80

NERDTree eklentisi ile yapıyorum:

:NERDTreeFind

sonra basın m

Yeniden adlandırmak için (m)ove the current nodedosya adını seçebilir ve değiştirebilirsiniz. Ayrıca silme, kopyalama, taşıma vb. Seçenekler de vardır.


1
Ne biliyorsun, bu günlerde şeyleri yeniden adlandırdığım ana yol
Sam Saffron

2
Bu gerçekten iyi çalışıyor. Kesinlikle tavsiye ederim.
Matt Setter

Fikri seviyorum. Bu benim ana değişiklik dosya adı yöntemim olacak.
SLN

72
  • Bir :w newnamekopya oluşturmak için - - düzenlerken dosyayı yazın .
  • Yeni kopyayı düzenlemeye başlayın - :e#.
  • (İsteğe bağlı) eski kopyayı kaldırın - :!rm oldname.

Windows'da isteğe bağlı 3. adım biraz değişir:

  • (İsteğe bağlı) eski Windows kopyasını kaldırın - :!del oldname.

3
Bu yaklaşımı her zaman kullanıyorum, ancak olumsuz, geri alma ağacınızı kaybetmeniz - bu yüzden daha önce hiçbir şeyi geri
alamazsınız

7
Güzel. Görünüşe göre Ctrl-6 aynı şeyi yapar: e #
glenn jackman

ayrıca dizini açabilir, imleci dosyaya taşıyabilir ve bir dosyayı silmek için "D" tuşuna basabilirsiniz.
Peder

38
Daha basit bir yol imho 1) mevcut arabelleği yeniden adlandırın :f newname2) kaydedin :w3) (isteğe bağlı olarak) !rm oldname. Avantajı geri alma geçmişinizin korunmasıdır.
kynan

3
:saveasbu konuda daha iyi, @ rampion - ve @kynan'ın yazdıklarını yapar.
lericson

36

Dosya zaten kaydedildiyse:

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

Misal:

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

İzin Gereksinimleri:

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

Farklı kaydet:

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


Windows için Doğrulanmamış

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

5
En azından bu cevaba neden oy verdiğinizi açıklayabilirsiniz.
Benjamin

31

Bunun için :Renametpope eunuch tavsiye ederim .

Ayrıca diğer kullanışlı komutları da içerir.

Yeniden Adlandır komutu şu anda aşağıdaki gibi tanımlanmıştır (güncellemeleri kontrol edin!):

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

Bunu netrw kullanarak da yapabilirsiniz

Explore komutu netrw dosyasını açık dosyanın dizininde açar

:E

İmleci yeniden adlandırmak istediğiniz dosyanın üzerine getirin:

R

Yeni adı yazın, enter tuşuna basın, y tuşuna basın.


harika! Netrw hakkında bile bir şey bilmiyordum.
javadba

31

Kısa, güvenli, eklenti olmadan:

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

control+ R, tuşuna basmadan önce #anında alternatif bir dosyaya (geçerli pencerede önceden düzenlenmiş yol) genişler Enter. Bu, tam olarak neyi sileceğimizi incelememizi sağlar. |Böyle bir durumda boru kullanmak güvenli değildir , çünkü savherhangi bir nedenle başarısız olursa #, yine de başka bir yere (veya hiçbir şeye) işaret etmez. Bu tamamen farklı dosya anlamına gelir !rm #veya delete(expand(#))silebilir! Bu yüzden dikkatli bir şekilde elle yapın veya iyi bir senaryo kullanın (burada birçok cevapta belirtilmiştir).

eğitici

... veya kendiniz bir işlev / komut / komut dosyası oluşturmayı deneyin. Sth simple gibi başlayın:

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

vimrc yeniden yüklendikten sonra sadece yazın :Rename new_filename. Bu komutla ilgili sorun nedir?

Güvenlik testi 1::Rename Tartışma olmadan ne yapar ?

Evet, '#' içinde gizli olan dosyayı siler!

Çözüm: örn. koşullar veya tryifade şöyle:

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

Güvenlik testi 1: :Rename (bağımsız değişken olmadan) bir hata verir:

E471: Tartışma gerekli

Güvenlik testi 2: İsim öncekiyle aynı olacaksa ne olur?

Güvenlik testi 3: Dosya gerçek dosyadan farklı bir konumda olursa ne olur?

Kendiniz düzeltin. Okunabilirlik için bu şekilde yazabilirsiniz:

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

notlar

  • !rm #daha iyidir !rm old_name-> eski adı hatırlamanıza gerek yoktur

  • !rm <C-R>#!rm #elle ne zaman yaptığınızdan daha iyi -> gerçekten neyi kaldırdığınızı göreceksiniz (güvenlik nedeni)

  • !rmgenellikle çok güvenli değildir ... mvbir çöp kutusuna daha iyi

  • call delete(expand('#'))kabuk komutundan (OS agnostik) daha iyidir ancak yazılması daha uzundur ve kullanımı imkansızdır control+R

  • try | code1 | code2 | tryend -> kod1 sırasında hata oluştuğunda, kod2'yi çalıştırmayın

  • :sav(veya :saveas), :f new_name | wbkz. file_f - ve geri alma geçmişini korur

  • expand('%:p')konumunuzun ( %) veya alternatif dosyanın ( #) tüm yolunu verir


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

Güzel! hakkında bilmiyordumcall delete(expand('#'))
Kyle Wild

10

Gary Bernhardt'ın .vimrc'sinde bunu idare eden bir fonksiyon var .

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
Bana tüm beğeni indir. En azından dosyaları yeniden adlandırabilirim.
Jezen Thomas

Bu harika bir cevap, ek bir eklenti gerekmez.
wpp

8
:!mv % %:h/new_name

Kayıt %, geçerli dosyanın adını içerir. '%:h': dizin 'kafa' Geçerli dosyayı içeren, örneğin gösterir %:hdöner /abc/defdosya tam yol olduğundaabc/dev/my.txt


7

Buna ne dersin (Jake'in önerisiyle geliştirildi):

:exe "!mv % newfilename" | e newfilename

Hmmm, dün MacVim'de çalıştığını açıklığa kavuşturmalıyım, ancak bir sunucuya sshed ve bugün denedim ve 2. komut iki nokta üst üste komutu olarak
görülmedi

1
Aslında artık MacVim üzerinde de çalışmıyor. Çizim tahtasına geri dön! :)
murftown

2
O olmalı:exe "!mv % newfilename" | e newfilename
Jake

Teşekkürler Jake, bu benim çözümümden biraz daha iyi. Güncellenmiş.
murftown

7

Vim'in bir renameişlevi vardır, ancak maalesef tarihi korumaz.

Geçmişi kaybetmeden bir dosyayı yeniden adlandırmanın en kolay işletim sistemi agnostik yolu:

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

expand('#:p') eski dosyanın tam yolunu döndürür.

Kullanım :bd #ayrıca tampon listeden eski dosyayı silmek istiyorum.

Veya bir eklenti oluşturun

Dosyayı yeniden adlandırmak için hızlı bir komut kullanmak istiyorsanız, ~ / .vim / plugin altına aşağıdaki içeriklerle yeni bir dosya ekleyin:

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>)

Komut Rename, bir dosyayı hızlı bir şekilde yeniden adlandırmanıza yardımcı olacaktır.


: call delete ('<Cr> #') yazmak daha kolaydır.
MaikoID

7

Tim Pope tarafından vim-eunuch adı verilen ve diğer bazı güzelliklerin yanı sıra (sil, bul, hepsini kaydet, chmod, sudo edit, ...) içeren daha büyük bir eklenti var .

Vim-eunuch içindeki bir dosyayı yeniden adlandırmak için:

:Move filename.ext

Rename.vim ile karşılaştırıldığında:

:rename[!] filename.ext

Birkaç tuşa basar :)


Ve gerçekten de başka çok kullanışlı fonksiyonları var!
Pierre-Adrien Buisson

5

Eklentileri kullanmadan mevcut dosyayı yeniden adlandırmak için şu komutu kullanmalısınız:

:Explore

Bu komut, dizindeki dosyaları keşfetmenize, silmenize veya yeniden adlandırmanıza olanak tanır. explorer'da gerekli dosyaya, Rdosya adını yeniden adlandırmanıza izin veren type komutuna gitmeniz gerekir.


3

Bunun "en kolay" yöntem olup olmadığını bilmiyorum, ancak dosyanızı zaten kaydettiğinizi varsayarsak (: w) Kabuğu (: sh) çağırır ve basit bir cp foo foo.bak Editör'e geri dönmek için Ctrl-D / Exit kullanın. Bu linkteki vi editör komutlarının yararlı listesi


Bu dosyayı kopyalar, yeniden adlandırmaz.
innaM

Ah - yanlış okudum "person.haml_spec.rb düzenlemeye devam etmek istiyorum" Kötü!
DBMarcos99

Sanırım yapabilirsin:! cp foo foo.new ve sonra: e foo.new?
DBMarcos99

3

Ayrıca şunları kullanabilirsiniz: f ve arkasından: w


3
Bu eski dosyayı kaldırmaz.
Keith Pinson

1

Bu küçük senaryo mükemmel değil (basmanız gereken ekstra satırbaşı) ama işi hallediyor.

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

Başka bir yol, sadece vim'in yerel bir parçası olan netrw'yi kullanmaktır.

:e path/to/whatever/folder/

Sonra silme, yeniden adlandırma vb. Seçenekler vardır.

Netrw'yi düzenlediğiniz dosyanın klasörüne açmak için bir tuş haritası:

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

0

:sav newfile | !rm #

Eski dosyayı arabellek listesinden kaldırmaz. Bu sizin için önemliyse, bunun yerine aşağıdakileri kullanabilirsiniz:

:sav newfile | bd# | !rm #

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.