[fish] awk의 스크립트 부분을 히스토리에서 보완

4894 단어 awkfish

소개


awk 의 사용법이 우울한 기억으로, 그렇다면 어떻게 할까? 다시 검색하는 것이 많았기 때문에 어떻게든하고 싶다.
peco 그리고 과거의 awk 이력을 찾는 것도 있지만, fish 그래서 보완으로 해결할 수 있으면 좋지 않을까? 라고 생각하고 보완 써 보았습니다.



완성 설정



보완 설정은 다음과 같이 했다.

~/.config/fish/completions/awk.fish
function __complete_awk_is_quoted # 入力中の語は ' か?
    test (commandline -tc) = \'
end

function __complete_awk_quoted_expr # awk '...' を履歴から探して ... の部分を返す
    builtin history \
    | string match -r "awk +'(?:\\'|[^'])+'" \
    | awk '{$1=""; print $0}' \
    | string trim \
    | string trim -c\'
end

complete -xc awk -n __complete_awk_is_quoted -a '(__complete_awk_quoted_expr)'  

# デフォルトの補完メッセージが長々しいので上書き
complete -c  awk -s f -d 'awk program file'
complete -xc awk -s F -d 'input field separator'
complete -xc awk -s v -d 'var=value'

마지막 4행은 본제와 관계 없기 때문에 기호로.
이것을 정의한 상태에서 awk '를 입력하고 Tab를 누르면 과거에 사용한 awk 스크립트가 보완됩니다.

기타



Q. '의 입력은 필수?



필수적입니다.
사실은 awk 까지 치고 Tab 를 누르면 보완할 수 있도록 하고 싶었습니다만, 보완 후보로 예를 들어 '{print $0}' 를 설정하면 ' 이 이스케이프 되어 \'{print\ \$0}\'awk ' 까지 쳐 둘 필요가 있습니다.

Q. peco 같은 좁히고 싶지만


fish 그러면, Tab 대신에 Shift + Tab 로 보완 모드에 들어가면 부분 일치 검색할 수 있습니다.



결론


awk 의 부분을 sed 로 하면 sed 도 마찬가지로 보완할 수 있을 것 같습니다. 다만, 이번의 보완 함수에서는 더블 쿼테이션으로 건네진 인수는 주워지지 않기 때문에 개량이 필요할지도.
grep 의 검색 조건도 보완할 수 있을 것 같습니다만 grep 는 옵션도 지정되어 있는 것이 많기 때문에, 히스토리로부터 커멘드를 추출하는 부분에도 개량이 필요하네요...

추가 (2017/08/18)


awk '{print와 같이, 도중까지 커맨드를 친 상태에서도 보완이 효과가 있게 했습니다. string 커맨드 대활약.
function __complete_awk_is_quoted # 文字列の入力中か?
    string match -- "'*" (commandline -tc)
end

function __complete_awk_quoted_expr # awk '...' を履歴から探して入力中の語を含む ... を返す
    set -l input (string sub -s 2 (commandline -tc))

    builtin history \
    | string match -r "(?<=awk ) *'(?:\\'|[^'])+'" \
    | string trim \
    | string trim -c\' \
    | string match "*$input*"
end

complete -xc awk -n __complete_awk_is_quoted -a '(__complete_awk_quoted_expr)'  

좋은 웹페이지 즐겨찾기