ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BlaCk Void Zsh 설계 및 기획 문서 공개
    IT/UX 2020. 1. 5. 02:13

    정말 오랜만에 쓰는 글이네요.

    이 많은 내용을 임시저장 없이 2/3까지 써놨는데 이미지 편집기능에서 무한로딩 걸려서 처음부터 다시 씁니다. ㅠㅠ


    오픈소스, 개발하고자 하면 온갖내용들을 참고하고 가격이나 제한도 덜한 편이라 참 좋습니다.

    하지만 사용법에 대한 문서는 충실하게 있는 반면, 설계와 기획에 대한 문서는 거의 없다시피 한것도 현실입니다.

     

    그래서 프로그램 개발자, 기획자들에게 조금의 도움이라도 되시라

    https://github.com/black7375/BlaCk-Void-Zsh

    공개 SW 대회에 나갔던 제 오픈소스 프로젝트의 설계 및 기획문서를 깃허브 스타 100개, 신년 주말을 맞아 공개하려 합니다.

    0. PDF 문서

    깔끔하니 보기 좋은 PDF 문서입니다.

    당시 급하게 만든거라 오타나 미흡한 점들이 많습니다.

     

    한컴 PDF

    원본 PDF에서 개인정보나 표지는 뺀 버전입니다.

    목차가 생성되어있어 보기 좋지만, 일부 이미지가 압축과정에서 깨져보입니다.

    2019 공개SW개발자대회 결과보고서_TerminalUX(윤민석)-이미지깨짐_첫장제외.pdf
    6.87MB

     

    가상 프린터

    이미지가 깨진 것이 보완된 버전입니다.

    단 목차가 없고, 용량이 커서 분할압축되어 있어요.

    2019 공개SW개발자대회 결과보고서_TerminalUX(윤민석)-목차링크비작동_첫장제외.z01
    10.00MB
    2019 공개SW개발자대회 결과보고서_TerminalUX(윤민석)-목차링크비작동_첫장제외.z02
    10.00MB
    2019 공개SW개발자대회 결과보고서_TerminalUX(윤민석)-목차링크비작동_첫장제외.zip
    4.27MB

    웹 버전의 경우 일부 내용은 URL로 대체되고, 이미지나 오타가 바뀌었습니다.

     

    1. 개발배경 및 목적

    • 출품작명: BlaCk Void Zsh

    • 프로그램 등록 URL: https://github.com/black7375/BlaCk-Void-Zsh

    • 출품작 소개(요약): 명령어 인터페이스(CLI)를 위한 UI/UX를 정립하고, 설치, 사용 및 커스텀이 쉽게 만들어진 Zsh 스타터 킷.

     

     많은 개발자들은 다양한 이유터미널을 사용하게 됩니다.

     차지하는 리소스가 GUI에 비하면 적으며 반복적인 일을 해야 하는 작업에서 특유의 효율성을 발휘하기 때문에 애용하는 사람들이 있지만 어쩔 수 없는 이유로 사용하는 사람들 또한 존재합니다. 윈도우, 맥, 리눅스 등 다양한 개발환경에 맞추다 보면 가장 공통으로 적용할 수 해결책이 명령어이기 때문입니다. 특히 리눅스의 경우 제가 알고 있는 데스크톱 환경만 10가지(Unity, KDE, Gnome, XFCE, LXDE, Cinammon, Mate, Budgie, Enlightenment, Pantheon 등)가 넘으며, 서버에서는 리소스 관리나 보안상 데스크톱 환경을 사용하지 않는 경향이 짙으므로 설정에 들어가서 ‘~~메뉴’를 찾아보라는 말은 통용되기가 어렵습니다. 따라서 각종 문제를 해결하기 위해 검색하면 터미널 명령어가 많이 나오며 반강제적으로 사용하게 됩니다.

     

     그럼 현재 CUI의 환경은 어떨지 GUI와 비교해보도록 하겠습니다.

    GUI의 변화를 나타낸 하단 표와 스크린 캡처들처럼 많은 변화가 있었습니다.

      2000년대 2019년
    도구 모음 툴바 리본
    메뉴 펼치기 드롭다운 메가 드롭다운
    콘텐츠 표시 리스트 카드뷰
    디자인 트렌드 스큐어모피즘 플랫

    툴바와 리본

     

    드롭다운과 메가드롭다운

     

    리스트와 카드뷰

     

    스큐어모피즘의 대표인 IOS6와 플랫의 대표인 IOS7

     

    하지만 CUI의 경우, 1970년대의 CP/M이나 2019년의 Powershell, Bash를 비교해보면 크게 다르지 않습니다.

     

    dir를 실행한 1970년대의 CP/M과 2019년의 Powershell

     

     저는 리눅스를 주로 사용하는데 빈번한 사용에 비해 너무나 불편하고 정적인 터미널 환경이 불만이었습니다. 따라서 색, 아이콘, 동적 기능 등 그래픽 요소를 도입하고 강력한 추천자동 완성 등으로 편리했으면 하는 생각이 들었습니다.

     

     물론, 이러한 시도가 없지 않았습니다. 대표적인 것이 21세기의 터미널 에뮬레이터라 주장하는 Upterm(Black Screen)입니다. 자동 완성, 상태 표시줄, 에러표시 등 편리한 기능을 제공했지만, 현재 메인테이너가 없어지고, 터미널 에뮬레이터에 강제로 구현했기에 기존 Shell 환경과의 호환성, 커스텀이 떨어졌습니다.

     

    Upterm에서 자동 완성과 상태 표시줄을 보여주는 사진

     

     그 후 찾게 된 것이 바로 Zsh인데, 제가 원하는 요소 대부분이 있었습니다.

    특히 Shell의 오른쪽에 정보를 표시할 수 있는 RPROMPT와 바로 선택이 가능한 자동 완성, 다양한 플러그인 생태계(Oh-My-Zsh, Prezto 등)가 매력적이었습니다.

     

    RPROMPT가 없고, 자동완성 키를 누를시 리스트만 보여주는 것이 끝인 Bash와 RPROMPT를 지원하며 바로 선택이 가능한 Zsh

     

     하지만 대부분의 OS에서 조금이라도 꾸밈, 설정을 제공하는 Bash(위 스크린 캡처는 Manjaro의 기본 설정 상태인 Bash, Zsh)와 달리 황량한 모습입니다. 즉, 기본 구성 자체가 다른 shell과 다를 바 없거나 오히려 나쁜 모습으로 매력이 없었습니다.

    다행히 Oh-My-Zsh, Prezto와 같은 프레임워크는 좋은 기본 테마를 제공해주고 플러그인들은 많았지만, 편리하기 사용하기 위해서는 사용자의 설정을 강요했습니다.

     

    Oh-My-Zsh의 기본 테마인 robbyrussell

     

     Emacs의 기본 구성은 단출하지만 좋은 설계와 UI/UX 설정으로 입문을 돕는 Spacemacs, Doom Emacs와는 같은 Unix 기반 툴이었지만 대조적이었습니다.

     

    Gnu Emacs와 Spacemacs 공식 이미지

     

     실제로 좋은 Zsh관련 List를 만들어 놓은 Awesome Zsh Plugins의 Tutorial을 보면 대부분 설정을 하는 방법에 대한 것이고, 스타터 킷이라 불릴만한 설정은 부족합니다.

     애플이 없던 스마트폰을 만든 것이 아니라 기존에 존재하던 것들을 잘 조합하여 아이폰을 만들었고 기능을 넣을 때도 똑같은 태도를 보였지만 엄청난 인기를 유지하는 것처럼, 기능을 최초로 만들거나 시도하지 않더라도 엔드유저를 위한 완성된 경험을 제공하는 것은 매우 중요합니다.

     CLI는 기본적으로 유닉스의 영역이기 때문에, 유닉스의 철학을 살려 외부의 모듈을 잘 활용해 가볍고, 텍스트 파일을 이용한 설정을 제공하고자 합니다.

    2. 개발환경 및 개발언어

     리눅스가 깔린 노트북 2대(쿠분투, 만자로)에서 Emacs를 이용하여 작업하였습니다.언어는 Zsh Shell Script입니다.

    테스트용으로 High Sierra가 깔린 맥을 사용했습니다.

    Emacs에서 개발하는 모습

     

    3. 시스템 구성 및 아키텍처

    - 설정 파일 로딩 순서

     설정 파일 로딩 순서Zsh가 파일을 읽는 순서에 의존합니다.

    파일을 읽는 순서에 따라 Path 설정 후 사용 가능한 명령어를 결정하고, 성능과 밀접하기에 Zsh가 파일을 로드하는 순서를 아는 것은 중요합니다.

     

    Shell 들이 파일을 로드하는 순서[Shell Startup Scripts]

     

    Zsh가 로드하는 파일들에 대한 설명용도입니다.

    • /etc/zshenv
      시스템에서 제공하는 환경변수들, 항상 로드
    • ~/.zshenv
      사용자가 사용하는 환경변수들, 항상 로드
    • ~/.zprofile
      메인 설정 파일인 .zshrc로드 직전에 로드, 로그인 시 로드 가능
    • ~/.zshrc
      메인 설정 파일이며 shell 모듈 로드 가능, 로그인 및 대화형일 때 로드 가능
    • ~/.zlogin
      로그인 shell을 시작할 때 로드(X-Window를 로드 기능이 필요하면 여기에 설정), 로그인 시 로드
    • ~/.zlogout
      정리 및 재설정 용도, 로그아웃 시 로드

    제 프로젝트의 로드 구성과 역할입니다.

    로드 순서

     

    • BlaCk-Void.zshenv
      홈 디렉터리에 있을 법만 한 것들(Application, bin, .local/bin, ..etc)과 패키지 매니저인 cargo, linux brew, snap 등의 PATH를 확인하고 추가

    • BlaCk-Void.zshrc
      역시 메인 설정 파일

    • autoload/*
      각종 함수들이며 BlaCk-Void.zshrc를 부른 직후에 lazy 로드되도록 설정

    • ~/.ztheme or BlaCk-Void.ztheme
      커스텀 가능한 테마설정 파일, 일반 플러그인 로드 전에 로드

    • lib/*
      BlaCk-Void.zshrc의 마지막에 로드

    • completion/*
      lib/completion에서 fpath에 추가

    • BlaCk-Void.zlogin
      바이트 컴파일을 백그라운드로 진행하는 등 최적화 관련 설정

     

    • BlaCk-Void-Zsh.sh && install_font.sh
      설치 시 사용되는 파일

    • README.org && LICENSE
      깃허브 README와 라이센스 내용

    - ztheme 커스텀 구성

    ztheme의 구조

     

     테마는 Color Mode, Icon Mode, Theme Mode로 이루어져 있습니다.

    Color Definition과 Icon Definition은 즉시 실행되며, Apply to Theme는 Theme Definition이 실행될 때 실행됩니다.

    일종의 객체지향처럼 상속된다고 생각하면 됩니다.

    4. 프로젝트 주요기능

    CLI 경험을 향상 시키기 위해 유형을 나눴습니다.

    1. 테마와 커스텀: 현재 디렉토리와 시스템의 ‘상태’를 어떻게 보여주는가
    2. 쉬운 입력: 명령어를 어떻게 해야 ‘편하게’ 칠 수 있는가
    3. 유틸리티: 강력하고 다양한 ‘기능’의 유틸리티가 있는가

     

    가. 테마와 커스텀

     oh-my-zsh의 내장, 외장테마들을 탐색결과 테마는 크게 두 종류로 나눌 수 있었습니다.

    배경색이 있고 ‘>’표시로 세그먼트를 구분하는 파워라인과 우리가 보통 사용하는 일반 배경의 테마입니다.(이하 심플테마)

    파워라인 테마 예시

     

    기본으로 주어지는 파워라인 테마는 커스텀이 힘들었으므로, 충분한 커스텀 옵션을 제공하는 테마를 찾아다녔습니다. 약간의 시간을 쓴 후 찾은 Powerlevel9k란 테마 입니다.

     

    Powerlevel9k

     

     Powerlevel9k는 다양한 세그먼트를 지원할 뿐만 아니라 꾸미는 방법, 예시, 유저 세그먼트등의 문서화가 잘되어 커스텀하기 편합니다.

    1) 테마모드 소개

    기본 파워라인 테마입니다.

    기본 테마(Powerline)

     

     프롬프트를 목적에 따라 상하좌우로 분류하고, 대칭적으로 보이게 만들어 안정적으로 보이게 만들었습니다. 윗줄정보를 표시하고, 아랫줄명령어를 입력하는 공간입니다. 또한, 왼쪽사용자와 관련된 정보(계정, 루트 여부, SSH 사용 여부, 디렉토리 위치, 쓰기 권한, Git 등의 VCS 정보, 명령어 입력)를 표시하고, 오른쪽시스템과 관련된 정보(명령 결과, 백그라운드 작업, 작업)를 표시해 줍니다.

     

     윗줄의 파워라인은 강렬한 원색계열(파란색, 초록색, 빨간색, 노란색)과 Nerd Font의 아이콘으로 시인성이 좋게 디자인하였습니다. 아랫줄은 명령어를 입력해야 하므로 IDE에서 코딩할 때처럼 자동추천(→키로 완성), 문법강조 기능을 사용했습니다.

     

    두 번째 테마는 심플 테마 입니다.

    심플(Simple) 테마

     

    심플한 테마들 중 주목할 만한 것은 PureSpaceship이 있었습니다.

    Pure, Spaceship 테마

     

    저는 둘 중 완전히 미니멀한 Pure 테마에 매료되었습니다.

    다음은 Pure 테마가 보여주는 장점입니다.

    • 입력 화살표의 색이 명령 성공/실패 여부에 따라 바뀜
    • 쓰기 권한과 루트 권한을 자물쇠로 표시
    • SSH와 루트 유저일 때 사용자 정보 표시
    • 쓸모없는 아이콘들은 제거

     Pure 테마는 디자인상 추상화를 극대화했고, 모든 정보를 강조해 보여주자는 파워라인 테마와 대조적입니다. 두 테마를 선택할 수 있게 하면 사용자들이 원하는 경험선택할 수 있을거라 예상했고, Powerlevel9k 커스텀 기능으로 포팅한 것이 Simple 테마입니다.

     

     마지막은 파워라인과 심플테마를 1줄짜리로 만든 것들입니다.

    Powerline-Single, Simple-Single

     

     각각 Oh-My-Zsh 내장 테마인 AgnosterFishy의 영향을 받았으며 한 줄이기에 정보를 너무 많이 보여주면 명령어를 치는데 방해가 되므로, Simple 테마의 디자인 철학과 포팅했던 경험을 살렸습니다. 쓸데없는 정보들을 줄이고 오른쪽에 표시되도록 했습니다. 다만, Powerline-Single의 경우 RPROMPT의 색이 너무 강해(기본 테마에서는 Load의 녹색이 균형을 잡아줬었음), 명령어에 집중해야 할 사용자의 시선을 분산시키므로 추후 색을 조정할 예정입니다.

     

    2) 컬러모드 소개

     FlexFixed모드로 나뉘어집니다.

     Flex 모드는 터미널 컬러 스킴(예시)을 따라가는 유동적인 색감을 보여주고, Fixed는 제가 미리 설정해둔 색을 최대한 보여줄 수 있는 고정된 색 모드로 제가 애용하고 있는 KDE에 내장된 Breeze 스킴을 기준으로 만들어졌습니다.

     

    Breeze 스킴에서 보여주는 Flex와 Fixed 모드

     

    Linux 스킴에서 보여주는 Flex와 Fixed 모드.
    Fixed 모드의 색은 거의 일정하다는 것을 알 수 있다

     

    3) 아이콘모드 소개

     아이콘 모드는 NerdPowerline이 있습니다.

    이 둘은 앞서 테마에서 나왔었는데 Nerd 폰트는 유니코드 폰트의 개인영역에 Powerline, Powerline Extra Symbols, Font Awesome, Font Awesome Extension, Devicons, Weather Icons, Material Design 등등 3,693 개를 추가한 것입니다.

    Nerd Fonts 구성

     

     Powerline Symbol들은 코딩용 폰트에 기본적으로 내장되어 있는 경우가 많지만, Nerd Font에 들어가는 아이콘들은 따로 패치를 하거나 패치된 폰트를 사용해야 하므로 모드를 나누어야 합니다.

     

    Nerd와 Powerline 모드

     

    4) Auto모드 소개

     제가 사용하는 X-Window나 Mac GUI 터미널 에뮬레이터들에서는 제대로 동작하지만, Xterm 256색을 지원하지 않는 터미널을 사용하거나 SSH 환경에서 Nerd Font를 사용하도록 하는 것은 다른 사용자들에게 피해가 갈 수 있으므로(깨져 보임) 자동으로 표현해줘야 할 필요가 있습니다.

     

    - 테마

    기본값은 많은 정보를 보여줄 수 있는 Powerline이지만, Xterm 256 컬러를 지원하지 않으면 파워라인의 시인성이 급격히 떨어지므로, Simple 테마를 사용합니다.

     

    - 컬러

    기본값은 동일한 사용자 경험을 제공해주기 위해 Fixed이지만, Xterm 256 컬러가 없다Fixed 모드 자체를 쓸 수 없으므로, Flex 모드로 전환됩니다.

    머터리얼 스킴

     

    Flex 모드는 일부 스킴에서 내용이 잘 안 보이는 일도 있다.

     

    - 아이콘

    기본값은 이쁘고 많은 아이콘 들을 보여줄 수 있는 Nerd이지만, ssh나 root일 경우 폰트 설치문제Powerline 모드를 사용했습니다.

     

    5. 커스텀 하기

    - 커스텀 시작

    ztheme 파일을 홈으로 복사한 후 작업하면 되는 간단한 방식입니다.

    cp $BVZSH/BlaCk-Void.ztheme ~/.ztheme

     

    보통 유닉스 프로그램들이 ~/또는 ~/.config에 설정 파일을 복사하면 사용자 설정을 사용하는 것과 같습니다. Zsh가 ~/에서 .zshrc, .zshenv 등을 로드 하므로 저도 ~/에서 설정하도록 했습니다.

     

    - 커스텀 적용

    터미널을 다시 시작하거나, 새로운 세션을 시작하면 됩니다.

    사용하는 도중에 적용하는 것은 테마 캐싱 문제로 지원하지 않습니다.

     

    6. 유용한 문서와 명령어들

    - 기본

    각종 모드 전환상수들을 바꿔주기만 하면 됩니다.

    • 테마(BVZSH_THEME): auto, powerline, simple, powerline-single, simple-single
    • 컬러(BVZSH_COLOR): auto, flex, fixed
    • 아이콘(BVZSH_ICON): auto, nerd, powerline

     

    - 테마

     

    - 컬러

    • 아치위키의 Zsh 문서 중 Colors나 또 다른 Xterm Color 설명
    • 유용한 명령어 리스트
      • for code ({000..255}) print -P -- "$code: %F{$code}This is how your text would look like%f" : Xterm 256 Color를 보여준다.
      • getColorCode forground: 글씨에 색들이 적용된 것을 보여준다.
        getColorCode background: 배경에 색들이 적용된 것을 보여준다.
      • POWERLEVEL9K_{ELEMENT}_FOREGROUND=COLOR: 테마의 글씨에 색 적용
        POWERLEVEL9K_{ELEMENT}_BACKGROUND=COLOR: 테마의 배경에 색 적용

     

    - 아이콘

     

    7) VCS 변경 시 프롬프트

    마지막으로 Git 같은 VCS가 변경되었을 때 프롬프트의 변화를 보여주고자 합니다.

    원본상태

     

    아무 파일/디렉토리 추가 – 물음표가 생긴다

     

    파일 수정 – ‘o’표시와 함께 주황색으로 바뀐다

     

    스태이징 - ‘+’로 변경된다

     

    커밋 – 초록색으로 변하고 위쪽 화살표가 뜬다

     

    푸시 – 화살표가 사라진다

     

    나. 쉬운 입력

     IDE와 GUI 프로그램 등에서 적용할만한 다양한 방법을 통해 입력하는 방식을 편하게 만들고자 했습니다. 대표적인 예가 테마에서도 등장했던 자동추천문법강조 기능입니다.

    자동추천과 문법강조

     

    1) 자동 짝맞춤

     IDE를 사용할 때 가장 편한 기능 중 하나는 “”, ‘’, ``, {}, [], ()등 으로 쓰는 것들을 같이 입력해주는 것입니다.

    zsh-autopair

     

    2) 자동 수정

     명령어가 틀렸을 때 자동으로 제안해주며, 명령이 실패할 때 fuck을 입력하면 수정된 명령어를 제안해줍니다.

    Command Not Found, Thefuck

     

    3) 제안

     명령어를 치고 난 후 단축어를 알려줄 수 있고,

    Alias tip

     

     명령어를 치는 도중 <TAB>을 누르면 정보를 보여주는 completion 기능이 있습니다.

    아래의 예시 2가지를 보면 정말 많은 정보를 그룹별로 묶어 직관적으로 표시해줍니다.

    Git 관련 자동완성

     

     원래 있던 자동완성보다 편의성이 훨씬 올라간 것을 볼 수 있습니다.

    원래의 자동완성 기능

     

    4) 히스토리 검색

     전에 쳤던 명령어로 이동하는 키는 bash, zsh 모두 위쪽 화살표(↑)입니다. 치고 있던 명령어를 기반으로 결과를 얻고 싶다면, 그저 치던 도중 위쪽 화살표(↑)를 누르면 됩니다.

    zsh-history-substring-search

     

    5) Fzf와 통합

     터미널용 증분 검색기인 Fzf와 통합되었습니다.

    Fzf가 도대체 무엇이냐면, 아래 스크린 캡처처럼 동적인 필터로 검색기능을 제공합니다.

    Fzf

     

     색은 테마, 자동완성과 일관성을 갖추기 위해 빨간색과 노란색으로 이루어져 있습니다. 이미 선택된 오브젝트는 강조를 줄이기 위해 일반 텍스트 색과 동일하게 만들었습니다.

     

     Fzf를 이용할만한 작업들은 무엇이 있을까요?

    리스트로 찾아야 하는 cd, cp, kill, history 등 수많은 작업들을 빠르게 할 수 있습니다.

     

    심지어 커밋 내역을 GUI처럼 보면서 작업하는 것도 가능해집니다.

    forgit

     

    터미널을 마법의 공간으로 만드는 공신이라 할 수 있습니다.

     

     그럼 모든 곳에 Fzf를 적용시키는 것이 좋을까요?

    그렇지는 않습니다. Fzf가 우리에게 보여주는 정보는 선형적입니다. 따라서 평소에는 여러 가지 그룹으로 나누어 보여줄 수 있는 자동완성을 사용하고, 정보들의 차이가 없거나 양들이 많을 때 사용하는 것이 좋다고 생각합니다.

     

    6) 기타

    - 편리한 Git

    사용아주 간단하게 git을 사용할 수 있습니다.

    • c: commit
    • a: add
    • p: push
    • u: pull(update)
    • r: remote
    • s: status

     

    - 디렉토리 이동

    디렉토리 이동 관련 기능

    • bookmark [mark]: [mark]북마크로 저장한다.
    • jump [mark]: [mark]된 곳으로 이동한다.
    • showmarks [mark]: [mark]된 디렉토리들을 보여준다.
    • deletemark [mark]: [mark]지운다.
    • cd <dots> : <dots>의 개수만큼 상위 디렉토리로 이동한다.
    • j [keyword]: [keyword]와 비슷한 디렉토리로 이동한다.

     

    다. 유틸리티

     유틸리티에서는 터미널에서 사용할 수 있는 기타 유용한 도구들을 다룹니다.

     

    - h

    hhighlighter

    여러 가지 문자를 강조해줍니다.

     

    - 인터넷 유틸리티

    prettyping, ip-info

     

    그래픽이 포함된 ip에 대한 정보를 알려주는 유틸 입니다.

     

    urltools + urlshort

    URL의 인코딩, 디코딩, 축약을 할 수 있습니다.

     

    - 이미지 뷰어

    w3m이라는 터미널용 브라우저에서 이미지를 출력해주는 것을 보고 만들었습니다.

    w3m 구동화면

     

    w3m-img란 라이브러리의 wrapper라 생각하면 됩니다.

    구동화면

     

    명령어: img 파일이름 보여줄시간(옵션)

     

    다만 문제는 터미널 에뮬레이터들을 조금 가립니다.

    • 지원: Konsole, Xterm, Urxvt, Terminology, Yakuake, Terminal.app
    • 비지원: Terminator, Hyper, Tilix, gnome terminal, Guake, LXterminal, Putty, Alacritty

    지원하지 않는 터미널은 tiv 또는 fim를 사용하면 됩니다.

     

    - 날씨

    https://wttr.in/이라는 사이트에서 보여주는 내용을 터미널에서도 볼 수 있도록 하며, 자동으로 언어를 설정해주는 wrapper입니다.

     

     

    명령어: weather 또는 weather 지역 언어(옵션)

    기본 언어는 시스템의 설정입니다.

     

    - 지도

    한국을 보여주는 중

     

    명령어: map

     

    - BVZSH 시스템 유틸

    • zsh-help: 도움이 되는 메시지들을 출력
    • zsh-update: 설정, 플러그인을 업데이트 하고 파일을 정리
    • zsh-compile: BVZSH를 컴파일
    • font-update: nerdfont를 업데이트합니다.
    • history-clear: Zsh history 파일을 백업합니다.
    • histoty-restore: history 파일을 복원합니다.

     

    - 기타 내장 유틸

    • ex FILE_NAME: 파일 압축 해제(FILE_NAME)
    • numfiles [DIRECTORY]: 디렉토리에 존재하는 파일 개수 출력
    • repeat NUM COMMAND: NUM번만큼 명령어 반복
    • fzf utils
      • vg with line number -> vgl
      • tm -> ftm
      • install(homebrew cask) -> bcip
      • unstall(homebrew cask) -> bccp

     

    라. 설치

     매우 간단합니다.

    간단히 설치 가능해야 보급이 가능하기 때문에 스타터 킷이라면 반드시 갖춰야 한다고 생각합니다. bash만 있으면 되며, Debian기반(우분투, 데비안, 민트), RPM기반(페도라, CentOS, 레드햇), Pacman(아치, 만자로, 안테르고스), , FreeBSD기반을 지원합니다.

     

    - 설치법

    git clone [https://github.com/black7375/BlaCk-Void-Zsh.git](https://github.com/black7375/BlaCk-Void-Zsh.git) ~/.zsh
    bash ~/.zsh/BlaCk-Void-Zsh.sh

     

     단, 터미널 폰트는 Nerd Font로 설정하는 것을 추천(설치 중 1번 옵션은 hack nerd font)하며, 다시 시작하면 적용됩니다.

     

    메뉴얼 설치법은 다음 링크 참조.

    내장된 기능들이 많아서 의존성이 있는 편입니다.

    https://github.com/black7375/BlaCk-Void-Zsh#22-others

     

    마. 성능

     여러 가지 플러그인들을 많이 설치 하다보면 느려지게 되는데 웹페이지의 경우 잠깐의 시간이 페이지뷰에 미치는 영향을 생각하면 매우 중요한 요소입니다.

     

    1) 테마 변경

    우선 가장 커다란 병목현상을 일으켰던 테마Powerlevel10k로 바꿨습니다.

    Powerlevel10k는 Powerlevel9k와 100% 호환이 되면서도 성능을 잡았습니다.

     

    메인테이너인 romkatv는 기존에 떨어졌던 성능을 향상시키기 위해 정말로 다양한 노력을 했습니다.

    그 결과 엄청난 성능을 보여줍니다.

    Powerlevel10k 성능

     

    2) 플러그인 매니저 변경

     Antigen에서 Zplugin이라는 플러그인 매니저로 변경했습니다.

    zplugin은 프롬프트가 로딩 된 후, 비동기 로드가 가능한 유일한 플러그인 매니저며, 매니저 자신과 플러그인들을 바이트 컴파일 해주므로 매우 빠릅니다.

     

    로드가 되는 순서를 체계적으로 정해 체감 속도가 빠르도록 만들었습니다.

    • 일반로드: 무조건 빨리 보여야 하는 테마와 관련된 것
    • 0a: 사용자가 입력할 때 항상 보여주어야 하는 것
    • 0b: 사용자가 입력 시 사용빈도가 매우 높은
    • 0c: 사용자가 입력 시 사용빈도가 상당히 높은
    • 1a: 사용자가 명령 실행 시 사용빈도가 높은
    • 1b: 사용자가 입력 시 사용빈도가 높은
    • 1c: oh-my-zsh 로드
    • 2: 나머지

     

    3) 제가 시도한 것

    저도 자체적으로 성능 향상을 시도했습니다.

     

    • 함수들을 Autoload(Lazyload) 되게 하여 시작성능 향상
    • zsh-lazyenv로 nvm, rvm 같은 버전 관리 매니저가 시작할 때 필요한 코드를 Hook만 걸어 놓는 형태로 lazyload 되게 구성 및 eval 명령어는 캐싱되도록 함
    • Completion 요소들을 캐싱, 덤프 후 $fpath에 추가
    • Fzf 필터로 grep 대신 ripgrep 사용
    • Zsh 설정을 바이트코드 컴파일
    • 기타: 파이프라인으로 실행되는 외부 프로세스를 줄이고, 여러번 실행되어야 하는 명령어는 변수로 저장

     

    4) 기타

    Zsh Syntax Highlighting 대신 Fast Syntax Highlighting으로 빠른 문법강조를 하도록 했습니다.

     

    이렇게 성능향상을 위한 다양한 노력을 통해, 일반적으로 사용해도 무리가 없을만한 성능을 확보할 수 있었습니다.

     

    5. 기대효과 및 활용분야

    Zsh는 최신 SW를 권장하고 업데이트가 빠른 운영체제로 유명한 Arch Linux에서 인스톨러용 기본 Shell로 사용하고, 최근에는 MacOS가 기본 쉘로 변경되는 등 점점 보급되는 추세입니다. 따라서 점점 많은 사람이 Zsh를 사용하고, 관심을 두게 될 것입니다. 이때 훌륭한 스타터 킷을 제공할 수 있다면 훨씬 나은 생산성과 효율성으로 시간을 아낄 수 있을 것이라 기대합니다.

     

    6. 향후 계획

    기능과 성능으로 나뉘어져 있는데, 아래 링크를 참조해주세요.

    https://github.com/black7375/BlaCk-Void-Zsh/projects

     

    7. 프로젝트 관리와 오픈소스

    오픈소스 프로젝트인 만큼 프로젝트 관리와 오픈소스에 대한 내용을 넣었습니다.

    가. 프로젝트 관리

    1) 브랜치

    사용자 릴리즈용 master와 개발용 dev로 나누어 사용하고 있습니다.

     

    기타 브랜치 관리(Dev-Staging-Master)는 아래에서.

    https://black7375.tumblr.com/post/185730065470/

     

    나의 깃브랜치 관리 전략

    보통의 Git-Flow라 하면 를 떠올린다. 하지만 너무나 복잡한 것. 그래서 대칭적이면서 직관적이도록 약간의 수정을 가했다. 리브레 오피스로 그린거라 레이아웃은 안맞음.. 소규모의 경우 dev-master만 운영하고, 커밋 메세지에 "Add: Fix: Doc: Feature:”과 같은 식으로 일종의 태그를 달아서 관리한다. 굳이 복잡하게 할 필요는...

    black7375.tumblr.com

     

    2) 커밋

    또한, 커밋의 맨 앞에 분류할 수 있도록 머리말을 달아놓고 있습니다.

    • Add: 기능 추가
    • Fix: 버그, 옵션수정
    • Doc: 문서화, 리소스
    • Clean: 코드를 깔끔히 다듬었을 때
    • Feature: 커다란 기능을 만들어 변경사항이 클 때

     

    3) 글로벌 타겟

    제 깃허브의 커밋 내역, README, 위키를 보면 모두 영어로 구성되어 있습니다.

    그래서 깃허브의 스타내역을 보면 외국인의 비율이 상당함을 알 수 있습니다.

     

    나. 오픈소스 커뮤니티와 소통

    1) 빠른 이슈처리

    버그 제보나 질문이 들어오면 가능한 선에서 최대한 빠르게 처리하고 있습니다.

     

    메인테이너가 이슈를 어떻게 관리하느냐는 오픈소스 세계에서 굉장히 중요하다고 생각합니다.

     

    2) 공헌

    제가 마음에 들었던 프로젝트들에 이슈 리포트를 보내거나, 아이디어 제공, 문서 편집 등으로 공헌 했습니다.

    이건 너무 소소한 것들이라 부끄러워서 링크를 안달...


    무튼 도움이 되는 분들이 있었으면 좋겠습니다.

     

    참고: 2003 Microsoft Word Track Changes Instructions

    댓글

Designed by black7375.