Перейменування поточного файлу у Vim


392

Як слід перейменувати свій поточний файл у Vim?

Наприклад:

  • Я редагую person.html_erb_spec.rb
  • Я хотів би, щоб це перейменовано person.haml_spec.rb
  • Я хотів би продовжувати редагування person.haml_spec.rb

Як би я міг робити це елегантно?

Відповіді:


87

Є невеликий плагін, який дозволить вам це зробити.


9
Ця оновлена ​​версія Rename.vim правильно обробляє CWD - завжди зберігає файл у каталозі оригіналу.
хвороба

48
Питання: "який соціопатичний дивовиж ставить пробіли в назві реж?" - Відповідь: хлопець, який давно розпочав проект, який зараз є вашим начальником ... висунувся з кодування в свою справжню область знань: слідування методології розробки та примушування їх до команди.
Stabledog

3
@AaronMahan Я виправив Rename2.vim (не зважаючи на розумнішу, але більш складну версію DelvarWorld), щоб забезпечити пробіли в шляхах, і роздрібнив їх тут: github.com/aehlke/vim-rename3 Сміливо надсилайте запити на тягнення для ще розумнішого функціоналу!
aehlke

4
@Stabledog Microsoft, мабуть. Program Files (x86). Кожен раз, коли з цим каталогом потрібно працювати, його потрібно загорнути в лапки. Якого, е, багато.
JackHasaKeyboard

5
@JackHasaKeyboard: +10. "Файли програми (x86)" виграють за весь час "Найгірше ім'я каталогів в операційній системі, що не має символів." :)
Stabledog

451

Команда викликається :saveas, але, на жаль, вона не видалить ваш старий файл, вам доведеться це зробити вручну. див. :help saveasдля отримання додаткової інформації.

Редагувати:

Більшість установок vim мають інтегрований провідник файлів, який ви можете використовувати для таких операцій. Спробуйте :Exploreв командному режимі (я б фактично відобразив це на функціональній клавіші, це дуже зручно). Наприклад, ви можете перейменовувати файли Rабо видаляти їх D. Але натискання <F1>на дослідник дасть вам кращий огляд.


6
Я не думаю, що це незручно порівняно з іншими редакторами, де ти зазвичай не можеш перемістити файл. Натомість вам потрібно перейти до обраного менеджера файлів, перейменувати файл та повернутися до свого редактора. Якщо вам пощастило, вам доведеться вийти та перезапустити редактор, якщо він не отримав повідомлення про зміну імені файлу.
Рафаель Бугаєвський

130
Можливо, вам також сподобається: Секс (стенограма для спліт-дослідження :-))
Peter Jankuliak

6
Також: e відкриє пошук у поточній області. Менш захоплююче, ніж: Секс, але ефективніше;).
Джош

56
Для безстрашних, вертикальних: Секс: Векс.
hobbes3

5
@Josh: E працює на мене, e: це не працює для мене. Я використовую: e для редагування іншого файлу в цьому ж вікні.
омар

159

Якщо ви використовуєте git і вже маєте плагін tpope fugitive.vim, просто:

:Gmove newname

Це буде:

  1. Перейменуйте свій файл на диску.
  2. Перейменуйте файл у git repo.
  3. Перезавантажте файл у поточний буфер.
  4. Зберегти історію скасування.

Якщо ваш файл ще не був доданий до git repo, спочатку додайте його:

:Gwrite

4
Сльози виходять із моїх очей. Ідеальна відповідь!
Фарид Нурі Нешат

3
Я пожертвував двома козами на честь цієї відповіді! Але у мене є невелика проблема з цим, тому що ви повинні ввести шлях від кореня робочого дерева; і це часто стає досить тривалим у будь-якому проекті. Чи є для цього рішення?
xor

1
Це чудово! Я продовжую знаходити нові речі, які втікач може зробити.
Rich Churcher

8
@xxor: як зазначено у відповіді Mesco, ви можете використовувати Ctrl + R%, щоб вставити поточне ім'я файлу, яке потім можна редагувати.
дельтаб

4
Щоб поєднати кілька коментарів тут: :Gmoveпотрібен відносний шлях до нового імені файлу. Гарний спосіб зробити це - ввести :Gmove <ctrl-r>%який додає поточний шлях / ім'я файлу.
shmup

80

Я роблю це з плагіном NERDTree:

:NERDTreeFind

потім натисніть m

Для перейменування ви можете вибрати (m)ove the current nodeта змінити ім'я файлу. Також є такі варіанти, як видалення, копіювання, переміщення тощо ...


1
Ви знаєте що, це головний спосіб перейменувати речі в ці дні
Сем Шафран

2
Цей працює дуже добре. Однозначно рекомендую.
Метт Сеттер

Любіть ідею. Це зараз буде моїм основним методом зміни файлу.
SLN

72
  • Напишіть файл під час редагування - :w newname- для створення копії.
  • Почніть редагувати нову копію - :e#.
  • (За бажанням) видалити стару копію - :!rm oldname.

У Windows необов'язковий 3-й крок трохи змінює:

  • (За бажанням) видалити стару копію Windows - :!del oldname.

3
Я постійно використовую цей підхід, однак, недоліком є ​​те, що ви втрачаєте дерево скасування - тому ви не можете нічого скасувати перед: e
rampion

7
Приємно. Мабуть, Ctrl-6 робить те саме, що: e #
glenn jackman

Ви також можете відкрити каталог, перемістити курсор у файл та натиснути "D", щоб видалити файл.
Педер

38
Більш простий спосіб imho - 1) перейменувати поточний буфер :f newname2) зберегти його :w3) (необов'язково) !rm oldname. Перевага полягає в тому, що ваша історія скасування збережена.
kynan

3
:saveasв цьому плані краще, @rampion - і робить те, що написав @kynan.
lericson

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

Я б рекомендував :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

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('#'))краще, ніж команда оболонки (ОС агностик), але довше набирати та неможливо використовувати control+R

  • try | code1 | code2 | tryend -> коли виникає помилка під час code1, не запускайте code2

  • :sav(або :saveas) еквівалентно :f new_name | w- див. file_f - і зберігає історію скасування

  • expand('%:p')дає весь шлях вашого місцезнаходження ( %) або розташування альтернативного файлу ( #)



10

Існує функція в .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
Відхиліть мене від усього, що вам подобається. Принаймні я можу перейменувати файли.
Єзен Томас

Це чудова відповідь, не потрібен додатковий плагін.
wpp

8
:!mv % %:h/new_name

Реєстр %містить ім'я поточного файлу. '%:h'показує каталог 'head', що містить поточний файл, наприклад: %:hповертається, /abc/defколи повний шлях вашого файлуabc/dev/my.txt


7

Як щодо цього (покращене пропозицією Джейка):

:exe "!mv % newfilename" | e newfilename

Гммм, я повинен уточнити, що він працював на MacVim вчора, але я перейшов на сервер і спробував це сьогодні, і 2-я команда, здається, не трактується як команда двокрапки ...
murftown

1
Насправді зараз він не працює і на MacVim. Назад до дошки для малювання! :)
murftown

2
Це повинно бути:exe "!mv % newfilename" | e newfilename
Джейк

Дякую Джейку, це трохи краще, ніж моє рішення. Оновлено.
murftown

7

Vim має renameфункцію, але, на жаль, він не зберігає історію.

Найпростіший агностичний спосіб перейменувати файл без втрати історії:

: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допоможе швидко перейменувати файл.


: виклик видалення ('<Cr> #') простіше написати.
MaikoID

7

Там є гарний більше плагін називається ВІМ-євнух Тімом Папою , який включає в себе функцію перейменування, а також деякі інші ласощі (видалити, знайти, зберегти все, CHMOD, Судо редагувати, ...).

Щоб перейменувати файл у vim-eunuch:

:Move filename.ext

Порівняно з rename.vim:

:rename[!] filename.ext

Економить кілька натискань клавіш :)


І він справді має деякі інші дуже корисні функції!
П’єр-Адрієн Буйсон

5

Для перейменування існуючого файлу без використання плагінів слід використовувати команду

:Explore

Ця команда дозволяє досліджувати файли у.directory, видаляти або перейменувати їх. ніж вам слід перейти до потрібного файлу в Explorer, ніж Rкоманда type, яка дозволить вам перейменувати ім'я файлу


3

Я не знаю, чи це "найпростіший" метод, але якщо припустити, що ви вже зберегли свій файл (: w), я б викликав оболонку (: sh) і зробив простий cp foo foo.bak, щоб повернутися до редактора використовувати Ctrl-D / Exit. Корисний список команд редактора vi на цьому посиланні


Це скопіює файл, а не перейменує його.
innaM

Ах - я неправильно прочитав "Я хотів би продовжувати редагування person.haml_spec.rb" Моє погано!
DBMarcos99

Я гадаю, ти міг:! cp foo foo.new, а потім: e foo.new?
DBMarcos99

3

Ви також можете використовувати: f, а потім: w


3
Це не видаляє старий файл.
Кіт Пінсон

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

Інший спосіб - просто використовувати netrw, який є рідною частиною vim.

: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 #

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.