Đổi tên tệp hiện tại trong Vim


392

Tôi nên đổi tên tập tin hiện tại của mình trong Vim như thế nào?

Ví dụ:

  • Tôi đang chỉnh sửa person.html_erb_spec.rb
  • Tôi muốn nó được đổi tên thành person.haml_spec.rb
  • Tôi muốn tiếp tục chỉnh sửa person.haml_spec.rb

Làm thế nào tôi sẽ đi về làm điều này, thanh lịch?

Câu trả lời:


87

Có một plugin nhỏ cho phép bạn làm điều này.


9
Phiên bản cập nhật này của Rename.vim xử lý CWD chính xác - luôn lưu tệp trong thư mục của bản gốc.
ốm

48
Q: "loại kỳ lạ xã hội nào đặt không gian trong tên dir?" - A: anh chàng đã bắt đầu dự án từ lâu, hiện là sếp của bạn ... đã thăng cấp mã hóa vào lĩnh vực chuyên môn thực sự của anh ấy: theo phương pháp phát triển mốt nhất thời và buộc họ vào đội.
Stablesog

3
@AaronMahan Tôi đã sửa Rename2.vim (bỏ qua phiên bản DelvarWorld thông minh hơn nhưng phức tạp hơn) để cho phép khoảng trắng trong đường dẫn và rẽ nhánh ở đây: github.com/aehlke/vim-rename3 Hãy thoải mái gửi yêu cầu kéo để có chức năng thông minh hơn!
aehlke

4
@Stablesog Microsoft, rõ ràng. Program Files (x86). Bất cứ lúc nào thư mục này cần phải được làm việc với nó cần phải được gói trong dấu ngoặc kép. Đó là uh, rất nhiều.
JackHasaPal

5
@JackHasaPal: +10. "Tệp chương trình (x86)" giành chiến thắng "Tên thư mục tồi tệ nhất mọi thời đại trong một hệ điều hành thiếu các liên kết tượng trưng". :)
Stablesog

451

Lệnh được gọi :saveas, nhưng thật không may, nó sẽ không xóa tệp cũ của bạn, bạn sẽ phải thực hiện thủ công. xem :help saveasđể biết thêm

BIÊN TẬP:

Hầu hết các cài đặt vim có trình duyệt tệp tích hợp, bạn có thể sử dụng cho các hoạt động đó. Hãy thử :Exploretrong chế độ lệnh (tôi thực sự sẽ ánh xạ nó tới một phím chức năng, nó rất tiện dụng). Bạn có thể đổi tên các tệp bằng Rhoặc xóa chúng bằng D, ví dụ. Nhưng nhấn <F1>trong thám hiểm sẽ cung cấp cho bạn một cái nhìn tổng quan tốt hơn.


6
Tôi không nghĩ rằng đó là vụng về so với các biên tập viên khác, nơi bạn thường không thể di chuyển một tập tin. Thay vào đó, bạn phải đi trình quản lý tệp bạn chọn, đổi tên tệp và quay lại trình chỉnh sửa của bạn. Nếu bạn may mắn, bạn phải thoát và khởi động lại trình chỉnh sửa của mình nếu nó không có thông báo thay đổi tên tệp.
Rafael Bugajewski

130
Bạn cũng có thể thích: Giới tính (viết tắt cho khám phá chia tách :-))
Peter Jankuliak

6
Ngoài ra ,: e sẽ mở khám phá trong khung hiện tại. Ít thú vị hơn: Tình dục nhưng hiệu quả hơn;).
Josh

56
Đối với người gan dạ, thẳng đứng: Giới tính là: Vex.
hobbes3

5
@Josh: E làm việc cho tôi ,: e nó không hoạt động với tôi. Tôi sử dụng: e để chỉnh sửa tập tin khác trong cùng một cửa sổ.
omar

159

Nếu bạn sử dụng git và đã có plugin của tpope fugitive.vim thì chỉ cần:

:Gmove newname

Điều này sẽ:

  1. Đổi tên tập tin của bạn trên đĩa.
  2. Đổi tên tập tin trong git repo.
  3. Tải lại tập tin vào bộ đệm hiện tại.
  4. Bảo tồn lịch sử hoàn tác.

Nếu tệp của bạn chưa được thêm vào repo git thì trước tiên hãy thêm nó:

:Gwrite

4
Nước mắt trào ra. Câu trả lời hoàn hảo!
Farid Nouri Neshat

3
Tôi đã hy sinh hai con dê để vinh danh câu trả lời này! Nhưng tôi có một vấn đề nhỏ với nó, bởi vì bạn phải gõ đường dẫn từ gốc của cây làm việc; và điều này thường trở nên khá dài trong bất kỳ dự án. Có một giải pháp cho điều này?
xor

1
Thật tuyệt! Tôi tiếp tục tìm những thứ mới mà chạy trốn có thể làm.
giàu có

8
@xxor: như đã đề cập trong câu trả lời của Mesco, bạn có thể sử dụng Ctrl + R% để chèn tên tệp hiện tại, sau đó có thể được chỉnh sửa.
deltab

4
Để kết hợp một vài bình luận ở đây: :Gmoveyêu cầu đường dẫn tương đối cho tên tệp mới. Một cách hay để làm điều này là gõ vào :Gmove <ctrl-r>%đó nối thêm đường dẫn / tên tệp hiện tại.
shmup

80

Tôi đang làm điều đó với plugin NERDTree:

:NERDTreeFind

sau đó nhấn m

Để đổi tên, bạn có thể chọn (m)ove the current nodevà thay đổi tên tệp. Ngoài ra còn có các tùy chọn như xóa, sao chép, di chuyển, v.v ...


1
bạn biết không, đó là cách chính mà tôi đổi tên công cụ những ngày này
Sam Saffron

2
Điều này hoạt động thực sự tốt. Chắc chắn đề nghị nó.
Matt Setter

Yêu ý tưởng. Đây sẽ là phương pháp tên tệp thay đổi chính của tôi bây giờ.
SLN

72
  • Viết tệp trong khi chỉnh sửa - :w newname- để tạo một bản sao.
  • Bắt đầu chỉnh sửa bản sao mới - :e#.
  • (Tùy chọn) xóa bản sao cũ - :!rm oldname.

Trên Windows, bước 3 tùy chọn thay đổi một chút:

  • (Tùy chọn) xóa bản sao Windows cũ - :!del oldname.

3
Tôi sử dụng phương pháp này tất cả các thời gian, tuy nhiên, nhược điểm là bạn bị mất cây lùi lại của bạn - vì vậy bạn không thể hoàn tác bất cứ điều gì trước: e
rampion

7
Đẹp. Rõ ràng Ctrl-6 thực hiện tương tự như: e #
glenn jackman

bạn cũng có thể mở thư mục, di chuyển con trỏ đến tệp và nhấn "D" để xóa tệp.
Peder

38
Cách đơn giản hơn imho là 1) đổi tên bộ đệm hiện tại :f newname2) lưu nó :w3) (tùy chọn) !rm oldname. Ưu điểm là lịch sử hoàn tác của bạn được bảo tồn.
kynan

3
:saveaslà tốt hơn trong vấn đề đó, @rampion - và làm những gì @kynan đã viết.
lericson

36

Nếu tập tin đã được lưu:

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

Thí dụ:

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

Yêu cầu cấp phép:

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

Lưu thành:

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


Dành cho Windows chưa được xác minh

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

5
Bạn ít nhất có thể giải thích lý do tại sao bạn xuống bình chọn câu trả lời này.
Benjamin

31

Tôi muốn giới thiệu :Renametừ hoạn quan của tpope cho việc này.

Nó cũng bao gồm một loạt các lệnh tiện dụng khác.

Lệnh Đổi tên được định nghĩa như sau trong đó (kiểm tra repo xem có bản cập nhật nào không?):

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

Bạn cũng có thể làm điều đó bằng cách sử dụng netrw

Lệnh khám phá mở netrw trong thư mục của tệp đang mở

:E

Di chuyển con trỏ qua tệp bạn muốn đổi tên:

R

Nhập tên mới, nhấn enter, nhấn y.


tuyệt quá! tôi thậm chí không biết về netrw.
javadba

31

Ngắn gọn, an toàn, không có plugin:

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

control+ R, #sẽ ngay lập tức mở rộng thành tệp thay thế (đường dẫn được chỉnh sửa trước đó trong cửa sổ hiện tại) trước khi nhấn Enter. Điều đó cho phép chúng tôi xem lại chính xác những gì chúng tôi sẽ xóa. Sử dụng đường ống |trong trường hợp như vậy là không an toàn, bởi vì nếu savthất bại vì bất kỳ lý do gì,# vẫn sẽ chỉ đến một nơi khác (hoặc không có gì). Điều đó có nghĩa là !rm #hoặc delete(expand(#))có thể xóa các tập tin hoàn toàn khác nhau! Vì vậy, làm điều đó bằng tay cẩn thận hoặc sử dụng kịch bản tốt (chúng được đề cập trong nhiều câu trả lời ở đây).

Giáo dục

... hoặc thử tự xây dựng một chức năng / lệnh / script. Bắt đầu từ sth đơn giản như:

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

Sau khi tải lại vimrc, chỉ cần gõ :Rename new_filename. Vấn đề với lệnh này là gì?

Kiểm tra bảo mật 1: Điều gì không :Renamecó đối số?

Có, nó xóa tệp bị ẩn trong '#'!

Giải pháp: bạn có thể sử dụng ví dụ. điều kiện hoặc trytuyên bố như thế:

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

Kiểm tra bảo mật 1: :Rename (không có đối số) sẽ đưa ra lỗi:

E471: Yêu cầu đối số

Kiểm tra bảo mật 2: Điều gì sẽ xảy ra nếu tên sẽ giống như trước đó?

Kiểm tra bảo mật 3: Điều gì sẽ xảy ra nếu tệp sẽ ở vị trí khác với thực tế của bạn?

Tự sửa nó. Để dễ đọc, bạn có thể viết nó theo cách này:

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

ghi chú

  • !rm #tốt hơn !rm old_name-> bạn không cần nhớ tên cũ

  • !rm <C-R>#tốt hơn so với !rm #khi làm bằng tay -> bạn sẽ thấy những gì bạn thực sự loại bỏ (lý do an toàn)

  • !rmnói chung là không an toàn lắm ... mvđến một vị trí rác là tốt hơn

  • call delete(expand('#'))tốt hơn lệnh shell (hệ điều hành bất khả tri) nhưng lâu hơn để gõ và không thể sử dụng control+R

  • try | code1 | code2 | tryend -> khi xảy ra lỗi trong khi code1, đừng chạy code2

  • :sav(hoặc :saveas) tương đương với :f new_name | w- xem file_f - và lưu lại lịch sử hoàn tác

  • expand('%:p')đưa ra toàn bộ đường dẫn vị trí của bạn ( %) hoặc vị trí của tệp thay thế ( #)



10

Có một chức năng trong .vimrc của Gary Bernhardt xử lý việc này.

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
Downvote tôi tất cả các bạn thích. Ít nhất tôi có thể đổi tên tập tin.
Jezen Thomas

Đây là một câu trả lời tuyệt vời, không cần thêm plugin.
wpp

8
:!mv % %:h/new_name

Đăng ký %chứa tên của tập tin hiện tại. '%:h'hiển thị thư mục 'head' chứa tệp hiện tại, ví dụ: %:htrả về /abc/defkhi đường dẫn đầy đủ tệp của bạn làabc/dev/my.txt


7

Làm thế nào về điều này (được cải thiện bởi đề xuất của Jake):

:exe "!mv % newfilename" | e newfilename

Hmmm, tôi nên làm rõ rằng nó đã hoạt động trên MacVim ngày hôm qua nhưng tôi đã bị đưa vào một máy chủ và đã thử nó ngày hôm nay và lệnh thứ 2 dường như không được coi là một lệnh đại tràng ...
murftown 19/12/11

1
Trên thực tế bây giờ nó cũng không hoạt động trên MacVim. Trở lại với bản vẽ! :)
vụng trộm

2
Nó nên là:exe "!mv % newfilename" | e newfilename
Jake

Cảm ơn Jake, điều đó tốt hơn một chút so với giải pháp của tôi. Cập nhật.
murftown

7

Vim không có renamechức năng, nhưng tiếc là nó không giữ được lịch sử.

Cách đơn giản nhất của hệ điều hành để đổi tên một tệp mà không làm mất lịch sử sẽ là:

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

expand('#:p') trả về đường dẫn đầy đủ của tập tin cũ hơn

Sử dụng :bd #nếu bạn cũng muốn xóa tệp cũ hơn khỏi danh sách bộ đệm.

Hoặc tạo một plugin

Nếu bạn muốn sử dụng lệnh nhanh để đổi tên tệp, hãy thêm tệp mới trong ~ / .vim / plugin với nội dung sau:

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

Lệnh Renamesẽ giúp bạn nhanh chóng đổi tên một tập tin.


: xóa cuộc gọi ('<Cr> #') dễ viết hơn.
MaikoID

7

Có một plugin lớn hơn có tên là vim-eunuch của Tim Pope bao gồm chức năng đổi tên cũng như một số tính năng khác (xóa, tìm, lưu tất cả, chmod, sudo chỉnh sửa, ...).

Để đổi tên một tập tin trong vim-eunuch:

:Move filename.ext

So với rename.vim:

:rename[!] filename.ext

Lưu một vài tổ hợp phím :)


Và nó thực sự có một số chức năng rất hữu ích khác!
Pierre-Adrien Buisson

5

Để đổi tên tập tin hiện có mà không sử dụng plugin, bạn nên sử dụng lệnh

:Explore

Lệnh này cho phép bạn khám phá các tệp in.directory, xóa hoặc đổi tên chúng. hơn bạn nên điều hướng đến tệp cần thiết trong explorer hơn Rlệnh loại sẽ cho phép bạn đổi tên tên tệp


3

Tôi không biết đây có phải là phương pháp "dễ nhất" không, nhưng giả sử bạn đã lưu tệp của mình (: w) Tôi sẽ gọi shell (: sh) và thực hiện một cp đơn giản foo foo.bak Để quay lại trình chỉnh sửa sử dụng Ctrl-D / Thoát. Danh sách hữu ích của các lệnh soạn thảo vi trên liên kết này


Điều này sẽ sao chép các tập tin, không đổi tên nó.
innaM

À - tôi đã đọc sai "Tôi muốn tiếp tục chỉnh sửa person.haml_spec.rb" Thật tệ!
DBMarcos99

Tôi cho rằng bạn có thể :! cp foo foo.new và sau đó: e foo.new?
DBMarcos99

3

Bạn cũng có thể sử dụng: f theo sau: w


3
Điều này không loại bỏ các tập tin cũ.
Keith Pinson

1

Kịch bản nhỏ này không hoàn hảo (trả lại tiền vận chuyển thêm mà bạn phải nhấn) nhưng nó đã hoàn thành công việc.

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

Một cách khác là chỉ sử dụng netrw, một phần nguyên gốc của vim.

:e path/to/whatever/folder/

Sau đó, có các tùy chọn để xóa, đổi tên, vv

Đây là một sơ đồ để mở netrw vào thư mục của tệp bạn đang chỉnh sửa:

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

0

:sav newfile | !rm #

Lưu ý rằng nó không xóa tệp cũ khỏi danh sách bộ đệm. Nếu điều đó quan trọng với bạn, bạn có thể sử dụng những điều sau đây:

:sav newfile | bd# | !rm #

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.