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

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`은 가벼운 `less`와 `tree` 기반으로 목록을 출력하고 출력을 자른다. 게다가 플러그인들이 전부 `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"

퀵스타트와 똑같다. `nnn`을 `nuke`로 열게 하고 `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";
}

`nnn`을 `tmux`에서 여는 걸 단축키로 만들었다. `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