Hacker News 의견들
  • 내가 인생이 바뀌었다고 느낀 건 위쪽 화살표 키를 리맵핑한 순간이었음
    이제는 모든 명령어를 순회하지 않고, 이미 입력한 문자로 시작하는 명령어만 탐색함
    예를 들어 tar - 입력 후 위쪽 화살표를 누르면 이전에 사용한 tar 옵션이 바로 나옴
    zsh에서는 다음처럼 설정함

    bindkey "^[OA" up-line-or-beginning-search # Up  
    bindkey "^[OB" down-line-or-beginning-search # Down
    
    • CTRL+r을 쓰기 시작하면 위쪽 화살표를 다시는 안 쓰게 됨
    • 완전한 게임 체인저라고 생각함. bash에서도 비슷하게 하려면 .inputrc에 다음을 추가함
      "\e[A":history-search-backward  
      "\e[B":history-search-forward
      
    • fish shell에서는 이게 기본 동작임. 입력한 단어를 기준으로 위/아래 화살표로 명령어를 탐색하고, alt+위/아래로 인자만 탐색할 수도 있음
    • .inputrc에서도 동일하게 구현 가능함
    • 나는 위/아래 화살표는 그대로 두고, 대신 ctrl+p와 ctrl+n을 이 방식으로 설정함
  • 터미널에서 vim-mode를 켜면 훨씬 편안해짐
    세 단어 전에서 실수했을 때? 3bcw면 끝임
    전체 삭제는 cc, 복잡한 수정은 v로 (neo)vim에서 바로 열 수 있음
    이미 (neo)vim을 쓰고 있다면 새로운 단축키를 외울 필요가 없어서 최고임

    • 예전 Emacs 매뉴얼의 한 구절이 떠오름. 복잡한 명령 대신 마우스 설정을 추천하고 싶음
    • 20년 넘게 (n)vim을 써왔지만 shell의 vi-mode는 싫음. 복잡한 명령이 필요할 땐 ctrl-x+e로 neovim에서 열어 쓰는 게 좋은 절충안
    • 나도 vim을 자주 쓰지만 shell에서는 안 씀. 대신 Emacs 스타일 단축키(ctrl-a, ctrl-e 등)를 macOS 전역에서 사용함. vim이 insert 모드에서 emacs 바인딩을 지원했으면 좋겠다고 생각함
    • “readline vi-mode”라는 기능 이름을 처음 알게 됨. 더 찾아봐야겠음
    • 왜 emacs 모드가 기본인지 이해가 안 됨. 새 shell을 열면 제일 먼저 set -o vi를 입력함
  • 어떤 사람이 \#라는 스크립트를 PATH에 넣어서 파이프라인 일부를 주석 처리할 수 있게 했다는 게 인상 깊었음

    #!/bin/sh
    cat
    
    • 나도 비슷한 트릭을 씀. ~/bin/noglob 파일에
      #!/bin/sh
      $*
      
      이렇게 해서 bash에서 zsh 스크립트를 호출할 때 noglob 충돌을 피함
    • 나는 괄호 주석을 씀. 스크립트 문서화에는 좋지만 인터랙티브 쉘에서는 번거로움. 그래도 창의적인 주석 방식이라 재미있음
    • mycmd1 #| mycmd2와 비교했을 때 어떤 장점이 있는지 궁금함
    • 이건 정말 유용해서 내 $PATH에 추가할 예정임
  • CTRL+W는 보통 이전 공백까지 삭제하므로 /var/log/nginx/ 전체를 지움
    Alt+Backspace는 비알파벳 문자 전까지 삭제함
    단, 브라우저 탭을 닫는 단축키와 겹치니 주의해야 함

    • Firefox v147부터 단축키 재정의 기능이 추가됨. 관련 링크
    • macOS에서는 GUI 단축키와 터미널 단축키가 구분되어 있어서 이런 문제 없음. ⌘C, ⌘W 등이 터미널에서도 동일하게 작동함
    • 내 환경(fish + Alacritty)에서는 반대로 동작함. 그래도 Ctrl-Shift-T로 닫힌 탭을 복구할 수 있어서 다행임
    • $WORDCHARS 설정에서 /를 제거하면 원하는 동작을 얻을 수 있음 (참고 링크)
    • Ctrl-Shift-T로 탭을 바로 복구할 수 있음
  • fzf shell integration으로 히스토리 검색을 업그레이드하길 추천함
    시연 영상 / 공식 문서

  • 자주 쓰는 트릭 하나 있음
    긴 명령을 입력하다가 다른 걸 먼저 해야 할 때, Ctrl-C로 취소하지 않고 주석 처리 후 실행해서 히스토리에 남김

    $ long_command  
    $ #long_command  
    $ stuff_1  
    $ stuff_2  
    $ #long_command  
    $ long_command
    
    • zsh에서는 "push-line-or-edit" 바인딩으로 가능하고, bash에서는 C-uC-y로 비슷하게 구현 가능함
    • 더 쉬운 방법은 ctrl-u로 현재 줄을 저장하고 비운 뒤, ctrl-y로 다시 붙이는 것임. zsh에서는 alt-q로 이 과정을 자동화할 수 있음
    • bash에서는 alt-shift-3으로 현재 명령 앞에 #을 붙이고 새 줄로 이동할 수 있음
  • LLM풍 제목은 별로지만, 몇몇 팁은 유용해서 시도해볼 예정임
    brace expansion이 탭 완성과 잘 안 맞는 게 아쉬움. 마지막 토큰 복제나 파일 확장자 삭제 같은 기능이 더 있었으면 좋겠음

    • 글의 문체 자체도 LLM 느낌이 남. 예를 들어 “The shell is a toolbox, not an obstacle course.” 같은 문장
    • PowerShell에도 readline 모드가 있어서 WSL과 병행할 때 전환 부담이 줄어듦
    • readline은 bash의 일부처럼 작동하므로, 이런 팁들을 shell 기능이라 불러도 무방하다고 생각함
  • zsh 설정에서 특정 명령을 히스토리에서 제외하는 함수를 씀
    예를 들어 --force 같은 위험한 명령이 히스토리에 남지 않게 함

    function zshaddhistory() {
      emulate -L zsh
      if ! [[ "$1" =~ "(^ |--force|whatever)" ]] ; then
        print -sr -- "${1%%$'\n'}"
        fc -p
      else
        return 1
      fi
    }
    
    • 나도 비슷하게, 기록하지 않을 명령에 공백을 앞에 붙이는 alias를 만들어둠
      unhist () { alias $1=" $1"; }
      unhist unhist
      unhist fzf
      unhist rghist
      
  • zsh에서 글로벌 alias 자동 확장을 구현한 스니펫을 씀
    예를 들어 alias -G G='rg -s'로 설정하면, command | G 입력 시 자동으로 command | rg -s로 확장됨
    space 입력 시 자동으로 확장되며, \alias로 입력하면 확장을 건너뜀

  • .bashrc에 만든 “deep cd” 함수가 있음
    인자로 받은 문자열을 포함하는 첫 번째 디렉터리로 자동 이동함

    dcd() {
      [ -z "$1" ] && return
      local dir
      dir=$(find . -type d -path "*$1*" -print -quit 2>/dev/null)
      [ -n "$dir" ] && cd "$dir"
    }
    

    처음엔 느릴 줄 알았는데 의외로 자주 쓰게 됨

    • autojump의 jc나 z, fzf 같은 스마트 cd 도구도 함께 살펴보면 좋음

위에 위쪽 화살표 키 리맵핑은 이맥스유저들은 c-r로 그냥 함. 튜닝의 끝은 순정.