การทำให้แท็บสมบูรณ์ไม่สามารถใช้คำสั่งได้


50

ฉันกำลังพยายามใช้การทำให้แท็บเสร็จสมบูรณ์สำหรับคำสั่งใน Ubuntu 11.04 Beta 1 ซึ่งใช้งานการอัปเดตล่าสุดทั้งหมด แต่ดูเหมือนจะไม่ทำงาน (แม้ว่าจะมีการติดตั้งแพคเกจทุบตีเสร็จสิ้นแล้ว)

การทำให้แท็บเสร็จสมบูรณ์ทำงานได้อย่างถูกต้องเฉพาะกับไดเรกทอรีหรือไฟล์

ความคิดใดที่จะขุด?


ฉันแก้ปัญหานี้โดยใช้วิธีการแก้ปัญหาที่ได้รับที่askubuntu.com/questions/325807/…
DB

คำตอบ:


67

ตรวจสอบว่าคุณมีแฟรกเมนต์ต่อไปนี้ใน. bashrc ของคุณ (ควรมีตามค่าเริ่มต้น)

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

ขอบคุณ! ฉันได้แทนที่. bashrc ด้วยตัวเองแล้วจึงไม่สามารถเข้าใจได้ว่าปัญหาคืออะไรทำงานได้อย่างสมบูรณ์แบบในขณะนี้
Screatch

นี้แก้ไขการคอมไพล์ bit git ของฉันที่ xubuntu 12.04 เช่นกันขอบคุณมาก
palmic

วิธีอัตโนมัติเกี่ยวกับการสลับและตัวเลือกคำสั่งบรรทัด apt-get? เช่นเมื่อคุณป้อนapt-get insแล้วกดแท็บเพื่อเติมให้อัตโนมัติ
Reza Ghodsi

3
ฉันต้องการเพิ่มว่าแพ็คเกจbash-completionนี้จำเป็นสำหรับการทำงาน แปลกที่การติดตั้งมาตรฐานของ บริษัท ของฉันไม่มีแพ็คเกจนี้
Edgar

13

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

แม้ว่าคุณจะมีบรรทัดที่เหมาะสมในของคุณ.bashrc(ในขณะที่คำตอบข้างต้น) และbash-completionแพคเกจติดตั้งเสร็จสิ้นทุบตียังคงสามารถทำงานผิดพลาดถ้าคุณมีอย่างใดอย่างหนึ่งshopt -s nullglobหรือshopt -s failglobในของคุณหรือ.bashrc.bash_aliases

สถานการณ์ต่อไปนี้ได้รับการทดสอบด้วยการปรับแต่ง.bashrcและ.bash_aliasesลบของผู้ใช้ทั้งหมดเพื่อให้การทดสอบที่เป็นธรรมโดยมีบรรทัดเสร็จสิ้นการทุบตีที่เหมาะสมใน.bashrcปัจจุบันและbash-completionติดตั้ง

1) สถานการณ์แรกคือเมื่อคุณมีshopt -s failglobในของคุณหรือ.bashrc.bash_aliases

เมื่อพยายามแท็บไดเรกทอรีและไฟล์ทั้งหมดตามลำดับข้อผิดพลาดเหล่านี้จะเกิดขึ้น:

cd Dbash: no match: "${COMP_WORDS[@]}"  
cat pabash: no match: words[0]=${!ref}${COMP_WORDS[i]}

อย่างไรก็ตามคำสั่งจะยังคงเสร็จสมบูรณ์

2) เมื่อshopt -s nullglobเปิดใช้งานการพยายามที่จะแท็บไดเรกทอรีให้สมบูรณ์หรือไฟล์จะนำไปสู่ทุกสิ่งที่อยู่ในรายการโดยไม่ต้องทำให้เสร็จ:

cd Do
.adobe/                  .gimp-2.6/               Podcasts/
.aptitude/               .gnome2/                 Public/
.audacity-data/          .gnome2_private/         .pulse/
............

ฉันตัดรายชื่อสั้น ๆ ที่นี่เนื่องจากใช้เวลานานมากและไม่จำเป็นต้องทำซ้ำทั้งหมด

อีกครั้งความสมบูรณ์ของคำสั่งจะยังคงทำงานอย่างไรก็ตาม

ดังนั้นเพียงแค่ลบshopt -s failglobหรือshopt -s nullglobยังสามารถแก้ปัญหาข้อผิดพลาดด้วยการทุบตีเสร็จสมบูรณ์สมมติว่าคุณมีสายที่เหมาะสมใน.bashrcและbash-completionติดตั้งของคุณ


1
คำอธิบายที่ดีมันแก้ไขปัญหาของฉันเมื่อฉันพยายามทำให้แท็บเสร็จสมบูรณ์และเกิดข้อผิดพลาด >> words [0] = $ {! ref} $ {COMP_WORDS [i]}
bagustris

ในขณะที่ทำงานเป็นวิธีแก้ปัญหามันเป็นสิ่งที่ดีสำหรับโปรแกรมเมอร์ที่เสร็จสมบูรณ์ใด ๆ ที่จะพึ่งพา เนื่องจาก nullglob (ซึ่งเป็นชื่อที่ดีกว่าสำหรับหลาย ๆ คน) และญาติอาจตั้งรหัส completer ใด ๆ ที่ต้องใช้ความหมายเก่า (wildcards โดยไม่มีการจับคู่ส่งผลให้เกิด wildcard ตัวเอง) ควรบันทึกการตั้งค่า glob ปัจจุบันตั้งค่าที่พวกเขาต้องการ ตั้งค่า glob เก่าหลังจากนั้นเช่นเดียวกับที่ใช้โดยทั่วไปแล้ว IFS
Alex North-Keys

10

นอกเหนือจากการแก้ไข/etc/bash.bashrcไฟล์ (คำตอบอื่น ๆ ) คุณอาจจำเป็นต้องติดตั้งbash-completionแพคเกจ

ตรวจสอบว่า/etc/bash_completionไฟล์มีปัญหาหรือไม่ ถ้าไม่:

sudo apt-get install bash-completion

(ในการติดตั้งเดเบียน 7 ของฉันมันไม่ได้ถูกติดตั้งไว้ในตอนแรก)


7

เป็นพื้นฐานเพราะอาจฟังดูว่าทุบตีเป็นเปลือกที่ใช้งานของคุณ

echo $SHELL

ฉันเพียงแค่การอัพเกรดไปอูบุนตู 14.04.1 LTS และไม่มีแท็บอัตโนมัติเสร็จแม้หลังจากทำตามคำแนะนำในการโพสต์นี้เท่านั้นที่จะรู้เปลือกของฉันถูกกำหนดให้และไม่ได้/bin/sh/bin/bash


2

อัปเดตเป็น Ubuntu 14.04.01

ตรวจสอบว่าคุณมีแฟรกเมนต์ต่อไปนี้ใน. bashrc ของคุณ (ควรมีตามค่าเริ่มต้น)

sudo vim /etc/bash.bashrc (พิมพ์ "i" เพื่อแก้ไขไฟล์)

    # enable bash completion in interactive shells
    if ! shopt -oq posix; then
     if [ -f /usr/share/bash-completion/bash_completion ]; then
        . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi

Uncomment 7 บรรทัดด้านบน

บันทึกไฟล์ "esc + w + q + enter"

รีสตาร์ททุบตี

ทุบตี exec


1
สิ่งนี้จะทำอย่างไร ค่าเริ่มต้นนี้ไม่เป็นแบบนี้เหรอ?
ทิม

เช่นเดียวกับ @Tim พูดว่าการกำหนดค่านั้นมีให้โดยการกำหนดค่าเริ่มต้น
ssoto

สิ่งนี้ใช้ได้กับฉัน
Thamaraiselvam

คำตอบนี้ทำงานเหมือนมีเสน่ห์และมันมีคะแนนโหวตเป็นลบ ???
greuze
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.