Vimで現在のファイルの名前を変更する


392

Vimで現在のファイルの名前を変更するにはどうすればよいですか?

例えば:

  • 私は編集しています person.html_erb_spec.rb
  • 名前を変更してください person.haml_spec.rb
  • 編集を続けたい person.haml_spec.rb

エレガントにこれを行うにはどうすればよいですか?

回答:


87

これを可能にする小さなプラグインがあります。


9
Rename.vimのこの更新されたバージョンは CWDを正しく処理します-常に元のディレクトリにファイルを保存します。
sickill 2011

48
Q:「dir名にスペースを入れるのはどのような社会病的変人ですか?」-A:ずっと前にプロジェクトを始めた人で、現在はあなたのボスです...開発方法論の流行に従い、チームに強制するという、彼の真の専門分野へのコーディングから昇進しました。
ステーブルドッグ2013

3
@AaronMahan Rename2.vimを修正し(よりスマートでより複雑なDelvarWorldバージョンを無視)、パスにスペースを入れ、ここでフォークしました:github.com/aehlke/vim-rename3さらにスマートな機能のためにプルリクエストを送信してください!
aehlke 2013

4
@Stabledog Microsoft、どうやら。Program Files (x86)。このディレクトリを処理する必要があるときはいつでも、引用符で囲む必要があります。ええと、たくさんあります。
JackHasaKeyboard 2017

5
@JackHasaKeyboard:+10。「Program Files(x86)」は、「シンボリックリンクのないオペレーティングシステムでは、史上最悪のディレクトリ名」を常に獲得しています。:)
ステーブルドッグ2017

451

コマンドはと呼ばれ:saveasますが、残念ながら古いファイルは削除されません。手動で削除する必要があります。詳細については:help saveas、を参照してください。

編集:

ほとんどのvimインストールには統合ファイルエクスプローラーがあり、このような操作に使用できます。:Exploreコマンドモードで試してみてください(実際には、これをファンクションキーにマップします。非常に便利です)。たとえば、でファイル名を変更しRたり、ファイルを削除したりできますD。ただし<F1>、エクスプローラーを押すと、概要がわかりやすくなります。


6
通常はファイルを移動できない他のエディターと比較して、不便だとは思いません。代わりに、選択したファイルマネージャーに移動し、ファイルの名前を変更して、エディターに戻る必要があります。運が良ければ、ファイル名変更通知が届かなかった場合は、エディターを終了して再起動する必要があります。
Rafael Bugajewski、2011

130
また、のような可能性がある:セックス(のための速記の分割は、探検 :-))
ピーター・Jankuliak

6
また、:eは現在のペインでエクスプローラを開きます。:セックスよりエキサイティングではありませんが、より効率的です;)。
Josh、

56
勇敢な場合、vertical:Sexは:Vexです。
hobbes3 2013年

5
@Josh:Eは私にとっては機能し、:eは私にとっては機能しません。私は:eを使用して、同じウィンドウで他のファイルを編集します。
omar 2014

159

gitを使用していて、tpopeのプラグインfugitive.vimがすでにある場合は、単純に次のようにします。

:Gmove newname

この意志:

  1. ディスク上のファイルの名前を変更します。
  2. git repoでファイルの名前を変更します。
  3. ファイルを現在のバッファに再ロードします。
  4. 元に戻す履歴を保持します。

ファイルがまだGitリポジトリに追加されていない場合は、最初に追加します。

:Gwrite

4
涙が出てきました。完璧な答えです!
Farid Nouri Neshat、2015

3
私はこの答えに敬意を表して2頭の山羊を犠牲にしました。しかし、作業ツリーのルートからのパスを入力する必要があるため、私はそれに小さな問題があります。これは多くの場合、どのプロジェクトでもかなり長くなります。これに対する解決策はありますか?
XOR

1
それは素晴らしいことです!私は逃亡者ができる新しいことを見つけ続けます。
リッチチャーチャー2016

8
@xxor:Mescoの回答で述べたように、Ctrl + R%を使用して現在のファイル名を挿入し、編集することができます。
deltab 2016

4
ここにいくつかのコメントを組み合わせるには:Gmove、新しいファイル名の相対パスが必要です。これを行う良い方法:Gmove <ctrl-r>%は、現在のパス/ファイル名を追加するタイプです。
shmup

80

私はNERDTreeプラグインでそれをやっています:

:NERDTreeFind

次に押します m

名前を変更するには(m)ove the current node、ファイル名を選択して変更できます。また、削除、コピー、移動などのオプションもあります...


1
ご存知のように、これが最近の名前変更の主な方法です
Sam Saffron

2
これは本当にうまくいきます。絶対にお勧めします。
Matt Setter

アイデアが大好きです。これが私の主な変更ファイル名メソッドになります。
SLN 2019

72
  • 編集中にファイルを書き込み:w newname--コピーを作成します。
  • 新しいコピーの編集を開始します- :e#
  • (オプション)古いコピーを削除します- :!rm oldname

Windowsでは、オプションの3番目のステップが少し異なります。

  • (オプション)古いWindowsコピーを削除します- :!del oldname

3
私はすべての時間は、しかし、欠点は、あなたのアンドゥツリーを失うということである。このアプローチを使用する-あなたは前に元に戻す何もすることはできませんので、:E
ホタルブクロ

7
いいね。どうやらCtrl-6は:e#と同じように
見える

ディレクトリを開いてカーソルをファイルに移動し、「D」を押してファイルを削除することもできます。
Peder、2011

38
imhoのより簡単な方法は、1)現在のバッファーの名前を変更する:f newname2)保存する:w3)(オプション)!rm oldnameです。利点は、元に戻す履歴が保持されることです。
kynan 2011

3
:saveas@rampion-そして@kynanが書いたことを行います。
lericson 2017

36

ファイルが既に保存されている場合:

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

例:

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

許可要件:

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

名前を付けて保存:

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


未確認のWindowsの場合

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

5
この回答に反対票を投じた理由を少なくとも説明できます。
ベンジャミン、

31

これには:Renametpopeのeunuchがお勧めです。

その他の便利なコマンドも多数含まれています。

Renameコマンドは現在、次のように定義されています(更新についてはリポジトリを確認してください)。

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

netrwを使用してそれを行うこともできます

exploreコマンドは、開いているファイルのディレクトリにnetrwを開きます

:E

名前を変更するファイルにカーソルを移動します。

R

新しい名前を入力し、Enterキーを押し、Yキーを押します。


すごい!私はnetrwについてさえ知りませんでした。
javadba 2015年

31

プラグインなしで短く、安全:

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

control+はR#を押す前に、即座に代替ファイル(現在のウィンドウで以前に編集されたパス)に展開されますEnter。これにより、何を削除するかを正確に確認できます。|そのような場合にパイプを使用することは安全ではありません。sav何らかの理由で失敗した場合#でも、別の場所を指す(または何もない)ためです。つまり、!rm #あるいはdelete(expand(#))完全に異なるファイルを削除することができます!手で慎重に行うか、適切なスクリプトを使用してください(これらは多くの回答に記載されています)。

教育的

...または関数/コマンド/スクリプトを自分で作成してみてください。次のような単純なものから始めます。

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

vimrcのリロード後、単にと入力し:Rename new_filenameます。このコマンドの問題は何ですか?

セキュリティテスト1::Rename引数なしで何をしますか?

はい、「#」で隠されたファイルを削除します!

解決策:たとえば、tryそのような条件またはステートメント:

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

セキュリティテスト1:( :Rename引数なしで)エラーをスローします:

E471:引数が必要です

セキュリティテスト2: 名前が以前の名前と同じになる場合はどうなりますか?

セキュリティテスト3: ファイルが実際の場所とは異なる場所にある場合はどうなりますか?

自分で修正してください。読みやすくするために、次のように記述できます。

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

ノート

  • !rm #より良い!rm old_name->あなたは古い名前を覚える必要はありません

  • !rm <C-R>#!rm #手で行うよりも優れています->実際に削除したものが表示されます(安全上の理由)

  • !rm一般的にはあまり安全ではありません... mvゴミの場所に行く方が良いです

  • call delete(expand('#'))シェルコマンド(OSに依存しない)よりも優れていますが、入力に時間がかかり、使用できませんcontrol+R

  • try | code1 | code2 | tryend -> code1の実行中にエラーが発生した場合、code2を実行しない

  • :sav(または:saveas)は-file_fを:f new_name | w参照-と同等であり、取り消し履歴を保持します

  • expand('%:p')場所の完全パス(%)または代替ファイルの場所(#



10

これを処理する関数がGary Bernhardtの.vimrcにあります。

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
好きなものすべてに投票してください。少なくとも、ファイル名を変更できます。
Jezen Thomas

これは素晴らしい答えです。追加のプラグインは必要ありません。
wpp

8
:!mv % %:h/new_name

レジスタ%には、現在のファイルの名前が含まれています。'%:h':ディレクトリの頭の現在のファイルを含む、例えば示し%:hリターンを/abc/defお使いのファイルの完全なパスがあるときabc/dev/my.txt


7

これはどうですか(ジェイクの提案によって改善されました):

:exe "!mv % newfilename" | e newfilename

うーん、昨日MacVimで動作したことを明確にする必要がありますが、サーバーに接続して今日試してみたところ、2番目のコマンドはコロンコマンドとして扱われなかったようです...
murftown

1
実際、MacVimでも動作していません。ふりだしに戻る!:)
マーフタウン

2
それはする必要があります:exe "!mv % newfilename" | e newfilename
ジェイク

ジェイクに感謝します。それは私のソリューションよりも少し優れています。更新しました。
murftown 2013

7

Vimにはrename機能がありますが、残念ながら履歴は保持されません。

履歴を失わずにファイル名を変更する最も簡単なOSに依存しない方法は次のとおりです。

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

expand('#:p') 古いファイルの完全パスを返します。

使用する :bd #バッファリストから古いファイルも削除場合にます。

またはプラグインを作成

クイックコマンドを使用してファイルの名前を変更する場合は、〜/ .vim / pluginの下に次の内容の新しいファイルを追加します。

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

このコマンドRenameを使用すると、ファイルの名前をすばやく変更できます。


:call delete( '<Cr>#')の方が書きやすいです。
MaikoID 2014年

7

Tim Popeによるvim-eunuchと呼ばれる見た目により大きなプラグインがあり、名前の変更機能と他のいくつかの機能(削除、検索、すべて保存、chmod、sudo編集など)が含まれています。

vim-eunuchでファイルの名前を変更するには:

:Move filename.ext

rename.vimと比較:

:rename[!] filename.ext

いくつかのキーストロークを節約します:)


そして、それは確かに他のいくつかの非常に便利な機能を持っています!
Pierre-Adrien Buisson 2014年

5

プラグインを使用せずに既存のファイルの名前を変更するには、コマンドを使用する必要があります

:Explore

このコマンドを使用すると、.directory内のファイルを探索し、それらを削除または名前変更できます。エクスプローラーで必要なファイルに移動Rする必要があります。ファイル名を変更できるコマンドを入力してください。


3

これが「最も簡単な」方法かどうかはわかりませんが、すでにファイルを保存している(:w)と仮定して、シェル(:sh)を呼び出して、単純なcp foo foo foo.bakを実行します。エディタに戻るにはCtrl-D / Exitを使用します。このリンクの viエディターコマンドの有用なリスト


これは、ファイルの名前を変更するのではなく、ファイルをコピーします。
innM 2009

ああ、「person.haml_spec.rbの編集を続けたい」と誤解しました。
DBMarcos99 2009

私はあなたができると思います:!cp foo foo.newそして次に:e foo.new?
DBMarcos99 2009


1

この小さなスクリプトは完璧ではありません(押す必要がある追加のキャリッジリターン)。それで仕事は完了です。

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

もう1つの方法は、vimのネイティブ部分であるnetrwを使用することです。

:e path/to/whatever/folder/

次に、削除、名前変更などのオプションがあります。

次に、編集中のファイルのフォルダーにnetrwを開くためのキーマップを示します。

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

0

:sav newfile | !rm #

バッファリストから古いファイルを削除しないことに注意してください。それが重要な場合は、代わりに以下を使用できます。

:sav newfile | bd# | !rm #

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.