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/dwlscript/netrw_previewconfig/mkshrcgit.sr.ht/~x3hy/vimvimrc- 파일 관리자 설정을 다듬는 데 하루 가까이 들였으며, 당분간 현재 구성을 그대로 두고 살펴볼 예정임. 게시물을 업데이트할 가능성은 낮다고 밝힘.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요