TL;DR

  • Vim의 NetRW를 tmux와 사용자 정의 미리보기 스크립트에 결합하면 Vim 키 바인딩을 유지하면서 파일 브라우저에서 이미지·텍스트·디렉터리 미리보기를 표시하는 구성이 가능함.
  • Dolphin과 셸 파일 작업 이후 사용한 ranger는 비동기성 부족과 대형 디렉터리의 지연이, Yazi는 글리프 표시 문제와 익숙하지 않은 키 바인딩이 아쉬운 점임.
  • NNN은 빠르고 Vim 스타일에 가까우며 preview-tui와 chafa로 이미지 미리보기를 구성할 수 있지만, 원하는 Vim 키 바인딩과 미디어 미리보기가 기본 제공되지 않는 점이 한계임.
  • NetRW 실행용 셸 함수는 tmux 두 패널에서 Vim의 :Ex와 미리보기 스크립트를 실행하고, 상태 표시줄을 끄며 배경 스타일을 설정함.
  • Vim 설정의 CursorMoved 이벤트가 NetRW에서 현재 선택한 파일 경로를 FIFO 파일에 기록하고, 미리보기 스크립트가 MIME 유형에 따라 chafa, cat, tree 등을 실행함.

Vim을 파일 브라우저로 사용하기

  • Vim을 오랫동안 주 편집기로 사용하며, 그래픽 인터페이스보다 CLI를 선호함. 터미널 환경은 단순하고 화면 크기와 색상이 일관되지만, 파일 관리자는 터미널 사용에서 예외로 남아 있음.
  • 한동안 빠르고 쉽게 쓸 수 있는 Dolphin을 사용했으며, 최근에는 터미널에서 직접 파일 작업을 하는 경우가 늘어남. 셸은 스크립팅 기능을 활용할 수 있어 그래픽 파일 관리자보다 확장성이 높지만, 기본적인 디렉터리 이동보다 시각적이고 간편한 전용 관리자를 원하게 됨.

ranger와 Yazi

  • 처음 시도한 TUI 파일 관리자는 ranger임. 바인딩 기반의 범용 디렉터리 정렬과 멀티미디어 미리보기를 제공하며, Vim 스타일의 키 바인딩과 모드 개념을 사용함.
  • 다만 ranger는 기대한 만큼 Vim 작업 공간을 재현하지 못했고, 비동기 방식이 아니라 대형 디렉터리 탐색 중 지연이 발생함.
  • 다음으로 비동기 Rust 파일 관리자인 Yazi를 살펴봄. Nerd Font 문자와 글리프를 활용하는 인터페이스가 기본 글꼴인 xorg-terminus에서 제대로 표시되지 않음.
  • 설정에서 글리프를 명시적으로 제거했는데도 메뉴 글리프 대부분이 유니코드 글꼴 오류로 나타났고, 키 바인딩 안내도 익숙하지 않아 ranger보다 불편했음.

NNN과 이미지 미리보기

  • NNN(N^3)은 작은 C 파일 브라우저로, 앞서 살펴본 두 프로그램보다 성능과 Vim 스타일 측면에서 나았음. 다만 멀티미디어 미리보기 등 익숙해진 기능 일부가 기본 제공되지 않음.
  • 문서를 참고해 preview-tui 플러그인을 설정함. 이 플러그인은 tmux 세션에 보조 패널을 열고, 커서가 가리키는 파일마다 지정한 프로그램을 실행하는 방식임.
  • 이미지 미리보기 명령으로 kittyimg나 chafa를 사용할 수 있으며, foot 터미널 환경에서는 chafa를 통합해 이미지에 커서를 올릴 때 보조 패널에서 식셀(Sixel) 미리보기를 표시함.
  • NNN 실행 시 tmux 세션을 자동으로 열고 닫는 래퍼를 구성함. NNN_TMPFILE은 마지막 디렉터리 정보를 저장하고, NNN_PREVIEWIMGPROG는 이미지 표시 명령을 지정하며, NNN_PLUG는 preview-tui 플러그인을 선택함.
  • NNN_FIFO와 NNN_PREVIEWDIR은 각각 FIFO와 미리보기 캐시 경로를 지정함. 셸 함수 n은 tmux에서 nnn -DCHE -P p를 실행하고, 종료 후 임시 파일의 디렉터리 정보를 셸에 적용한 다음 임시 파일을 삭제함.
  • NNN에도 정확히 원하는 Vim 키 바인딩이 없지만, 이는 개인적으로 까다롭게 느끼는 부분이라고 설명함.

NetRW와 tmux 래퍼

  • NetRW는 Vim에 내장된 편집기 겸 파일 탐색기이며, Vim 안에서 :Ex로 실행할 수 있음. Vim에 내장되어 있어 Vim의 키 바인딩과 설정을 그대로 사용함.
  • Vim 내부에 터미널 창을 넣는 방식으로는 식셀 이미지나 다른 터미널 이미지 프로토콜을 표시할 수 없다고 판단함. 반면 NNN의 preview-tui가 사용하는 tmux는 식셀 및 관련 프로토콜을 지원하므로, tmux 보조 패널을 NetRW 미리보기에 활용함.
  • ex 셸 함수는 tmux 세션에서 vim -c Ex로 NetRW를 실행하고, 두 번째 패널에서 netrw_preview 스크립트를 실행함. Vim 종료 시 netrw_preview 프로세스를 종료하며, 활성 패널을 선택하고 창 배경 스타일을 기본값으로 설정한 뒤 상태 표시줄을 끄고 세션에 연결함.
  • 두 패널 중 첫 번째는 NetRW이고 두 번째는 파일 미리보기용임. 배경 투명도와 하단 상태 표시줄 제거는 시각적 설정에 해당함.

NetRW 미리보기 스크립트

  • 미리보기 스크립트는 /tmp/netrw-current 파일을 감시하고, 새 경로가 전달되면 이전 미리보기 프로세스를 종료한 뒤 화면을 지움.
  • 선택된 경로의 심볼릭 링크를 실제 경로로 해석하고 file 명령으로 MIME 유형을 확인함. 터미널 행 수에서 두 줄을 빼 미리보기 출력의 최대 길이로 사용함.
  • MIME 유형이 이미지이면 chafa -f sixel로 표시하고, 텍스트이면 파일 앞부분을 출력하며, 디렉터리이면 tree 결과를 출력함. 그 밖의 유형은 MIME 유형 문자열을 표시함.
  • 이미지 표시 프로세스는 백그라운드로 실행하며, 다음 항목으로 이동할 때 프로세스를 종료하고 기다림. 텍스트와 디렉터리 출력은 터미널에 맞는 행 수로 제한함.

Vim 설정과 현재 항목 전달

  • NetRW에는 선택 항목 변경을 공개 파일에 기록하는 내장 FIFO 기능이 없으므로, Vimscript로 현재 커서가 가리키는 항목의 절대 경로를 지정 파일에 기록함.
  • NetRW 설정은 배너를 끄고 목록 스타일을 3으로 지정하며, 창 크기와 정렬 기준을 설정함. 숨김 파일 패턴과 ls -v 목록 명령도 지정함. netrw_altv와 netrw_keepdir는 설정에 중복된 값이 있으며, 각각 서로 다른 값이 설정됨.
  • NetRW 버퍼에서는 절대 행 번호와 상대 행 번호를 함께 표시함. 이는 기본 Vim 편집기 설정과 일치하며, 상대 행 번호를 기준으로 이동하는 방식을 선호함.
  • FileType netrw 자동 명령은 버퍼별 마지막 항목을 기록하고, CursorMoved 이벤트에서 netrw#Call('NetrwGetWord')로 현재 항목을 가져옴. 항목이 이전 값과 다르면 현재 디렉터리와 항목명을 결합해 절대 경로를 만들고 /tmp/netrw-current에 추가함.
  • 미리보기 스크립트는 이 파일을 계속 감시하므로, 커서가 NetRW에서 다른 항목으로 이동할 때 해당 경로를 받아 미리보기를 갱신함. MIME 유형에 대한 분기와 명령을 추가해 다른 미디어 유형을 처리하도록 확장할 수 있으며, PDF나 애니메이션 GIF 미리보기도 구현할 수 있을 것으로 봄.

참고 자료

  • 추가 정보는 다음 저장소와 파일에서 확인할 수 있음.
  • git.sr.ht/~x3hy/dwl
  • script/netrw_preview
  • config/mkshrc
  • git.sr.ht/~x3hy/vim
  • vimrc
  • 파일 관리자 설정을 다듬는 데 하루 가까이 들였으며, 당분간 현재 구성을 그대로 두고 살펴볼 예정임. 게시물을 업데이트할 가능성은 낮다고 밝힘.