ฉันจะได้รับ bash เสร็จสิ้นสำหรับนามแฝงคำสั่งได้อย่างไร


57

ฉันกำลังมองหาที่จะได้รับแท็บเสร็จในนามแฝงบรรทัดคำสั่งของฉันเช่นว่าฉันกำหนดนามแฝงต่อไปนี้:

alias apt-inst='sudo aptitude install'

มีวิธีรับความสำเร็จที่จัดทำโดยความถนัดเมื่อฉันกดปุ่มแท็บหรือไม่ นั่นคือเมื่อฉันเขียน 'sudo aptitude install gnumer' และแท็บ Hit ความถนัดจะทำสิ่งนี้ให้เป็น gnumeric หรือหากมีความไม่แน่นอนแสดงรายการแพ็คเกจทั้งหมดที่เริ่มต้นด้วย gnumer ถ้าฉันทำโดยใช้นามแฝงของฉันไม่มีอะไร - ไม่เสร็จ


คำตอบ:


30

มีหัวข้อที่ดีเกี่ยวกับเรื่องนี้ในฟอรั่มอูบุนตู Ole J เสนอฟังก์ชันกำหนดคำจำกัดความการเติมสมนามต่อไปนี้:

function make-completion-wrapper () {
  local function_name="$2"
  local arg_count=$(($#-3))
  local comp_function_name="$1"
  shift 2
  local function="
    function $function_name {
      ((COMP_CWORD+=$arg_count))
      COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
      "$comp_function_name"
      return 0
    }"
  eval "$function"
  echo $function_name
  echo "$function"
}

ใช้มันเพื่อกำหนดฟังก์ชั่นเสร็จสำหรับนามแฝงของคุณจากนั้นระบุฟังก์ชั่นนั้นเป็นคอมไพเลอร์สำหรับนามแฝง:

make-completion-wrapper _apt_get _apt_get_install apt-get install
complete -F _apt_get_install apt-inst

ฉันชอบที่จะใช้นามแฝงในการเพิ่มข้อโต้แย้งที่ใช้เสมอไปยังโปรแกรมที่มีอยู่ ยกตัวอย่างเช่นกับฉันมักจะต้องการที่จะข้ามอุปกรณ์และไฟล์ไบนารีดังนั้นฉันทำให้นามแฝงสำหรับgrep grepสำหรับการเพิ่มคำสั่งใหม่เช่นgrepbinฉันใช้เชลล์สคริปต์ใน~/binโฟลเดอร์ของฉัน หากโฟลเดอร์นั้นอยู่ในเส้นทางของคุณก็จะได้รับการเติมข้อความอัตโนมัติ


2
ยอดเยี่ยมฉันกลัวว่ามันจะเป็นไปไม่ได้
levesque

หมายเหตุรหัสนี้มีปัญหาบางอย่าง ดูคำตอบของฉันสำหรับคำอธิบายและการแก้ปัญหาของพวกเขา
Tom Hale

หมายเหตุ:ฉันใช้เทคนิคนี้สำหรับคำสั่งอื่นและฉันต้องใช้complete -o default -F ...แทนcomplete -F ...เพื่อให้ได้สิ่งต่าง ๆ เช่นการเติมข้อความอัตโนมัติทำงานอย่างถูกต้องเมื่อผ่าน args (Bash 4.3.46)
joelittlejohn

28

ลองใช้นามแฝงที่สมบูรณ์ซึ่งจะแก้ปัญหานี้ได้อย่างแน่นอน

หลังจากติดตั้งแล้วคุณสามารถใช้หนึ่งฟังก์ชันทั่วไปเพื่อทำนามแฝงจำนวนมากเช่นนี้:

complete -F _complete_alias <myalias1>
complete -F _complete_alias <myalias2>
complete -F _complete_alias <myalias3>

คุณอาจต้องการแหล่งไฟล์ complete_alias ในทุก ๆ bash ผ่าน.bash_profileหรือคล้ายกัน

การติดตั้ง

mkdir ~/.bash_completion.d
curl https://raw.githubusercontent.com/cykerway/complete-alias/master/bash_completion.sh \
     > ~/.bash_completion.d/complete_alias

ใบสมัคร

source ~/.bash_completion.d/complete_alias

alias container=docker\ container
complete -F _complete_alias container

containerตอนนี้สามารถเติมข้อความอัตโนมัติโดย_docker()ตัวจัดการความสมบูรณ์ต้นฉบับ

$ container l<Tab>
logs  ls    

$ container s<Tab>
start  stats  stop   

2
เนื่องจากซอฟต์แวร์นี้ดูเหมือนจะเป็นของคุณคุณสามารถทำได้ดีกว่านี้ เพิ่มคำแนะนำในการติดตั้ง อธิบายว่ามันทำอะไรและใช้อย่างไร มิฉะนั้นนี่เป็นเพียงสแปม
muru

@muru ฉันกำลังคิดว่าจะวางโค้ดไว้ที่นี่ แต่อาจนานกว่าที่จะยอมรับได้ที่นี่ ฉันคิดว่าผู้คนไม่มีปัญหาในการอ่านหัวข้อการติดตั้งในไฟล์ README และในกรณีนี้มันมีหลายบรรทัดเท่านั้น
Cyker

2
ประเด็นคือสามารถตัดสินได้ว่าการเยี่ยมชม README กล่าวว่าคุ้มค่าหรือไม่เพียงแค่ตอบคำถาม
muru

นี่คือคำตอบที่เพียงพอและจะแก้ปัญหาได้อย่างแน่นอน
ЯрославРахматуллин

1
นี่คือคำตอบที่ยอดเยี่ยมและครอบคลุมมากที่ทำงานได้อย่างสมบูรณ์แบบขอบคุณ! อาจได้รับการอัปเดตเนื่องจาก @muru มีปัญหากับมัน
Brian Topping

3

2018 คำตอบ

คุณต้องเพิ่มนามแฝงของคุณในโปรแกรม 'สมบูรณ์' การเติมข้อความอัตโนมัติที่คุณต้องการบรรลุคุณต้องใช้ -c หรือ -F

สำหรับแพ็คเกจเติมข้อความอัตโนมัติ:

complete -c name_of_your_alias

สำหรับการเติมคำสั่งอัตโนมัติ:

complete -F name_of_your_alias

วิธีตรวจสอบว่ามีการเพิ่มชื่อแทนของคุณอย่างถูกต้องหรือไม่

complete | grep name_of_your_alias

สุดท้ายเพื่อลบชื่อแทนออกจาก 'สมบูรณ์':

complete -r name_of_your_alias

ในกรณีของคุณ:

complete -c apt-inst

1
โปรดอย่าตอบคำถามในความคิดเห็นต่อไป หากคุณมีสิ่งที่จะพูดแก้ไขพวกเขาเป็นคำตอบ
G-Man

2
complete -F xxxไม่ทำงานบน OSX (เพียงแสดงการใช้งานcomplete: usage: complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [name ...]) คุณมีตัวชี้หรือไม่? ขอบคุณ
Anthony Kong

ใช้สิ่งนี้แทน: unix.stackexchange.com/questions/224227/…
Rich

2

นี่คือรหัสจากคำตอบของ Shawn J. Goffพร้อมการปรับปรุงบางอย่าง:

  • ข้อผิดพลาดไวยากรณ์คงเน้นด้วยshell-checkเช่นครั้งแรก"ของ"$@"จริงสิ้นสุดสตริงนิยามฟังก์ชั่น
  • ลบreturn 0เพื่อให้ค่าส่งคืนของฟังก์ชั่นพื้นฐานสามารถส่งกลับไปยังผู้โทร

.

# Wraps a completion function, eg for use with an alias.
# Usage:
# make-completion-wrapper <actual completion function> <name of new func.>
#                         <command name> <list supplied arguments>
# eg.
#   alias agi='apt-get install'
#   make-completion-wrapper _apt_get _apt_get_install apt-get install
#     # defines a function called _apt_get_install (that's $2) that will
#     # complete the 'agi' alias. 
#   complete -F _apt_get_install agi
function make-completion-wrapper {
  local function_name="$2"
  local arg_count=$(( $#-3 ))
  local comp_function_name="$1"
  shift 2
  local function="function $function_name {
      (( COMP_CWORD += $arg_count ))
      COMP_WORDS=( \"\$@\" \${COMP_WORDS[@]:1} )
      \"$comp_function_name\"
    }"
  eval "$function"
  # echo "$function"
}
export -f make-completion-wrapper

ใช้งานไม่ได้กับฉันใน Bash 4.3.46 ฉันกลัว คำตอบที่ฌอนเจฟฟ์ของไม่ทำงาน
joelittlejohn

1
"สิ้นสุด" สตริงคำนิยามฟังก์ชั่นมีวัตถุประสงค์; จุดคือการรวมข้อโต้แย้งจากฟังก์ชั่นด้านนอกเข้าไปในCOMP_WORDSอาร์เรย์ ถ้าเราใช้make-completion-wrapper _apt_get _apt_get_install apt-get installเป็นตัวอย่างหลังจากshift 2, มี$@ apt-get installนิยามฟังก์ชันรวมถึงapt-get install(คำสองคำที่แท้จริง) COMP_WORDSเมื่อกำหนด
Jeffery ถึง

0

ในฐานะที่เป็นส่วนขยายของ @Giles คำตอบฟังก์ชั่นอำนวยความสะดวกต่อไปนี้จะตั้งชื่อเสื้อคลุมที่สร้างขึ้นโดยอัตโนมัติmake-completion-wrapperเพื่อให้สามารถกำหนดความสมบูรณ์ในหนึ่งบรรทัด:

function complete-alias  {
    # uses make-completion-wrapper: https://unix.stackexchange.com/a/4220/50978
    # example usage
    # complete-alias _pass pshow pass show
    # complete-alias _pass pgen pass generate

    EXISTING_COMPLETION_FN=${1} && shift
    ALIAS=${1} && shift
    AUTOGEN_COMPLETION_FN="__autogen_completion_${ALIAS}"
    make-completion-wrapper ${EXISTING_COMPLETION_FN} ${AUTOGEN_COMPLETION_FN} ${*}
    complete -F ${AUTOGEN_COMPLETION_FN} ${ALIAS}
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.