【zsh】global alias를 전개하는 함수를 만든다(만들었다)

6599 단어 aliasZsh
길어졌다. 변수 전개로 잘 쓸 수 없을까 → 쓸 수 있었다 라고 기사

친애하는



zsh의 global alias에 대해 가볍게 설명하면
일반 alias와 달리 명령 이외의 위치에서도 배포되는 alias입니다.
대체로 파이프와 함께 정의되는 경우가 많습니다.
alias 이름에는 특별히 명확하지 않지만 global alias 이름은 대문자로 정의하는 것이 일반적입니다.

alias -g G='| grep'
alias -g H='| head'
alias -g L='| less'

이렇게 정의하면 명령이 실행될 때 확장됩니다.
$ cat log H -n2 
# => cat log | head -n2 

그대로 사용해도 편리합니다만, 커멘드 라인 조작중에 자동으로 전개하면 개인적으로 스마트군요. 이력에도 전개 후의 커맨드로서 남기 때문에

alias 전개 함수는 언젠가의 기사에서 소개되고 있습니다만
  • 배포 바인딩 키는 스페이스
  • global alias 만 배포
  • 미리 정의 된 alias와 비교하여 배포

  • 같은 것이 개인적으로 원했기 때문에 공부를 하고 만든

    만든





    그런 함수가 여기

    expand-alias-widget
    #!/usr/bin/env zsh
    
    function main() {
      emulate -L zsh
      setopt aliases
      local -a global_aliases=(${(@f)"$(alias -g)"})
      local -a characters=(${global_aliases%%\=*})
      if (($characters[(I)${(q)LBUFFER##* }])); then
         zle _expand_alias
         zle expand-word
      fi  
      zle self-insert
    }
    
    main
    

    취미 기법이므로 함수로 둘러싸지 않아도 좋고, shebang도 필요하지 않을지도 모릅니다.
    여기를 fpath가 통과 한 디렉토리에 두고 bindkey를 할당하면 사용할 수 있습니다.

    .zshrc
    autoload -Uz expand-alias-widget
    zle -N expand-alias-widget
    bindkey ' ' expand-alias-widget
    

    해설



    shellscript 내에서도 alias를 사용할 수 있도록



    데포라면 사용할 수 없습니다. 그래서 옵션을 지정해 준다
    함수 내에서 옵션을 만질 때는 local_options 또는 emulate -L zsh합시다.
    
    setopt aliases
    

    미리 정의된 전역 별칭 ​​목록 정렬


    alias -g에 정의 된 전역 별칭을 출력 할 수 있습니다.
    출력은 개행이므로 f 플래그로 개행 문자 단락으로 단어 전개@ 플래그로 개별 요소를 별도의 요소로 확장 (필요하지 않을 수 있음)
    local -a global_aliases=(${(@f)"$(alias -g)"})
    

    배열에서 alias 이름만 검색


    L='| less'에서 L를 추출합니다. ${*name*%%*pattern*} 기법
    서두의 예라고 이 시점에서 characters의 내용은 (G H L) 이런 느낌이 된다
    local -a characters=(${global_aliases%%\=*})
    

    커서 왼쪽 문자열이 alias 이름 배열에 포함되어 있는지 확인


    if (( ${array[(I)pattern]} ))에서 배열에 특정 요소가 포함되어 있는지 확인할 수 있습니다.
    if (($characters[(I)${(q)LBUFFER##* }]))
    
    ${(q)LBUFFER##* } 커서 왼쪽에 공백으로 구분 된 끝 문자를 가져옵니다.(q)${LBUFFER##* }에는 * 또는 ?가 전개될 수도 있으므로
    패턴 매치로 조건식이 의도하지 않고 참이 되어 버립니다.
    그래서 q 플래그로 메타 문자를 백 슬래시로 인용하여 방지합니다.

    zle의 내장 위젯



    alias를 배포하기만 하면 기존에 widget이 준비되어 있다
    그것 _expand_alias expand-word는 셸 배포 (명령 배포 또는 글로브 배포)

    요약



    그래? 「변수 전개라든지 플래그가 너무 많아 모르겠어~ 」라고?
    정리했다
    h tps://의st.魏 튜 b. 작은 m/쇼 t/d9cdf8271b3에 7C4238739 그림 523490542

    좋은 웹페이지 즐겨찾기