GVim 파일 자동 이동 설정
gvim에서 특정 키 조합을 누르면 현재 파일을 닫고 특정 경로로 옮기는 기능을 넣고 싶어. (임시 휴지통 같이 동작) 예를 들어, 내가 보는 파일이 /path/to/file.txt 였다고 가정하고 옮기고자 하는 폴더가 /user/RECYCLE_BIN 이라고 하면 파일을 /user/RECYCLE_BIN/path/to/file.txt 로 옮겨야해.
GVim에서 특정 키 조합으로 현재 열려있는 파일을 지정된 "임시 휴지통" 경로로 이동 시키는 기능을 구현하려면 다음과 같은 방식으로 설정할 수 있습니다.
🧠 목표 정리
-
현재 편집 중인 파일을
:w없이 닫음 -
파일을
/user/RECYCLE_BIN/path/to/file.txt로 이동 (디렉토리 구조 유지) -
특정 키 조합으로 실행
🛠️ Step-by-step 구현 방법
1. Vim 함수 정의 (vimscript 사용)
vim
function! MoveToRecycleBin()
let l:src = expand('%:p') " 현재 파일 절대 경로
if !filereadable(l:src)
echoerr "Cannot move: file does not exist"
return
endif
let l:relpath = fnamemodify(l:src, ':~:.') " 상대 경로 추출
let l:target = '/user/RECYCLE_BIN/' . l:relpath " 휴지통 경로
" 상위 디렉토리 생성
call mkdir(fnamemodify(l:target, ':h'), 'p')
" 파일 이동
call rename(l:src, l:target)
" 버퍼 닫기
bdelete!
endfunction
✅ 이 스크립트는:
현재 편집 중인 파일의 절대 경로를 가져와서,
/user/RECYCLE_BIN아래에 같은 구조로 옮기고,해당 버퍼를 닫습니다.
2. 키 매핑 설정 (예: <Leader>d)
vim
nnoremap <Leader>d :call MoveToRecycleBin()<CR>
<Leader> 키는 보통 \로 설정되어 있으므로, \d로 실행 가능하게 됩니다. 다른 키 조합으로 바꿔도 됩니다.
📁 예시
예를 들어 현재 파일이 다음과 같다면:
/home/myname/projects/test.txt
스크립트는 다음으로 파일을 이동시킵니다:
/user/RECYCLE_BIN/home/myname/projects/test.txt
✅ 참고 및 권장사항
-
:checkpath또는:pwd로 경로를 점검할 수 있음 -
mkdir(..., 'p')는 중첩 디렉토리를 자동 생성 -
rename()은 파일을 이동시키는 함수이며 기존에 존재하면 덮어쓰지 않음 -
이 스크립트를
~/.vimrc또는~/.config/nvim/init.vim에 추가하면 매번 사용할 수 있습니다
원한다면 Lua 기반 Neovim 설정으로도 제공할 수 있습니다. 필요하신 경우 알려주세요.
아 옮기고 나서 아래에 메시지로 옮겼다고 유저에게 알려줬으면 좋겠어
좋습니다! 옮기고 나서 사용자에게 상태 메시지 를 하단에 출력하려면 echom 또는 echo를 사용하면 됩니다. :echo는 바로 메시지를 보여주고, :echom은 메시스 히스토리(:messages)에도 남습니다.
다음은 요청하신 "파일을 옮겼다고 알려주는 메시지 포함 버전"입니다.
✅ 최종 Vim 함수
vim
function! MoveToRecycleBin()
let l:src = expand('%:p') " 현재 파일 절대 경로
if !filereadable(l:src)
echoerr "Cannot move: file does not exist"
return
endif
let l:relpath = fnamemodify(l:src, ':~:.') " 상대 경로 추출
let l:target = '/user/RECYCLE_BIN/' . l:relpath " 휴지통 경로
" 상위 디렉토리 생성
call mkdir(fnamemodify(l:target, ':h'), 'p')
" 파일 이동
if rename(l:src, l:target) == 0
" 성공 시 메시지 출력
echom "Moved to recycle bin: " . l:target
" 버퍼 닫기
bdelete!
else
echoerr "Failed to move file to recycle bin."
endif
endfunction
🧩 키 매핑 예시
vim
nnoremap <Leader>d :call MoveToRecycleBin()<CR>
<Leader>d → 현재 파일을 휴지통으로 옮기고 닫으며, 상태 메시지를 하단에 출력합니다.
📝 동작 예시
-
현재 파일:
/home/you/notes/todo.txt -
이동 후:
/user/RECYCLE_BIN/home/you/notes/todo.txt -
메시지 출력:
Moved to recycle bin: /user/RECYCLE_BIN/home/you/notes/todo.txt
추가 제안
- 메시지를 더 강조하고 싶다면
echohl로 색상 강조도 가능합니다:
vim
echohl WarningMsg | echom "Moved to recycle bin: " . l:target | echohl None
필요하면 이 부분도 적용해 드릴 수 있어요.
뭔가 좀 이상한데 /user/RECYCLE_BIN/ 뒤에 절대 경로를 붙여야 하는데
좋은 지적입니다! 말씀하신 대로 현재 스크립트는 :~:. 형식으로 상대 경로를 만들고 있어 /user/RECYCLE_BIN/home/you/... 처럼 전체 절대 경로가 붙는 것이 아니라, 홈 디렉토리 기준으로 상대경로가 붙을 가능성이 있습니다.
당신이 원하는 건 그냥 현재 파일의 절대 경로를 그대로/user/RECYCLE_BIN 뒤에 붙이되, 앞의 슬래시는 제거하는 것입니다. 즉:
pgsql
/path/to/file.txt → /user/RECYCLE_BIN/path/to/file.txt
🧠 해결 전략 (step-by-step)
-
현재 파일의 절대 경로를 구한다 →
/path/to/file.txt -
첫
/을 제거 →path/to/file.txt -
그것을
/user/RECYCLE_BIN/뒤에 붙인다 →/user/RECYCLE_BIN/path/to/file.txt
✅ 수정된 Vim 함수 (요구사항 완전 반영)
vim
function! MoveToRecycleBin()
let l:src = expand('%:p') " 현재 파일 절대 경로
if !filereadable(l:src)
echoerr "Cannot move: file does not exist"
return
endif
" 절대 경로에서 선행 슬래시 제거
let l:clean_path = substitute(l:src, '^/', '', '')
let l:target = '/user/RECYCLE_BIN/' . l:clean_path
" 상위 디렉토리 생성
call mkdir(fnamemodify(l:target, ':h'), 'p')
" 파일 이동
if rename(l:src, l:target) == 0
echom "Moved to recycle bin: " . l:target
bdelete!
else
echoerr "Failed to move file to recycle bin."
endif
endfunction
🔑 키매핑 (예시)
vim
nnoremap <Leader>d :call MoveToRecycleBin()<CR>
✅ 예시
-
현재 파일:
/home/you/code/test.txt -
이동 대상:
/user/RECYCLE_BIN/home/you/code/test.txt -
메시지:
Moved to recycle bin: /user/RECYCLE_BIN/home/you/code/test.txt
필요하면 경로를 시간 스탬프 등으로 백업처럼 구성하는 것도 도와드릴 수 있습니다.
그냥 절대 경로를 /user/RECYCLE_BIN 뒤에 붙이면 되지
맞습니다! 말씀하신 대로 불필요하게 슬래시를 제거하거나 상대 경로로 바꿀 필요 없이 , 그냥 현재 파일의 절대 경로 그대로를/user/RECYCLE_BIN/ 뒤에 붙이면 됩니다.
즉, 단순히 "RECYCL_BIN" + 현재 파일 절대 경로만 하면 OK입니다.
✅ 깔끔하게 수정한 Vim 함수 (최소한의 변경)
vim
function! MoveToRecycleBin()
let l:src = expand('%:p') " 현재 파일 절대 경로
if !filereadable(l:src)
echoerr "Cannot move: file does not exist"
return
endif
let l:target = '/user/RECYCLE_BIN' . l:src " 그냥 절대 경로 그대로 붙이기
" 상위 디렉토리 생성
call mkdir(fnamemodify(l:target, ':h'), 'p')
" 파일 이동
if rename(l:src, l:target) == 0
echom "Moved to recycle bin: " . l:target
bdelete!
else
echoerr "Failed to move file to recycle bin."
endif
endfunction
🧪 예시 동작
-
현재 파일:
/home/user/docs/note.md -
이동 후 경로:
/user/RECYCLE_BIN/home/user/docs/note.md -
메시지 출력:
Moved to recycle bin: /user/RECYCLE_BIN/home/user/docs/note.md
⌨️ 키 매핑 예시
vim
nnoremap <Leader>d :call MoveToRecycleBin()<CR>
필요하면:
-
파일 이름에 타임스탬프 붙이기
-
휴지통 자동 비우기 기능
-
undotree까지 정리하기
등도 확장할 수 있어요. 원하시면 도와드릴게요.