빈 줄에 zsh 탭 완성


12

나는 찾을 수 없었던 tcsh'ism을 원합니다. 내용이없는 빈 줄에서 탭 키를 누르고 ls와 동등한 것을보고 싶습니다. 즉 내가 원하는 말

$ <tab>

다른 것을하고 나에게 \ t를주는 것. 명령 완료를위한 환상적인 리소스를 찾았지만이 기본 사례에는 해당되지 않습니다. 이것에 대한 도움이 될 것입니다! 감사.

답변:


8
# expand-or-complete-or-list-files
function expand-or-complete-or-list-files() {
    if [[ $#BUFFER == 0 ]]; then
        BUFFER="ls "
        CURSOR=3
        zle list-choices
        zle backward-kill-word
    else
        zle expand-or-complete
    fi
}
zle -N expand-or-complete-or-list-files
# bind to tab
bindkey '^I' expand-or-complete-or-list-files

매우 깔끔합니다. 어떻게 든 목록을 다시 숨길 수 있습니까? 탭하여 표시하면 탭에서 숨기기가 좋습니다.
Parker Coates 14

고마워 존, 당신의 솔루션을 발견하고 여기에 적용 stackoverflow.com/questions/28729851/…
lolesque

7

Tab행 시작 부분의 동작은 스타일에 의해 제어됩니다 . 그러나 지원되는 동작은 두 가지뿐입니다.insert-tab

  • 평소대로 완료 zstyle ':completion:*' insert-tab false
  • 아래에 탭을 삽입 zstyle ':completion:*' insert-tab true
  • 아래에서 하나 또는 다른 하나 zstyle ':completion:*' insert-tab pending[=N]

해당 위치에서 명령을 완료하려면 zstyle ':completion:*' insert-tab true수행하십시오. 현재 디렉토리에 파일을 나열하는 것과 같이 다른 것을 원하면을 수정해야합니다 _main_complete.

zsh-workers 목록최근 스레드에 대해 설명했습니다 insert-tab.


환상적입니다! _main_complete에서는 C 코드 어딘가를 참조하는 것처럼 보입니까? 멍청한 질문에 미안하지만 어디에서 찾을 수 있습니까?

1
@ user535759 : 아니요 _main_complete. 완료를 구현하는 zsh 코드의 일부입니다. 그것은에서의 Completion/Base/Core/_main_complete일반적으로 같은 위치에 설치 소스 트리에 /usr/share/zsh/functions/Completion/Base/_main_complete.
Gilles 'SO- 악마 그만해'

@llua 관련 스타일을 변경해도 -command-<Tab>은 현재 디렉토리의 파일을 나열하지 않습니다. 당신이 한 모든 것입니다 제한 을 생략 명령 이름에 일치. 그러나이 위치에 완료 될 것입니다 만 가지가 나열 그렇게하지 (단지 디렉토리와 실행 파일에 따라 현재 디렉토리에있는 파일입니다 autocdPATH).
Gilles 'SO- 악마 그만해

3

빈 줄에서 tab을 누르면 zsh에서 tcsh의 자동 목록이 완전히 구현됩니다.

% <TAB>

여기있어:

# list dir with TAB, when there are only spaces/no text before cursor,
# or complete words, that are before cursor only (like in tcsh)
tcsh_autolist() { if [[ -z ${LBUFFER// } ]]
    then BUFFER="ls " CURSOR=3 zle list-choices
    else zle expand-or-complete-prefix; fi }
zle -N tcsh_autolist
bindkey '^I' tcsh_autolist

tcsh를 더 자세히 모방하려면 .zshrc에도 추가하십시오.

unsetopt always_last_prompt       # print completion suggestions above prompt

2

빈 줄뿐만 아니라 명령을 입력하는 동안 TAB 사용을 향상시키는 zsh 위젯을 작성 했습니다 .

  • 빈 명령 줄과 명령 중간에 파일 을 나열 합니다 .
  • 빈 명령 행에 디렉토리 를 나열 합니다.
  • 빈 명령 줄에 실행 파일 이 나열 됩니다.

전역 변수가있는 경우 "cd"또는 "./"를 앞에 추가하도록 구성 할 수 있습니다.

export TAB_LIST_FILES_PREFIX

tab_list_files_example

# List files in zsh with <TAB>
#
# Copyleft 2017 by Ignacio Nunez Hernanz <nacho _a_t_ ownyourbits _d_o_t_ com>
# GPL licensed (see end of file) * Use at your own risk!
#
# Usage:
#   In the middle of the command line:
#     (command being typed)<TAB>(resume typing)
#
#   At the beginning of the command line:
#     <SPACE><TAB>
#     <SPACE><SPACE><TAB>
#
# Notes:
#   This does not affect other completions
#   If you want 'cd ' or './' to be prepended, write in your .zshrc 'export TAB_LIST_FILES_PREFIX'
#   I recommend to complement this with push-line-or edit (bindkey '^q' push-line-or-edit)
function tab_list_files
{
  if [[ $#BUFFER == 0 ]]; then
    BUFFER="ls "
    CURSOR=3
    zle list-choices
    zle backward-kill-word
  elif [[ $BUFFER =~ ^[[:space:]][[:space:]].*$ ]]; then
    BUFFER="./"
    CURSOR=2
    zle list-choices
    [ -z ${TAB_LIST_FILES_PREFIX+x} ] && BUFFER="  " CURSOR=2
  elif [[ $BUFFER =~ ^[[:space:]]*$ ]]; then
    BUFFER="cd "
    CURSOR=3
    zle list-choices
    [ -z ${TAB_LIST_FILES_PREFIX+x} ] && BUFFER=" " CURSOR=1
  else
    BUFFER_=$BUFFER
    CURSOR_=$CURSOR
    zle expand-or-complete || zle expand-or-complete || {
      BUFFER="ls "
      CURSOR=3
      zle list-choices
      BUFFER=$BUFFER_
      CURSOR=$CURSOR_
    }
  fi
}
zle -N tab_list_files
bindkey '^I' tab_list_files

# uncomment the following line to prefix 'cd ' and './' 
# when listing dirs and executables respectively
#export TAB_LIST_FILES_PREFIX

# these two lines are usually included by oh-my-zsh, but just in case
autoload -Uz compinit
compinit

# uncomment the following line to complement tab_list_files with ^q
#bindkey '^q' push-line-or-edit

# License
#
# This script is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This script is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this script; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
# Boston, MA  02111-1307  USA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.