zsh tab conclusão na linha vazia

11

Gostaria de um tcsh'ism que não consegui encontrar: em uma linha em branco sem conteúdo, quero pressionar a tecla tab e ver o equivalente a um ls. Isso quer dizer que eu quero

$ <tab>

para fazer algo diferente, me dando um \ t. Eu encontrei recursos fantásticos para a conclusão do comando, mas não para este caso base. Qualquer ajuda nisso seria ótimo! Obrigado.

    
por kristopolous 31.05.2011 / 00:06

4 respostas

7
# 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
    
por 22.02.2012 / 21:45
7

O comportamento do Tab no início de uma linha é controlado pelo insert-tab style . No entanto, existem apenas dois comportamentos suportados:

  • conclusão como de costume, em zstyle ':completion:*' insert-tab false
  • insira uma guia em zstyle ':completion:*' insert-tab true
  • um ou outro em zstyle ':completion:*' insert-tab pending[=N]

Se você quiser apenas completar comandos nessa posição, zstyle ':completion:*' insert-tab true será suficiente. Se você quiser algo diferente, como listar os arquivos no diretório atual, precisará modificar _main_complete .

Um tópico recente na lista de trabalhadores do zsh discutido insert-tab .

    
por 31.05.2011 / 23:08
2

Aqui está a implementação completa da autolist do tcsh em zsh, quando você pressiona a guia na linha vazia

% <TAB>

Aqui está:

# 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

Se você quiser emular tcsh mais de perto, adicione isso ao seu .zshrc:

unsetopt always_last_prompt       # print completion suggestions above prompt
    
por 26.06.2017 / 02:21
1

Eu escrevi este widget zsh que melhora o uso de TAB, não apenas em uma linha vazia, mas também enquanto você está digitando um comando.

  • Ele listará arquivos em uma linha de comando vazia e no meio de qualquer comando.
  • Listará diretórios em uma linha de comando vazia.
  • Ele listará executáveis em uma linha de comando vazia.

Pode ser configurado para preceder "cd" ou "./" nos casos com uma variável global.

export TAB_LIST_FILES_PREFIX

#Listfilesinzshwith<TAB>##Copyleft2017byIgnacioNunezHernanz<nacho_a_t_ownyourbits_d_o_t_com>#GPLlicensed(seeendoffile)*Useatyourownrisk!##Usage:#Inthemiddleofthecommandline:#(commandbeingtyped)<TAB>(resumetyping)##Atthebeginningofthecommandline:#<SPACE><TAB>#<SPACE><SPACE><TAB>##Notes:#Thisdoesnotaffectothercompletions#Ifyouwant'cd'or'./'tobeprepended,writeinyour.zshrc'exportTAB_LIST_FILES_PREFIX'#Irecommendtocomplementthiswithpush-line-oredit(bindkey'^q'push-line-or-edit)functiontab_list_files{if[[$#BUFFER==0]];thenBUFFER="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
    
por 31.01.2017 / 11:42