Zsh의 ls 키 바인딩과 같은 피쉬

Zsh의 ls 키 바인딩과 같은 피쉬

Fish 셸에서는 를 누르면 Alt+l명령의 출력이 멋지게 표시됩니다 ls. 누르기 전에 작성한 명령이 유지됩니다. zsh에 넣고 싶습니다.

나의 매우 이상한 시도는 다음과 같습니다.

function myls {
    awk '{len = length($0); for(i=0;i<len;i++) printf "\b"}' <<< "$LBUFFER"
    zle push-input
    zle accept-line
    print $(ls --color=always --indicator-style=slash)
}
zle -N myls
bindkey -- '^[l' myls

나는 기존 명령을 지우는 데 어려움을 겪었고 결국 hacky \b를 사용하게 되었습니다. 길고 여러 줄에서는 제대로 작동하지 않습니다.

누구든지 더 잘할 수 있나요?

답변1

zle -Rpush-input버퍼 없이 줄을 다시 표시하려면 나중에 사용하세요 .

대부분의 경우 zsh의 완성 목록에는 ls를 실행하는 데 위젯이 필요하지 않습니다. ls 스타일 색상과 파일 유형 접미사가 있습니다. 모든 컨텍스트에서 파일 완성을 수행하고 긴 ls -l스타일 목록을 수행하는 다음 바인딩이 있습니다 .

zstyle ":completion:file-complete::::" completer _files
zle -C file-complete complete-word _generic
zstyle ':completion:file-complete:*' file-list true
bindkey '^X^F' file-complete

답변2

@okapi님의 의견 덕분에 이런 생각이 들었습니다.

function myls {
    [[ "$CONTEXT" = cont ]] && return
    zle push-input
    zle -R
    zle accept-line
    print -n $(ls --color=always --indicator-style=slash)
}

zle -N myls
bindkey -- '^[l' myls

훨씬 낫지만 "for>..." 및 "while>..." 루프와 같은 연속에서는 작동하지 않으므로 지금은 반환합니다.

관련 정보