터미널에서 파일 경로 지정을 peco를 사용하여 빠릅니다.

6767 단어 ZshPeco
이전에 peco를 사용하여 단말기 조작을 폭속화 에서 소개한 Ctrl + F 에서의 파일 검색을 좀 더 사용하기 쉽게 해 보았습니다.

Git 리포지토리 검색이나 커멘드 이력 검색은 매우 쾌적했습니다만, 파일 검색이 조금 사용하기 어려웠기 때문에 개량해 보았습니다.

도전


  • 홈 디렉토리에서 검색하면 너무 많은 대상이 있고 필터링이 어렵습니다.
  • 검색하고 찾은 파일과 그 주변의 파일을 편집하고 싶습니다. 그 근처의 디렉토리로 이동하고 싶습니다.

    개량 후



    (아무것도 입력하지 않고) <Ctrl + F>



    파일을 선택한 경우


    디렉토리를 선택한 경우


    터미널에 아무 것도 입력하지 않은 상태에서 호출하면 현재 디렉토리 아래의 파일이 후보로 열거됩니다.

    선택 후 파일 유형에 따라 동작이 변경됩니다.
  • 파일 선택
  • → vim에서 열기

  • 디렉토리 선택
  • → cd로 이동


  • command <Ctrl+F>





    커멘드등을 입력해, 스페이스를 입력한 후, 호출했을 경우도, 현재 디렉토리 이하의 파일이 후보로서 열거됩니다.

    선택 후 입력 도중이었던 터미널 끝에 파일 경로가 입력됩니다.

    command /path/to/base/<Ctrl+F>





    파일 경로의 입력 도중에 호출했을 경우는, 그 패스 이하의 파일이 후보로서 열거됩니다. (이것이 하고 싶었다)

    선택 후 입력 도중이었던 터미널 끝에 파일 경로가 입력됩니다.

    덧붙여 입력중의 패스가 실재하지 않는 경우는, 현재 디렉토리 이하가 후보가 됩니다.

    .zshrc



    .zshrc 중에 다음 함수를 정의하면 사용할 수 있습니다.
    export EDITOR=vi
    function peco-find () {
        local base="."
        if [ -n "$LBUFFER" ] && [ ! "$LBUFFER" =~ " $" ]; then
            local last_path="$(echo $LBUFFER | sed -e 's/^.*\ //g')"
            if [ -d "$last_path" ]; then
                base="$last_path"
            fi
        fi
        local filepath="$(find $base | grep -v '/\.' | peco --prompt 'PATH>')"
        [ -z "$filepath" ] && return
        if [ -n "$LBUFFER" ]; then
            if [ "$base" = "." ]; then
                BUFFER="$LBUFFER$filepath"
            else
                BUFFER="$(echo $LBUFFER | sed -e "s#${base}\$##g")$filepath"
            fi
        else
            if [ -d "$filepath" ]; then
                BUFFER="cd $filepath"
            elif [ -f "$filepath" ]; then
                BUFFER="$EDITOR $filepath"
            fi
            zle accept-line
        fi
        CURSOR=$#BUFFER
    }
    zle -N peco-find
    bindkey '^F' peco-find
    

    운영 환경



    다음 환경에서 확인했습니다.
  • Linux Mint 18.3
  • peco v0.4.5
  • zsh 5.1.1 (x86_64-ubuntu-linux-gnu)
  • 좋은 웹페이지 즐겨찾기