มันไม่สมบูรณ์แบบ แต่การทุบตีเสร็จก็เป็นเรื่องที่ค่อนข้างยุ่งยาก ...
วิธีที่ง่ายที่สุดอยู่บนพื้นฐานของคำสั่งต่อมันยืดหยุ่นกว่าเล็กน้อยFIGNORE
คุณสามารถทำ:
complete -f -X "/myproject/data/*" vi
สิ่งนี้แนะนำให้เติมข้อความอัตโนมัติให้เสร็จสมบูรณ์สำหรับvi
ไฟล์และเพื่อลบรูปแบบที่ตรงกับ-X
ตัวกรอง ข้อเสียคือรูปแบบนั้นไม่ได้เป็นมาตรฐานดังนั้น../data
รูปแบบจะไม่ตรงกัน
สิ่งที่ดีที่สุดถัดไปอาจเป็นPROMPT_COMMAND
ฟังก์ชั่นที่กำหนดเอง:
# associative arrays of non-autocomplete directories
declare -A noacdirs=([/myproject/data]=1 )
function _myprompt {
[[ -n "${noacdirs[$PWD]}" ]] && {
echo autocomplete off
bind 'set disable-completion on'
} || {
echo autocomplete on
bind 'set disable-completion off'
}
}
PROMPT_COMMAND=_myprompt
สิ่งนี้จะปิดใช้งานการทำให้สมบูรณ์ (สมบูรณ์) เมื่อคุณอยู่ในไดเรกทอรีแต่จะปิดการใช้งานสำหรับทุกเส้นทางไม่ใช่แค่ไฟล์ในไดเรกทอรีนั้น
มันจะมีประโยชน์มากกว่าโดยทั่วไปในการเลือกปิดการใช้งานนี้สำหรับเส้นทางที่กำหนด แต่ฉันเชื่อว่าวิธีเดียวคือการใช้ฟังก์ชั่นเริ่มต้นที่สมบูรณ์ (bash-4.1 และใหม่กว่าด้วยcomplete -D
) และยุ่งมาก
สิ่งนี้ควรใช้กับคุณ แต่อาจมีผลข้างเคียงที่ไม่ตั้งใจ (เช่นการเปลี่ยนแปลงความสมบูรณ์ที่คาดไว้ในบางกรณี):
declare -A noacdirs=([/myproject/data]=1 )
_xcomplete() {
local cur=${COMP_WORDS[COMP_CWORD]} # the current token
name=$(readlink -f "${cur:-./}") # poor man's path canonify
dirname=$(dirname "$name/.")
[[ -n "${noacdirs[$dirname]}" ]] && {
COMPREPLY=( "" ) # dummy to prevent completion
return
}
# let default kick in
COMPREPLY=()
}
complete -o bashdefault -o default -F _xcomplete vi
การทำงานนี้เสร็จสมบูรณ์vi
สามารถเพิ่มคำสั่งอื่นได้ตามต้องการ ควรหยุดการทำให้ไฟล์ในไดเรกทอรีที่มีชื่อเสร็จสมบูรณ์โดยไม่คำนึงถึงพา ธ หรือไดเร็กทอรีการทำงาน
ฉันเชื่อว่าวิธีการทั่วไปด้วยcomplete -D
คือการเพิ่มฟังก์ชั่นความสมบูรณ์สำหรับแต่ละคำสั่งตามที่พบ หนึ่งอาจต้องเพิ่มcomplete -E
(ชื่อสมบูรณ์ของคำสั่งเมื่อบัฟเฟอร์อินพุตว่างเปล่า)
อัปเดต
ต่อไปนี้เป็นรุ่นไฮบริดของPROMPT_COMMAND
โซลูชันฟังก์ชั่นและเสร็จสมบูรณ์มันง่ายกว่าที่จะเข้าใจและแฮ็คฉันคิดว่า:
declare -A noacdirs=([/myproject/data]=1 [/project2/bigdata]=1)
_xcomplete() {
local cmd=${COMP_WORDS[0]}
local cur=${COMP_WORDS[COMP_CWORD]} # the current token
[[ -z "$cur" && -n "$nocomplete" ]] && {
printf "\n(restricted completion for $cmd in $nocomplete)\n"
printf "$PS2 $COMP_LINE"
COMPREPLY=( "" ) # dummy to prevent completion
return
}
COMPREPLY=() # let default kick in
}
function _myprompt {
nocomplete=
# uncomment next line for hard-coded list of directories
[[ -n "${noacdirs[$PWD]}" ]] && nocomplete=$PWD
# uncomment next line for per-directory ".noautocomplete"
# [[ -f ./.noautocomplete ]] && nocomplete=$PWD
# uncomment next line for size-based guessing of large directories
# [[ $(stat -c %s .) -gt 512*1024 ]] && nocomplete=$PWD
}
PROMPT_COMMAND=_myprompt
complete -o bashdefault -o default -F _xcomplete vi cp scp diff
ฟังก์ชันพรอมต์นี้ตั้งค่าnocomplete
ตัวแปรเมื่อคุณป้อนหนึ่งในไดเรกทอรีที่กำหนดค่า พฤติกรรมการทำให้เสร็จสมบูรณ์ที่ปรับเปลี่ยนจะเริ่มทำงานเฉพาะในกรณีที่ตัวแปรนั้นไม่ว่างเปล่าและเมื่อคุณลองดำเนินการให้เสร็จสิ้นจากสตริงว่างเท่านั้นดังนั้นจึงอนุญาตให้ใช้ชื่อบางส่วนได้-z "$cur"
เสร็จสมบูรณ์ ใส่เครื่องหมายสองprintf
บรรทัดเพื่อการทำงานที่เงียบ
ตัวเลือกอื่นรวมถึง.noautocomplete
ไฟล์การตั้งค่าสถานะสำหรับแต่ละไดเรกทอรีที่คุณสามารถทำได้touch
ในไดเรกทอรีตามต้องการ และคาดเดาขนาดไดเรกทอรีใช้ stat
GNU คุณสามารถใช้ตัวเลือกใดก็ได้หรือทั้งสามอย่าง
( stat
เมธอดนี้เป็นเพียงการคาดเดาขนาดไดเรกตอรีที่รายงานนั้นเติบโตขึ้นพร้อมกับเนื้อหามันคือ "high water mark" ซึ่งโดยปกติแล้วจะไม่ย่อขนาดเมื่อไฟล์ถูกลบโดยไม่ต้องมีการดูแลระบบ ไดเรกทอรีพฤติกรรมที่แม่นยำและการเพิ่มขึ้นต่อไฟล์ขึ้นอยู่กับระบบไฟล์พื้นฐานฉันพบว่ามันเป็นตัวบ่งชี้ที่เชื่อถือได้บนระบบ linux ext2 / 3/4 อย่างน้อย)
bash เพิ่มช่องว่างพิเศษแม้ว่าจะส่งคืนความสมบูรณ์ที่ว่างเปล่า (สิ่งนี้จะเกิดขึ้นเฉพาะในตอนท้ายของบรรทัด) คุณสามารถเพิ่ม-o nospace
ไปยังcomplete
คำสั่งเพื่อป้องกันปัญหานี้
niggle ที่เหลืออยู่อย่างหนึ่งคือถ้าคุณสำรองเคอร์เซอร์ไปที่จุดเริ่มต้นของแท็บโทเค็นและ Hit การเริ่มต้นที่สมบูรณ์จะเริ่มขึ้นอีกครั้ง พิจารณาคุณลักษณะ ;-)
(หรือคุณสามารถ futz รอบด้วย${COMP_LINE:$COMP_POINT-1:1}
ถ้าคุณชอบ over-engineering แต่ฉันพบว่าตัวเองทุบตีล้มเหลวในการตั้งค่าตัวแปรเสร็จสมบูรณ์ได้อย่างน่าเชื่อถือเมื่อคุณสำรองข้อมูลและพยายามดำเนินการเสร็จสิ้นในกลางของคำสั่ง)