nnn: Sync subshell $PWD ?? 이게 뭔 소리래? 아울러 Quick Start 해석.

생각해보니, nnn 을 알게된 계기는, macOS 에서, 한국어가 포함된 디렉토리를 mc 가 제대로 표시하지 못하는데 있었던 듯 하다. 그리고 눈에 확 뜨일 정도로 mc 실행이 느렸던 점도 있고.

그건 그거고.. nnn 의 Quick Start 항목에는 다음과 같은 항목이 있다. 이게 아무리 최신(?) 프로그램(1.0 이 2017년 4월)이고, 나름 전문가(?)들을 위해 만들어졌다지만, 시작점에서부터 각종 암호가 난무하다니. 나름 일자무식은 아니라 자부하는 나로서도 이해가 잘 안되는게 많았다.

  1. Install nnn and the dependencies you need.
  2. The desktop opener is default. Use -e to open text files in the terminal. Optionally open detached.
  3. Configure cd on quit.
  4. Sync subshell $PWD to nnn.
  5. Install plugins.
  6. Use -x to sync selection to clipboard, show notis on cpmvrm and set xterm title.
  7. For a CLI-only environment, set NNN_OPENER to nuke. Use option -c.
  8. Bid ls goodbye! alias ls='nnn -de' 😎
  9. Visit the Live previews and Troubleshooting Wiki pages.

1번은 어려울게 없다.

2번부터 헷갈린다. 흠..?

Desktop Opener 가 기본이라는 말은, 예를 들어 abcd.txt 라는 파일 위에서 Enter 를 눌렀을 때, GUI 에디터가 이 파일을 연다는 뜻이다. 이게 싫고, 그냥 터미널 편집기(vim 등)를 쓰고 싶다면, nnn -e 로 실행하라고 한다.

3번은, MC 에서 Wrapper 를 사용해 구현했던 기능을 쓸 수 있게 해준다. 즉, nnn 을 실행하고 디렉토리를 이동한 뒤 종료했을 때, 이동한 그 디렉토리가 현재 디렉토리가 되게 설정할 수 있다.

4번이 이 글을 쓰게된 배경이다. 저 기능을 구현한 명령을 봐도 뭔 말인지 알 수가 없었다. (물론, 내 Shell Script 이해력이 떨어져서 그렇긴 하지만) 그리하여, 찾아봤다. 이게 도대체 무슨 소린지. 다행히도, 답은 금방 찾을 수 있었다.

MC 에 있는 기능이라는데, MC 에서 일단 프롬프트로 나간 뒤(Ctrl+o), 디렉토리를 이동하고, 다시 MC 로 오면, MC 는 원디렉토리가 아니라 사용자가 변경한 디렉토리를 보여준다고 한다. 이 기능을 구현하는 방법이 4번이다. 난 사실 이런 기능을 쓴 적이 없어서 굳이 설정해야할 필요는 없겠으나..

설명서에 있는, 글쓴이의 과격한 생략작법(?) 때문에, 뭘 어쩌라는 건지 알 수가 없었다. 역시나 좀 더 찾아보고 나서야 설정하는 법을 알아낼 수 있었다. (과연, 전문가(?)들은 저 설명만 보고도 방법을 다 알 수 있으려나..?) 아무튼, 설정 및 실행법은 이렇다.

bash/zsh 에 따라 명령을 살짝 바꿔줘야 한다. 설명서는 bash 기준으로 돼 있다. 먼저, .bashrc, .zshrc 등에 다음 내용을 넣는다. (또는 oh-my-zsh 라면, $HOME/.oh-my-zsh/custom 에 아예 nnn 전용 파일을 만들어도 된다.)

nnn_cd()
{
    if ! [ -z "$NNN_PIPE" ]; then
        printf "%s\0" "0c${PWD}" > "${NNN_PIPE}" !&
    fi
}

trap nnn_cd EXIT

그리고, nnn plugin 디렉토리에, shell 이란 이름으로 파일을 만들고(사실 이름은 아무거나 적당히 주면 된다.), 다음 내용을 넣는다. (bash 면 bash 로)

#!/usr/bin/env zsh

# Description: Start an interactive zsh shell.
export nnn="$1"

zsh -i

그리고, 저 plugin 을 등록시켜야 한다. .zshrc 등에 export 로 만들어준다.

export NNN_PLUG='s:shell'

또는, shell 파일을 만들지 않고, NNN_PLUG 에 직접 설정해도 된다.

export NNN_PLUG='s:!zsh -i*'

설정은 끝.
nnn 을 실행하고, ; 누른 뒤 s 를 누르면 프롬프트로 빠진다. (그냥 프롬프트로 나가는 명령은 ! 인데, 그렇게 하면 이 기능이 발동되지 않는다.) 나간 뒤 cd 로 이동하고, exit 로 되돌아오면, nnn 경로가 그 디렉토리로 바뀌어있음을 볼 수 있다.

(아.. 기네 길어.)

5번은 Plugin 항목을 보면 되겠고.. (여기에 간단히 설명하긴 좀 길다.)

6번은 실행 시에 -x 을 주고 실행했을 때 얻는 효과를 언급하고 있다. 여기도 좀 이상한데, -x 에 세가지 서로 다른 기능이 융합되어 있다.

  • cp/mv/rm 알림 기능 : 파일을 선택하고 cp 작업등을 수행하면, 완료된 후 알림창이 뜬다. (.ntfy 플럭인 필요)
  • 파일을 선택하면, 전체경로를 클립보드에 복사 (.cbcp 필요)
  • 터미널 제목창에 현재 디렉토리 표시

딱히 필요는 없을 듯. 알림 기능이 괜찮아보이긴 하지만, 차라리 macOS 에선 rsynccp 나, 리눅스에선 패치된 cp/mv 를 쓰는 편이 낫겠다.

7번은 GUI 가 없고, CLI 만 있는 환경에 유용하다. Headless server 등에 접속하여 사용할 때 필요할 듯.

8번은 Alias 를 만들어 ls 를 대체하라는 제안이고, 9번은 Wiki 문서들을 두루 살펴보라는 권고다.


이 정도면 일단 설치하고 돌려볼 순 있겠네.

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.