[ZSH] 오토로딩 함수만들기

Harry The Great
해리의 유목코딩
3 min readJan 5, 2020

ZSH의 Autoloading Function

Z쉘에서는 커스텀 함수를 autoloading functions로 가져올 수 있습니다. 처음에는 함수를 빈상태(no body)로 로드했다가 함수가 호출될 때 쉘에서 변숫값(fpath)으로 정의된 함수를 찾아 로드하고 실행하는 Lazy Loading 형태의 함수입니다. 맨 처음부터 로드되지 않기 때문에 함수가 많더라도 매우 빠르게 동작합니다.

함수만들기

mkdir ~/.zfunc

저는 홈 디렉터리 하단에 만들었으며 폴더명은 원하는 폴더명으로 하셔도 무관합니다. 저는 안드로이드 스크린샷을 저장하는 커맨드로 만들었는데 만약 딱히 하고 싶은 명령어가 없다면 echo “test”와 같은 간단한 에코 문을 작성해주세요.

오토 로딩 함수에서는 별도의 함수 실행 스크립트 없이 함수만 작성할 수 있습니다. 위와 같이 작성한 후 아래와 같은 path로 저장합니다.

~/.zfunc/srh

~/.zshrc 수정

# 함수로 추가할 디렉토리를 auto complete 목록에 포함합니다.
fpath=($fpath ~/.zfunc)
# autoload에 zfunc이하 모든 항목을 선언합니다.
autoload -Uz ~/.zfunc/**/*

수정을 한 후 source ~/.zshrc 커맨드를 실행한 후 src를 입력하면 이전에 만든 함수 안의 내용이 출력됩니다. 이후에 zfunc에 추가되는 모든 함수들은 자동으로 등록이되며 파일들이 많더라도 성능부하는 크게 일어나지않습니다.

오토로드 비활성화하기

위에서 언급하였던것처럼 lazy load형식으로 호출되기때문에 다음과 같은 문법으로 사용할경우 에러가 발생합니다.

eval "$(functions)" # 에러발생

만약 오토 로드가 아닌 처음부터 로드하고 싶다면 함수 내에 autoload -X를 한 줄 추가하면 됩니다.

단축키 설정

이제 커스텀 단축키를 통해서 명령어를 실행해보겠습니다. 함수는 곧바로 단축키에 등록할 수 없기 때문에 먼저 함수를 zle(Z-shell Line Editor)에 위젯으로 등록한 후 위젯과 단축키를 연결해야 합니다.

~/.zshrc 수정

# zle에 새로운 위젯을 만드는 -N 옵션과 위젯명을 전달합니다.
# 함수명이 생략될경우 위젯명과 동일한 함수명으로 등록됩니다.
zle -N src# ctrl + e키를 src 위젯에 할당합니다.
bindkey '^e' src

다시 커맨드로 돌아와 source 명령어 후 단축키를 누르면 동일하게 실행됩니다. 만약 명령어가 정상적으로 작동하지 않는다면 아래 명령어를 입력하여 어느 곳이 문제인지 확인할 수 있습니다.

zle -al # 등록된 모든 위젯의 리스트를 보여줍니다.
bindkey # 등록된 모든 bindkey와 위젯을 보여줍니다.

--

--

Harry The Great
해리의 유목코딩

Android & IOS Developer 😀 미디움 이외에 스니펫이나 디버그노트로 활용하는 https://www.harrymikoshi.com/ 블로그도 운영하고있습니다.