본문 바로가기
리눅스 잡기술

nnn으로 CLI에서 폴더와 파일 미리보기

by 하우론 2024. 9. 5.

결과물 먼저

nnn on zsh + tmux + git bash 시연 영상
Remote Ubuntu 20.04 서버에 tmux + zsh를 사용했고 preview-tui 플러그인에서 imgcat으로 이미지 미리보기를 했다.

 

아래는 공식 데모이다.

 

nnn terminal filebrowser demo

Discover topics like linux, terminal, and the magic of the internet at Imgur, a community powered entertainment destination. Lift your spirits with funny jokes, trending memes, entertaining gifs, inspiring stories, viral videos, and so much more from users

imgur.com

 

 

개요

 

GitHub - jarun/nnn: n³ The unorthodox terminal file manager

n³ The unorthodox terminal file manager. Contribute to jarun/nnn development by creating an account on GitHub.

github.com

엄청난 앱을 하나 발견했다. CLI에서 파일 익스플로러처럼 탐색을 하게 해준다. 파일 작업이 많고 대부분 리모트로 작업하는 AI 개발자한테는 한 줄기 빛 같은 존재이다. 머시기머시기 뷰와 같이 ssh 기반의 GUI 앱을 이용할 수도 있지만 파일이 많은 폴더 잘못 열었다가는 컴퓨터가 폭발한다. 하지만 nnn은 가벼운 lesstree 기반으로 목록을 출력하고 출력을 자른다. 게다가 플러그인들이 전부 shell로 구현되어있어 무한 커스텀이 가능하다!

원래는 iTerm, WSL2 등 기능이 많은 로컬 쉘 인터페이스에서 쓰라고 만들어놓은 것 같다. 하지만 나는 윈도우 유저라 iTerm이 없고 WSL은 램 도둑에 하자가 많아서 안 좋아한다. 따라서 커스텀을 직접 해야 한다. 예를 들면, git bash는 화면 분할 기능이 없기 때문에 tmux를 필수적으로 써야 한다.

자랑 하나 하자면 원래 tmux에서 이미지랑 폴더 미리보기 안 됐는데 내가 커스텀했다. 

 

설치

위 페이지의 Quickstart에서 하라는 대로 하면 된다. 3번이랑 8번은 안 해도 된다. 7번은 리모트라면 까먹지 말고 꼭 하셔야 한다.

 

1번만 좀 복잡하니 1번만 설명하겠다.

apt-get 등으로 한 번에 설치하는 방법이 있지만 버전 업뎃이 느리니 소스로 직접 설치한다. 일단 latest_release에 있는 파일 하나씩 아래 2개 빼고 다 다운 받아준다. 오른쪽마우스 -> 링크 복사 -> 쉘 가서 wget 링크 하면 된다. 좋아요로 감사 표시도 한다. tar.gz 파일은 tar -xvzf 파일이름으로 압축을 해제한다. .sig 파일은 보증 문서 같은 거라 냅둬도 된다.

위와 같이 예쁘게 정리해준다.

 

sudo permission이 있을 경우

cd nnn-5.0
sudo make strip install

해주면 된다.

 

하지만 보통 리모트 + 멀티 유저 환경이면 permission이 없다. 그런 경우 PREFIX를 활용해 나만 쓸 수 있도록 설치한다.

cd nnn-5.0/
make strip install PREFIX=설치하고싶은폴더/.local

그리고 이 사실을 몰랐을 경우 PATH도 설정이 안 돼있을 확률이 높다. bash를 쓴다면 ~/.bashrc, zsh를 쓴다면 ~/.zshrc로 가서 최하단에

PATH=$PATH:설치하고싶은폴더/.local/bin

을 삽입해준다. 그리고 source ~/.zshrc 등을 해주면 된다.

 

사용법

설명 잘해주신다. 색깔 설정도 알려주신다.

맥 iTerm 유저라면 저 영상대로만 해도 막힘 없이 사용할 수 있다. 하지만 윈도우 유저라면 아래의 커스텀이 필요하다. 먼저 vim ~/.zshrc로 rc 파일을 열어준다. ^G (시프트 G)를 누르면 최하단으로 이동한다. 거기다 아래 스크립트를 붙여넣어주면 된다.

############################
# nnn plugin setup

export NNN_PLUG='j:autojump;p:preview-tui;t:preview-tabbed;i:imgview;v:vidthumb;o:fzopen'
export NNN_OPENER="/data/$USER/.config/nnn/plugins/nuke"
export NNN_FIFO="/tmp/nnn.fifo"
export NNN_PREVIEWIMGPROG="imgcat"  # used in preview-tui
export NNN_SPLIT='v'  # used in preview-tui
export NNN_SPLITSIZE='55'  # used in preview-tui

mn () {
  session_name="${2:-'nnn'}";
  # if the session already exists, kill it
  tmux kill-session -t "$session_name" 2>/dev/null;
  tmux new-session -d -s "$session_name" "source ~/.zshrc && nnn -a -c -d -e -U $@";
  tmux attach-session -t "$session_name";
}

:wq + 엔터 하면 문서가 저장 후 닫힌다. 하단에 --INSERT-- 라고 써있으면 ESC를 몇 번 눌러준 후 :wq + 엔터를 다시 입력하면 된다. (참고로 위 명령어들은 vim 기본 명령어이다. 기억하면 도움 많이 된다.) 위 스크립트를 한 줄씩 설명하겠다.

 

설명 (생략 가능)

nnn은 따로 config 파일 같은 것이 없다. 0-config가 nnn의 특장점이다. 모든 설정값을 nnn을 시작할 때 환경변수로 입력해주는 식으로 작동한다. Portability의 끝판왕이라 할 수 있다.

export NNN_PLUG='j:autojump;p:preview-tui;t:preview-tabbed;i:imgview;v:vidthumb;o:fzopen'

플러그인을 삽입한다. ;로 구분된다. = 양쪽에 띄어쓰기 하면 안 된다. 단축키:플러그인이름 구조로 되어있다. 실제 사용은 nnn을 켜고 ;을 입력하면 하단에 단축키 목록이 나온다. 이 때 원하는 키를 눌러주면 된다. preview-tui 플러그인을 가장 많이 쓰게 된다.

`;`를 입력해야 뜬다!!!

플러그인 목록은 여기서 확인할 수 있고, 설치가 잘 됐다면 ${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins에 아래와 같이 설치되어있어야 한다. XDG_CONFIG_HOME를 따로 설정했다면 그 폴더 밑의 ./nnn/plugins, 설정하지 않았다면 ~/.config/nnn/plugins에 설치되어있을 것이다. 나도 아직 다 안 써봐서 각자의 기능은 잘 모른다. 괜찮은 플러그인이 있으면 업데이트 하겠다!

나는 XDG_CONFIG_HOME을 따로 설정해줬기에 홈이 아니고 다른 곳에 설치가 됐다. 설치가 잘 됐다면 이렇게 떠야 한다.

 

export NNN_OPENER="/data/$USER/.config/nnn/plugins/nuke"
export NNN_FIFO="/tmp/nnn.fifo"

퀵스타트와 똑같다. nnnnuke로 열게 하고 nnn의 서브 프로세스들이 통신할 수 있도록 FIFO 파일 경로를 지정해준다.

 

export NNN_PREVIEWIMGPROG="imgcat"  # used in preview-tui
export NNN_SPLIT='v'  # used in preview-tui
export NNN_SPLITSIZE='55'  # used in preview-tui

preview-tui 플러그인을 위한 셋업이다. 나중에 설명하겠다.

 

mn () {
  # tmux's session name, should be unique, used for attaching, killing
  session_name="${2:-'nnn'}";
  
  # if the session already exists, kill it.
  # 2>/dev/null for dumping the message
  tmux kill-session -t "$session_name" 2>/dev/null;
  
  # open a new tmux session in "detached mode", meaning it will be running in the BG
  # send a command to the session and it'll run the cmd once done opening
  tmux new-session -d -s "$session_name" "source ~/.zshrc && nnn -a -c -d -e -U $@";
  
  # Let's get into the session!
  tmux attach-session -t "$session_name";
}

nnntmux에서 여는 걸 단축키로 만들었다. mn [경로] [세션이름] 하면 해당 경로에서 tmux 세션 이름을 갖고 열린다. 그냥 mn만 치면 현재 경로에서 기본 세션이름 nnn을 갖고 열린다. 만약 같은 이름의 세션이 존재하면 킬 하고 연다.

zsh 유저면 세션을 딱 켰을 때 oh-my-zsh가 제대로 세팅이 안 된 모습을 볼 수 있을 것이다. mn 같은 alias도 작동을 안 한다. 왜인지 모르겠다. 세션을 켜자마자 source ~/.zshrc 하도록 해주면 해결된다. 그리고 nnn을 열게 한다. $@bash에서 '사용하지 않은 나머지 argument들 전부' 를 뜻한다. mn 경로 세션 foo bar baz라고 치면 경로세션은 앞에서 사용했기 때문에 $@에는 foo bar baz가 그대로 들어간다. nnn에 추가 옵션을 주고 싶을 때 사용한다.

 

 

preview-tui 플러그인 tmux에서도 "제대로" 돌아가게 하기

원래 tmux 구현은 돼있다. 하지만 하자가 많다. tmux에서 이 플러그인을 켜면 오류만 뜬다. 아래를 따라하면 된다. 목표는 저 % 글자 1개를 지우는 것이다. 185번째 줄에 있다.

 

vim ~/.config/nnn/plugins/preview-tui

로 편집기를 켜고 :185 엔터 -> 저기로 커서 이동 -> a 입력 (수정모드) -> 백스페이스로 지우기 -> ESC (수정모드 탈출) -> :wq 엔터 하면 된다. 혹시 실수했다면 :q! 엔터 (저장 안 하고 종료) 한 다음 다시 시도한다.

이제 mn -> ;p를 입력해보면 플러그인이 작동하는 것을 볼 수 있다.

 

이미지 미리보기

하지만 아직 이미지는 보이지 않는다. 아래와 같이 메타 정보만 뜬다.

(TODO)

(공략 글 쓰고 있는데 갑자기 imgcat이 안 먹는다.)

 

* 정중앙에 리사이즈 해서 보이게 하기
* non-block으로 만들기

'리눅스 잡기술' 카테고리의 다른 글

VSCode Terminal에서 이미지 보기  (0) 2024.01.17