Vim에서 현재 파일 이름 바꾸기


392

Vim에서 현재 파일의 이름을 바꾸려면 어떻게해야합니까?

예를 들면 다음과 같습니다.

  • 편집 중입니다 person.html_erb_spec.rb
  • 이름을 바꾸고 싶습니다 person.haml_spec.rb
  • 계속 편집하고 싶습니다 person.haml_spec.rb

우아하게이 작업을 수행하려면 어떻게해야합니까?

답변:


87

이 작업을 수행 할 수 있는 작은 플러그인 이 있습니다.


9
이 업데이트 된 Rename.vim 버전은 CWD를 올바르게 처리합니다. 항상 원본 파일의 디렉토리에 파일을 저장합니다.
sickill

48
Q : "어떤 종류의 사회 병리학 이상한 사람들이 dir 이름에 공백을 넣습니까?" -A : 오래 전에 프로젝트를 시작한 사람이 이제는 당신의 상사입니다. 그의 진정한 전문 분야로의 코딩에서 승진했습니다.
Stabledog

3
내가 Rename2.vim을 고정했습니다 @AaronMahan 경로에 공백 수 있도록 (똑똑하지만 더 복잡한 DelvarWorld 버전을 무시)하고 여기 갈래 : github.com/aehlke/vim-rename3 에도 스마트 기능을 풀 요청을 제출 기분이 무료!
aehlke

4
@Stabledog Microsoft입니다. Program Files (x86). 이 디렉토리를 작업해야 할 때마다 따옴표로 묶어야합니다. 어느 쪽이 많습니까?
JackHasaKeyboard

5
@JackHasa 키보드 : +10 "프로그램 파일 (x86)"은 항상 "Symlink가없는 운영 체제에서 가장 최악의 디렉토리 이름"을 얻습니다. :)
Stabledog

451

이 명령은 :saveas이지만 불행히도 이전 파일은 삭제되지 않으므로 수동으로 수행해야합니다. 자세한 내용은 참조하십시오 :help saveas.

편집하다:

대부분의 vim 설치에는 통합 파일 탐색기가 있으며 이러한 작업에 사용할 수 있습니다. :Explore명령 모드로 시도하십시오 (실제로 기능 키에 매핑하면 매우 편리합니다). 예를 들어 파일 이름을 바꾸 R거나 파일을 삭제할 수 있습니다 D. 그러나 <F1>탐색기를 누르면 더 나은 개요를 볼 수 있습니다.


6
나는 일반적으로 파일을 이동할 수없는 다른 편집기와 비교하여 어색하다고 생각하지 않습니다. 대신 선택한 파일 관리자로 이동하여 파일 이름을 바꾸고 편집기로 돌아 가야합니다. 운이 좋으면 파일 이름 변경 알림이 없으면 편집기를 종료하고 다시 시작해야합니다.
Rafael Bugajewski

130
당신은 또한 같은 수 있습니다 : 섹스 (대한 속기 분할 탐험 :-))
피터 Jankuliak

6
또한 : e는 현재 창에서 탐색을 엽니 다. 보다 흥미 진진하지 않지만 : 그러나 더 효율적이다;).
Josh

56
대담하지 않은 경우 세로 : Sex는 : Vex입니다.
hobbes3

5
@Josh : E는 나를 위해 작동합니다. : e 그것은 나를 위해 작동하지 않습니다. : e를 사용하여 같은 창에서 다른 파일을 편집합니다.
omar

159

git을 사용하고 이미 tpope의 플러그인 fugitive.vim이있는 경우 간단히 다음을 수행하십시오.

:Gmove newname

이것은 :

  1. 디스크에서 파일 이름을 바꿉니다.
  2. git repo에서 파일 이름을 바꿉니다.
  3. 파일을 현재 버퍼로 다시로드하십시오.
  4. 실행 취소 기록을 유지하십시오.

파일이 아직 git repo에 추가되지 않은 경우 먼저 파일을 추가하십시오.

:Gwrite

4
내 눈에서 나오는 눈물. 완벽한 답변!
Farid Nouri Neshat

3
이 답을 기리기 위해 염소 두 마리를 희생했습니다! 그러나 작업 트리의 루트에서 경로를 입력해야하기 때문에 작은 문제가 있습니다. 그리고 이것은 종종 모든 프로젝트에서 다소 길어집니다. 이것에 대한 해결책이 있습니까?
xor

1
대단해! 도망자가 할 수있는 새로운 일을 계속 찾고 있습니다.
Rich Churcher

8
@xxor : Mesco의 답변에서 언급했듯이 Ctrl + R %를 사용하여 현재 파일 이름을 삽입 한 다음 편집 할 수 있습니다.
deltab

4
여기에 몇 가지 주석을 결합하려면 :Gmove새 파일 이름의 상대 경로가 필요합니다. 이를 수행하는 좋은 방법 :Gmove <ctrl-r>%은 현재 경로 / 파일 이름을 추가하는 유형을 입력 하는 것입니다.
shmup

80

NERDTree 플러그인으로하고 있습니다.

:NERDTreeFind

그런 다음 m

이름을 바꾸려면 (m)ove the current node파일 이름을 선택 하고 변경할 수 있습니다 . 또한 삭제, 복사, 이동 등과 같은 옵션이 있습니다.


1
그것이 요즘 내가 물건의 이름을 바꾸는 주된 방법 인 것을 알고 있습니다
Sam Saffron

2
이것은 정말 잘 작동합니다. 확실히 추천합니다.
Matt Setter

아이디어를 사랑하십시오. 이것이 내 주요 변경 파일 이름 방법입니다.
SLN

72
  • 편집하는 동안 파일을 작성하십시오 :w newname--사본을 작성하십시오.
  • 새 사본 편집을 시작하십시오 :e#.
  • (선택 사항) 기존 사본을 제거합니다 :!rm oldname.

Windows에서 선택적 3 단계는 약간 변경됩니다.

  • (선택적으로) 오래된 Windows 사본을 제거하십시오 :!del oldname.

3
나는이 모든 접근 시간을 사용하지만, 단점은 당신이 당신의 실행 취소 트리를 잃을 것입니다 - 그래서 당신 수있는 전에하지 취소 아무것도 : 전자
rampion

7
좋은. 분명히 Ctrl-6은 : e #
glenn jackman

디렉토리를 열고 커서를 파일로 이동 한 다음 "D"를 눌러 파일을 삭제할 수도 있습니다.
Peder

38
imho가 더 직접적인 방법은 1) 현재 버퍼의 이름을 바꾸십시오 :f newname.2) 저장하십시오 :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
적어도이 답변에 투표를 한 이유를 설명 할 수 있습니다.
Benjamin

31

나는 :Renametpope의 내시 에서 권장 합니다.

또한 다른 많은 편리한 명령이 포함되어 있습니다.

이름 바꾸기 명령은 현재 다음과 같이 정의됩니다 (업데이트하려면 리포지토리를 확인하십시오!).

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 2016 년

31

플러그인없이 짧고 안전합니다.

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

control+ R, #일순간에 확대 될 대체 파일 누르기 전에 (현재 창에서 이전에 편집 경로) Enter. 이를 통해 정확히 무엇을 삭제할 것인지 검토 할 수 있습니다. |이러한 경우 파이프 를 사용 하는 것은 안전 하지 않습니다.sav 어떤 이유로 든 실패 하더라도 #여전히 다른 장소를 가리킬 것입니다 (또는 아무것도 아님). 그것은 완전히 다른 파일을 의미 !rm #하거나 delete(expand(#))삭제할 수 있습니다! 따라서 손으로주의 깊게 작성하거나 훌륭한 스크립트를 사용하십시오 (여기에서 많은 답변에 언급되어 있음).

교육적인

... 함수 / 명령 / 스크립트를 직접 작성해보십시오. 다음과 같이 sth simple에서 시작하십시오.

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

vimrc reload 후을 입력하십시오 :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에서 작동했음을 분명히해야하지만, 나는 서버로 썰어 오늘 그것을 시도했고 두 번째 명령은 콜론 명령으로 취급되지 않은 것 같습니다 ...
murftown

1
실제로 지금은 MacVim에서도 작동하지 않습니다. 드로잉 보드로 돌아갑니다! :)
murftown

2
그것은해야한다:exe "!mv % newfilename" | e newfilename
제이크

고마워 Jake, 내 솔루션보다 조금 낫다. 업데이트되었습니다.
murftown

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

7

Tim Pope에 의해 vim-eunuch 라는 상당히 큰 플러그인 이 있습니다.이 기능에는 이름 바꾸기 기능과 다른 기능 (삭제, 찾기, 모두 저장, chmod, sudo edit 등)이 포함되어 있습니다.

vim-eunuch에서 파일 이름을 바꾸려면 :

:Move filename.ext

rename.vim과 비교 :

:rename[!] filename.ext

몇 가지 키 입력을 저장합니다 :)


그리고 실제로 다른 유용한 기능들이 있습니다!
Pierre-Adrien Buisson '8

5

플러그인을 사용하지 않고 기존 파일의 이름을 바꾸려면 명령을 사용해야합니다

:Explore

이 명령을 사용하면 디렉토리에서 파일을 탐색하거나 삭제하거나 이름을 바꿀 수 있습니다. R파일 이름을 바꿀 수있는 type 명령 보다 탐색기에서 필요한 파일을 탐색해야합니다.


3

이것이 "가장 쉬운"방법인지는 모르겠지만 파일 (: w)을 이미 저장했다고 가정하면 쉘 (: sh)을 호출하고 간단한 cp foo foo.bak를 수행합니다. 편집기로 돌아가려면 Ctrl-D / Exit를 사용하십시오. 이 링크에서 유용한 vi 편집기 명령 목록


파일 이름이 바뀌지 않고 파일이 복사됩니다.
innaM

아- "사람을 계속 편집하고 싶습니다 .haml_spec.rb"를 잘못 읽었습니다.
DBMarcos99

나는 당신이 할 수 있다고 생각합니다 :! cp foo foo.new 다음 : e foo.new?
DBMarcos99

3

: f 다음에 : w를 사용할 수도 있습니다.


3
이전 파일은 제거되지 않습니다.
Keith Pinson

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

또 다른 방법은 virw의 기본 부분 인 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.