433

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

例えば:

  • 編集中ですperson.html_erb_spec.rb
  • 名前を変更してほしいperson.haml_spec.rb
  • 編集を続けたいperson.haml_spec.rb

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

4

22 に答える 22

186

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

:Gmove newname

この意志:

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

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

:Gwrite
于 2012-11-21T20:45:29.573 に答える
100

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

:NERDTreeFind

次に押すm

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

于 2012-10-27T23:18:55.887 に答える
90

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

于 2009-07-30T08:51:21.100 に答える
44

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

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

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

教育

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

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')あなたの場所の完全なパス ( %) または代替ファイルの場所 ( #)を与える

于 2016-12-03T11:10:23.253 に答える
38

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

:!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}
于 2013-12-25T20:20:28.040 に答える
37

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

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

:E

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

R

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

于 2015-01-15T12:04:55.750 に答える
33

:Renameこれについては、tpopeの宦官からお勧めします。

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

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
于 2012-04-28T09:15:29.537 に答える
19

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

:Explore

このコマンドを使用すると、.directory 内のファイルを調べたり、削除したり、名前を変更したりできます。Rファイル名の名前を変更できるようにするコマンドを入力するよりも、エクスプローラーで必要なファイルに移動する必要があります

于 2019-11-25T21:37:26.100 に答える
18
sav person.haml_spec.rb | call delete(expand('#'))
于 2009-07-30T13:49:15.333 に答える
14
:!mv % %:h/new_name

Register%には、現在のファイルの名前が含まれています。'%:h'現在のファイルを含むディレクトリ 'head' を表示します。例:ファイルのフル パスが次の場合に%:h戻ります。/abc/defabc/def/my.txt

于 2019-06-04T05:35:43.330 に答える
8

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

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

:Move filename.ext

rename.vim との比較:

:rename[!] filename.ext

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

于 2014-07-31T08:01:51.773 に答える
8

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は、ファイルの名前をすばやく変更するのに役立ちます。

于 2014-04-29T16:20:49.227 に答える
7

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

:exe "!mv % newfilename" | e newfilename
于 2011-12-18T21:12:03.547 に答える
3

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

于 2009-07-30T09:00:26.310 に答える
3

:f の後に :w を使用することもできます

于 2011-03-04T17:47:20.200 に答える
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>
于 2012-05-26T11:18:38.873 に答える
0

:sav newfile | !rm #

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

:sav newfile | bd# | !rm #

于 2014-11-16T18:05:11.017 に答える
0

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

:e path/to/whatever/folder/

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

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

map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>
于 2014-11-13T22:46:22.887 に答える