เติมแท็บ 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

ขอบคุณ John ฉันพบโซลูชันของคุณและปรับเปลี่ยนได้ที่นี่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 งานinsert-tabกล่าวถึง


! ที่ยอดเยี่ยม โดย _main_complete ดูเหมือนว่าคุณกำลังอ้างอิงถึงบางแห่งในรหัส C ใช่หรือไม่ ฉันขอโทษสำหรับคำถามโง่ ๆ แต่จะพบที่ไหน

1
@ user535759: ไม่_main_completeเป็นส่วนหนึ่งของรหัส zsh ที่ทำให้เสร็จสมบูรณ์ มันอยู่ในในแหล่งต้นไม้ที่มักจะติดตั้งในสถานที่เช่นCompletion/Base/Core/_main_complete /usr/share/zsh/functions/Completion/Base/_main_complete
Gilles 'หยุดความชั่วร้าย'

@llua การเปลี่ยนสไตล์ที่เกี่ยวข้อง-command-ไม่ทำให้ <Tab> แสดงรายการไฟล์ในไดเรกทอรีปัจจุบัน สิ่งที่คุณทำคือการจำกัดการจับคู่เพื่อละเว้นชื่อคำสั่ง แต่จะแสดงรายการเฉพาะสิ่งที่จะแล้วเสร็จในตำแหน่งนี้ดังนั้นจึงไม่ใช่ไฟล์ในไดเรกทอรีปัจจุบัน (เฉพาะไดเรกทอรีและไฟล์ปฏิบัติการที่ขึ้นอยู่กับautocdและPATH)
Gilles 'หยุดชั่วร้าย'

3

นี่คือการใช้งานออโต้ลิสต์ของ tcsh ใน zsh เมื่อคุณกด tab บนบรรทัดว่าง

% <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

ฉันเขียนวิดเจ็ต zsh นี้ที่ช่วยเพิ่มการใช้ TAB ไม่เพียง แต่ในบรรทัดว่าง แต่ยังในขณะที่คุณกำลังพิมพ์คำสั่ง

  • มันจะแสดงรายการไฟล์บนบรรทัดคำสั่งว่างและตรงกลางของคำสั่งใด ๆ
  • มันจะแสดงรายการไดเรกทอรีในบรรทัดคำสั่งที่ว่างเปล่า
  • มันจะแสดงรายการexecutablesบนบรรทัดคำสั่งที่ว่างเปล่า

มันสามารถกำหนดค่าให้ผนวก "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.