web-dev-qa-db-ja.com

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

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

例えば:

  • person.html_erb_spec.rbを編集しています
  • person.haml_spec.rbに改名してほしい
  • person.haml_spec.rbの編集を続けたい

どうやってこれを上品にやろうか。

369
Sam Saffron

小さなプラグイン があります。

86
innaM

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

編集:

ほとんどのVimインストールには統合ファイルエクスプローラがあり、これを使ってそのような操作をすることができます。コマンドモードで:Exploreを試してください(私は実際にそれをファンクションキーにマッピングします。それはとても便利です)。たとえば、ファイルの名前をRで変更したり、Dで削除したりできます。しかし、エクスプローラで<F1>を押すとより良い概観が得られます。

413
soulmerge

Gitを使っていて、すでにtpopeのプラグイン fugitive.vim を持っているのなら、単に

:Gmove newname

この意志:

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

あなたのファイルがまだGitリポジトリに追加されていない場合は、まずそれを追加します。

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

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

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

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

:NERDTreeFind

次に押す m

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

68
woto

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

:!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}
29
Benjamin

私はtpopeの eunuch から:Renameを勧めます。

その他の便利なコマンドもたくさん含まれています。

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
27
Gavin Gilmour

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

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

control + R、 # を押す前に即座に 代替ファイル (現在のウィンドウで編集されたパス)に展開されます Enter。これにより、削除しようとしている内容を確認できます。このような場合にパイプ|を使用するのはnot secureです。なぜなら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('#'))はShellコマンド(OSにとらわれない)よりは優れていますが、入力するのに時間がかかり使用することができません。 control + R

  • try | code1 | code2 | tryend - > code1の途中でエラーが発生したとき、code2を実行しない

  • :sav(または:saveas)は:f new_name | wと同等です - file_f を参照 - および元に戻す履歴を保存します

  • expand('%:p')はあなたの場所(%)または代替ファイルの場所(#)のフルパスを与えます

25
Mesco

Netrwを使ってもできます

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

:E

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

R

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

25
Ben
sav person.haml_spec.rb | call delete(expand('#'))
17
Maxim Kim

これを処理する関数が 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>
10
Jezen Thomas

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

:exe "!mv % newfilename" | e newfilename
7
murftown

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

6
Alex

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

Vim-eunuchでファイルの名前を変えるには:

:Move filename.ext

Rename.vimと比較して:

:rename[!] filename.ext

数回のキーストロークを節約できます。

6
sh78

:fに続けて:wを使用することもできます。

3
user320487

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

2
DBMarcos99

このちょっとしたスクリプトは完璧ではありませんが(余分な改行を押す必要があります)、それが仕事です。

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>
1
Jonas Geiregat

:sav newfile | !rm #

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

:sav newfile | bd# | !rm #

0
sitaktif

もう一つの方法はnetrwを使うことです。これはvimの本来の部分です。

:e path/to/whatever/folder/

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

これは、編集中のファイルのフォルダへのnetrwを開くためのキーマップです。

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