peco를 사용하여 단말기 조작을 폭속화

peco/peco 은 대화형 필터링 도구입니다.

이 툴에 의해, 터미널에서의 조작을 몇 배나 고속화할 수 있다고 해도 과언이 아닙니다(과언).

본 기사에서는 제가 설정하고 있는 3종의 peco의 사용법과 그 설정 방법을 소개합니다.

환경



다음 환경에서 사용하고 있습니다.
  • Linux Mint 18.2
  • zsh 5.1.1 (x86_64-ubuntu-linux-gnu)


  • 설치



    go get을 사용한 설치는 권장되지 않으므로 github releases 페이지에서 가져와 경로를 통과합니다.

    history with peco



    zsh 및 bash에는 Ctrl + R에서 명령 기록 검색 기능이 있습니다.
    하지만 한 줄밖에 표시되지 않기 때문에 비슷한 명령이 많은 히스토리에 있다면 좀처럼 찾는 명령을 검색하는 것은 어렵습니다.

    peco에 의한 명령 이력 검색은 다음과 같습니다.



    1문자 입력할 때마다 인터랙티브하게 좁혀줍니다.

    설정에 관해서입니다만, 우선은 history 주위의 설정은 다음과 같이 되어 있습니다.
    꽤 많은 기록을 저장합니다.

    .zshrc
    # history
    HISTFILE=$HOME/.zsh-history
    HISTSIZE=100000
    SAVEHIST=1000000
    
    # share .zshhistory
    setopt inc_append_history
    setopt share_history
    


    이어서 peco 설정입니다.
    함수를 설정하고 Ctrl + R 에 이 함수 호출을 할당하는 설정이 되어 있습니다.

    .zshrc
    function peco-history-selection() {
        BUFFER=`history -n 1 | tac  | awk '!a[$0]++' | peco`
        CURSOR=$#BUFFER
        zle reset-prompt
    }
    
    zle -N peco-history-selection
    bindkey '^R' peco-history-selection
    


    cdr with peco



    과거에 실행한 명령에 대해서는 위의 history+peco로 빠르게 검색할 수 있습니다.
    하지만 디렉토리 이동은 어떻습니까?
    $ cd work
    $ cd hoge
    $ cd ../fuga
    

    위와 같이 상대 경로로 이동하는 것이 대부분이라고 생각합니다.
    이것은 커멘드 이력 검색으로 히트 했다고 해도 , 현재 디렉토리가 다른 경우에서는 무의미합니다.

    그래서 사용하는 것이 cdr입니다. ( zsh 4.3.11 이상에서 사용할 수 있습니다)
    cdr은 디렉토리 이동의 히스토리 검색 기능입니다.

    peco와 조합했을 경우의 거동은 다음과 같습니다.



    우선 cdr 자체의 설정입니다.

    .zshrc
    # cdr
    if [[ -n $(echo ${^fpath}/chpwd_recent_dirs(N)) && -n $(echo ${^fpath}/cdr(N)) ]]; then
        autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
        add-zsh-hook chpwd chpwd_recent_dirs
        zstyle ':completion:*' recent-dirs-insert both
        zstyle ':chpwd:*' recent-dirs-default true
        zstyle ':chpwd:*' recent-dirs-max 1000
        zstyle ':chpwd:*' recent-dirs-file "$HOME/.cache/chpwd-recent-dirs"
    fi
    

    다음 peco 설정입니다.
    여기도 history의 경우와 마찬가지로 함수를 준비하고 있습니다.
    바로 가기가 Ctrl + E 에 지정되었습니다.

    .zshrc
    function peco-cdr () {
        local selected_dir="$(cdr -l | sed 's/^[0-9]\+ \+//' | peco --prompt="cdr >" --query "$LBUFFER")"
        if [ -n "$selected_dir" ]; then
            BUFFER="cd ${selected_dir}"
            zle accept-line
        fi
    }
    zle -N peco-cdr
    bindkey '^E' peco-cdr
    

    ghq with peco



    다양한 git 저장소를 관리하고 있다면 cdr만으로는 디렉토리 검색이 번거로워집니다.
    그래서 리포지토리 관리 명령의 ghq과 결합합니다.

    ghq는 ghq get reireias/dotfiles 와 같은 명령으로 리포지토리의 clone이 가능합니다.
    clone 된 리포지토리는, .gitconfig 등으로 설정한 root 디렉토리 이하에 clone 됩니다.

    관리 중인 리포지토리 목록 가져오기 ghq list 명령과 peco를 결합하면 다음과 같습니다.
    git 리포지토리 만 추출 대상이되므로 cdr보다 빠르게 리포지토리로 이동할 수 있습니다.



    peco 설정은 다음과 같습니다.
    바로 가기는 Ctrl + G를 지정합니다.

    .zshrc
    function peco-ghq-look () {
        local ghq_roots="$(git config --path --get-all ghq.root)"
        local selected_dir=$(ghq list --full-path | \
            xargs -I{} ls -dl --time-style=+%s {}/.git | sed 's/.*\([0-9]\{10\}\)/\1/' | sort -nr | \
            sed "s,.*\(${ghq_roots/$'\n'/\|}\)/,," | \
            sed 's/\/.git//' | \
            peco --prompt="cd-ghq >" --query "$LBUFFER")
        if [ -n "$selected_dir" ]; then
            BUFFER="cd $(ghq list --full-path | grep --color=never -E "/$selected_dir$")"
            zle accept-line
        fi
    }
    
    zle -N peco-ghq-look
    bindkey '^G' peco-ghq-look
    



    이것으로 터미널에서의 작업이 폭속이 될 것! ! !

    좋은 웹페이지 즐겨찾기