Bash เติมข้อความอัตโนมัติด้วยคำสั่ง vim


13

ใน bash การเติมข้อความอัตโนมัติของเส้นทางเพิ่งหยุดทำงานเมื่อออกvimคำสั่งโดยที่เส้นทางนั้นมีความลึกมากกว่าสองไดเรกทอรี (จะยังคงทำงานตามที่คาดไว้กับคำสั่งอื่นเช่นlsและcd)

ตัวอย่างเช่นถ้าฉันพิมพ์ls .config/btsync/btแล้วกด TAB ls .config/btsync/btsync.confจะขยายไป

ถ้าผมพิมพ์vim .config/btแล้วกด TAB vim .config/btsync/จะขยายไป

อย่างไรก็ตามถ้าฉันพิมพ์vim .config/btsync/btแล้วกด TAB ไม่มีอะไรเกิดขึ้น (ฉันคาดว่าจะขยายvim .config/btsync/btsync.confเป็นlsตัวอย่างเช่นด้านบน

ฉันได้รับปัญหาเดียวกันเมื่อทำงานในฐานะผู้ใช้ของตัวเองและเมื่อทำงานเป็น su

ฉันอ่านโพสต์นี้ซึ่งกล่าวถึงปัญหาของ bash-completion เวอร์ชั่นเก่า แต่ฉันใช้ 2.1-5

UPDATE: หลังจากการทดสอบเพิ่มเติมฉันพบว่าปัญหารากคือทุบตีจะสมบูรณ์เพียงชื่อไดเรกทอรีไม่ใช่ชื่อไฟล์

UPDATE: ปรากฎว่าbash-completionเป็นสาเหตุโดยรวม ดูความคิดเห็นที่สองของฉันในคำตอบที่ยอมรับ

ข้อเสนอแนะเกี่ยวกับสาเหตุที่เป็นไปได้ของพฤติกรรมนี้จะได้รับสุดซึ้ง!


โพสต์ของคุณ.bashrc!
Gilles 'หยุดชั่วร้าย'

ลิงก์ไปยัง.bashrcโพสต์ของฉันตามที่ต้องการ
TheRogueWolf

ลบลิงก์ไปยัง. bashrc, .aliases และ .functions ที่ไม่เกี่ยวข้องกับปัญหาในขณะนี้ว่าสาเหตุได้ถูกค้นพบแล้ว
TheRogueWolf

ปัญหาเดียวกันใน Debian 9, การติดตั้งบางอย่าง แต่ไม่ใช่ทั้งหมด: $
Philippe Gachoud

คำตอบ:


10

ฉันได้บางวิจัยมากขึ้นสำหรับคุณและนี่คือสิ่งที่ผมพบว่า - กุญแจสำคัญในการเติมข้อความอัตโนมัติที่เป็นคำสั่งbash completeคุณสามารถพิมพ์กฎสำหรับการvimใช้:

complete -p vim

ในทำนองเดียวกันคุณสามารถลบกฎเฉพาะเหล่านี้ด้วย:

complete -r vim

คำสั่งนี้จะรีเซ็ตเป็นค่าเริ่มต้น - พา ธ และชื่อไฟล์ตามปกติโดยไม่ต้องใช้ตรรกะใด ๆ เพิ่มเติม นั่นอาจเป็นสิ่งที่คุณต้องการ

สำหรับข้อมูลเพิ่มเติมตรวจสอบhelp completeหรือman bashและค้นหาส่วนเกี่ยวกับcompleteคำสั่ง (มันเป็นทุบตีในตัวจึงได้รับการบันทึกไว้ใน bash manpage)

หนึ่งจุดสุดท้าย - การเปลี่ยนแปลงดังกล่าวข้างต้นมีผลเฉพาะในปัจจุบันbashเซสชั่นถ้าคุณต้องการที่จะลบกฎที่เป็นกลุ่มทุกครั้งหลังจากเข้าสู่ระบบใส่ของคุณcomplete -r vim~/.bashrc

หวังว่าจะช่วย :)


นั่นมัน ขอบคุณมาก complete -p vimคำสั่งกลับcomplete -F _filedir_xspec vimซึ่งจะถูกลบออกโดยcomplete -r vimคำสั่งการแก้ปัญหา ฉันจะอ่านcompleteคำสั่งและข้อมูลที่ส่งคืนโดยสวิตช์ -p งงงวยเล็กน้อยว่าทำไมพฤติกรรมนี้เปลี่ยนไปดังนั้นจะตรวจสอบเช่นกัน
TheRogueWolf

3
ดูเหมือนว่าทุบตีเสร็จเป็นผู้กระทำหลังจากทั้งหมด _filedir_xspecฟังก์ชั่นใน/usr/share/bash-completion/bash_completionเพียงเสร็จไดเรกทอรี ฉันได้ถอนการติดตั้งbash-completionลบcomplete -r vimบรรทัดจากของฉัน.bashrcและรีบูตและvimตอนนี้ทำงานตามที่คาดไว้
TheRogueWolf

3

Bash โดยค่าเริ่มต้นการเติมข้อความอัตโนมัติจะทำเฉพาะเส้นทางและชื่อไฟล์ อย่างไรก็ตามกลไกดังกล่าวสามารถขยายได้และสามารถใช้ bash เพื่อดำเนินการเติมข้อความอัตโนมัติที่แตกต่างกันสำหรับโปรแกรมต่างๆ ตัวอย่างเช่นgitมันสามารถเติมชื่อย่อยคำสั่งอัตโนมัติ (โคลนกระทำ) และการแก้ไขแทนชื่อพา ธ เพียง บางครั้งมันมีประโยชน์บางครั้งก็ค่อนข้างน่ารำคาญ - ตัวอย่างเช่นเมื่อgzip -dปฏิเสธที่จะเติมชื่อไฟล์โดยอัตโนมัติที่ไม่มี.gzนามสกุล

โดยทั่วไปแล้วการทุบตีจะเสร็จสิ้นการกำหนดค่าใน/etc/bash_completion.d- คุณอาจจะพบไฟล์ที่เรียกว่าvimมี นั่นคือไฟล์ที่มีกฎการเติมข้อมูลอัตโนมัติสำหรับvimcommandline

ตอนนี้คุณมีสองตัวเลือก:

  1. แก้ไขไฟล์เป็นพา ธ การเติมข้อความอัตโนมัติตามที่ผู้ใช้คาดหวัง
  2. ลบไฟล์เพื่อปิดการใช้งานvimกฎพิเศษและดำเนินการเติมข้อความอัตโนมัติเส้นทางเริ่มต้นเท่านั้น

และแน่นอนไฟล์รายงานข้อผิดพลาดที่แสดงปัญหาเพื่อให้ได้รับการแก้ไขในรุ่นอนาคต :)


ขอบคุณมากสำหรับคำอธิบายที่ยอดเยี่ยม :) ฉันได้ดู/etc/bash_completion.dและมีเพียงhgไฟล์ปัจจุบัน (สำหรับ Mercurial) ที่แปลกมาก.
TheRogueWolf

1
จากนั้นจะต้องอยู่ที่อื่น ลอง/usr/share/bash-completion/หรือรายการไฟล์ทั้งหมดจากvimแพ็คเกจหรือจากbashหรือbash-completionแพ็คเกจ (ไม่แน่ใจว่ามันเรียกว่าบน ArchLinux) อย่างไร มันจะอยู่ที่ไหนสักแห่ง
MLu

1
รายชื่อไฟล์จากbash-completionการแสดงแพคเกจ/usr/share/bash-completion/completionsไม่ประกอบด้วยกฎสำหรับหลายโปรแกรม vimแต่ไม่ รายชื่อไฟล์ที่ติดตั้งมาพร้อมกับvimแพ็คเกจจะไม่แสดงไฟล์ที่เกี่ยวข้องกับความสมบูรณ์และการค้นหาทั้งระบบโดยใช้find / -name vimยังไม่แสดงไฟล์ที่เกี่ยวข้องกับความสมบูรณ์
TheRogueWolf

2

บางทีคุณสามารถติดตั้ง bash-completion ใหม่ได้: apt-get install --reinstall bash-completion

และดูไฟล์ /etc/bash.bashrc: nano /etc/bash.bashrc

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

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

จากนั้นรีสตาร์ทเซสชันเทอร์มินัลของคุณ


ฉันพยายามลบออกbash-completionทดสอบvimพฤติกรรมแล้วติดตั้งใหม่bash-completionและทดสอบ แต่ฉันยังคงประสบปัญหาเดียวกันทั้งสองกรณี /etc/bash.bashrcเส้นที่คุณได้ระบุไว้ไม่ได้อยู่ใน อย่างไรก็ตามบรรทัดนี้[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
TheRogueWolf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.