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)

  1. 현재 파일의 절대 경로를 구한다 → /path/to/file.txt

  2. /을 제거 → path/to/file.txt

  3. 그것을 /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까지 정리하기
    등도 확장할 수 있어요. 원하시면 도와드릴게요.

Categories:

Updated: