กรอก avfs directory ปลอมใน zsh


37

ฉันจะปรับแต่งระบบความสมบูรณ์ของ zsh เพื่อให้ไฟล์ "ปลอม" สมบูรณ์ในบางสถานการณ์ได้อย่างไร

แม่นยำยิ่งขึ้นระบบไฟล์AVFSทำให้ไฟล์เก็บถาวรเป็นไดเรกทอรีโดยการสร้าง "ไดเรกทอรีปลอม" ถัดจากไฟล์เก็บถาวร โดยค่าเริ่มต้นมันทำซ้ำลำดับชั้นของไดเรกทอรีทั้งหมดภายใต้จุดเชื่อมต่อของ~/.avfsมัน นอกจากนี้ภายใต้~/.avfsสำหรับทุกไฟล์เก็บถาวรเช่น/tmp/foo.zipนอกเหนือจากไฟล์เก็บถาวรตัวเอง~/.avfs/tmp/foo.zipมีไดเรกทอรีที่เรียกว่า~/.avfs/tmp/foo.zip#ซึ่งแสดงเนื้อหาของไฟล์เก็บถาวร อย่างไรก็ตามไดเรกทอรีพิเศษนี้ไม่ปรากฏในรายชื่อของ~/.avfs/tmp: มันมีอยู่เฉพาะเมื่อมีการร้องขออย่างชัดเจน (สิ่งนี้คล้ายกับการทำงานของเคาน์เตอร์อัตโนมัติ)

mountavfs
cd ~/.avfs/tmp/foo.zip\#

เมื่อฉันพิมพ์คำสั่งเหมือนคำสั่งด้านบนfoo.zip#จะไม่ปรากฏเป็นความสำเร็จที่สมบูรณ์~/.avfs/tmp/เนื่องจากไม่มีไดเรกทอรีดังกล่าว วิธีที่ฉันสามารถบอก zsh ว่าเมื่อใดก็ตามที่มีไฟล์ที่มีเส้นทางแบบเต็ม$arcแมตช์~/.avfs/**/*.(tgz|zip)¹ก็ควรทำเป็นว่ามีไดเรกทอรีที่เรียกว่า${arc}#?

(โปรดทราบว่าฉันต้องการความสมบูรณ์ในการทำงานกับการเรียกทุกครั้ง_filesหรือ_dirsไม่ใช่เฉพาะสำหรับcdคำสั่งฉันไม่ต้องการให้ทำซ้ำรหัสของ_filesฟังก์ชันหากเป็นไปได้)

¹ และส่วนที่เหลือทั้งหมดของส่วนขยาย


~ / .avfs มี "copy" ของระบบไฟล์ทั้งหมดหรือไม่?
ctrl-alt-delor

@ Richard ใช่ทุกจะมองเห็นเป็น/path/to/foo ~/.avfs/path/to/foo
Gilles 'ดังนั้นหยุดความชั่วร้าย'

avfsนี้อาจได้รับการแก้ไขได้ง่ายขึ้นใน หากมันแสดง#รายการไดเรกทอรีเริ่มต้นสำหรับไฟล์ใด ๆ ที่ตรงกับสตริงที่รองรับหรือแม้กระทั่งการทดสอบมายากลไฟล์ในไดเรกทอรีสำหรับสิ่งที่จำเป็นต้องมี#รายการแล้วเสร็จก็จะทำงาน ฉันเดาว่าจะมีผลงานบางอย่างที่เหมือนกับfindตอนนี้มันจะสืบค้นผ่านไฟล์ที่ถูกบีบอัด
Matt

คำตอบ:


1

คำตอบปลอมดูเหมือนไม่เพียงพอสำหรับคำถามปลอมนี้ การสนับสนุน zsh builtin สำหรับไดเร็กทอรี automount ดำเนินการกับไดเร็กทอรี ( fake-files dir:names) และไม่ได้อยู่ในรูปแบบไฟล์ในนั้น นี้จะมีประโยชน์ในการเพิ่มไฟล์ชื่อที่เฉพาะเจาะจงไปยังไดเรกทอรีซึ่งอาจจะเหมาะautomountหรือsshfsหรือเน็ตแอพประเภทการตั้งค่าที่ไดเรกทอรีเพื่อจะติดตั้งเป็นที่รู้จักกันในชื่อแบบคงที่.snapshotALAS

autoload -U compinit
compinit
zstyle ':completion:*' fake-files $HOME/.avfs:'ALAS POOR YORICK'

zshall(1)กล่าวว่า "ชื่อ" เป็นสตริงและการทดลองบ่งชี้ว่าตัวอักษร (เช่น#หรือ\#หรือ'*(e:"echo hi":)') "ไม่ทำงาน" ในรูปแบบต่างๆดังนั้นจึงไม่มีวิธีที่ฉันรู้ว่าจะแอบดูกลมลงบนส่วนชื่อของfake-filesคำสั่ง (Delving ผ่านSrc/Zle/computil.cอาจเผยให้เห็นว่าสิ่งที่ชื่อจะเป็นไปได้ แต่ที่จะทำงานมากขึ้น.) (นอกจากนี้การใช้ globs recursive ในตำแหน่งไดเรกทอรีที่จะตั้งชื่อไฟล์ที่เก็บไม่ได้บินอีกครั้ง แต่มันจะใช้เวลาดำน้ำ C เพื่อดูว่ามากfake-filesช่วยให้ คุณไปด้วย)

ด้วยcompdefหนึ่งสามารถแสดงรายการ.avfsไดเรกทอรีสำเร็จ:

compdef '_files -g $HOME/.avfs/\*' -p \^
function andthehash {
  reply=($REPLY $REPLY\#)
}
compdef "_files -g $HOME/.avfs/'*(+andthehash)'" -p \^

ยกเว้นสิ่งนี้จะล้มเหลวเนื่องจากจะแสดงเฉพาะ#ไฟล์เมื่อมันไม่สำคัญและทำให้ไม่สามารถดำเนินการกับไฟล์เหล่านั้นได้ (มีประโยชน์การใช้งานสำหรับแบบฟอร์มนี้ แต่ไม่ใช่สำหรับกรณีนี้)

การใช้zstyleทำให้คุณใกล้ชิดยิ่งขึ้นด้วยสิ่งต่อไปนี้.zshrc:

autoload -U compinit
compinit

function UnderAVFS {
  local pdir
  [[ -z $1 ]] && return 1
  pdir=$1:a
  [[ ! -d $pdir ]] && pdir=$pdir:h
  [[ ! -d $pdir || $pdir == . ]] && return 1
  while [[ $pdir != / ]]; do
    [[ $pdir == $HOME/.avfs ]] && return 0
    pdir=$pdir:h
  done
  return 1
}

function AVFSExtras {
  if UnderAVFS $REPLY; then
    reply=($REPLY)
    # TODO embiggen list of archive suffixes
    [[ $REPLY == *.(bz2|tbz2) ]] && reply+=($REPLY\#)
  fi
}

# Try to match avfs, otherwise the default pattern. Probably could greatly
# benefit from caching, to avoid hits on UnderAVFS function.
zstyle ':completion:*' file-patterns '*(+AVFSExtras):avfs-files' '%p:all-files'

อย่างไรก็ตามสามารถทำได้จนถึง\#/บิตเท่านั้น (บนเดเบียนบีบ virt ด้วยการตั้งค่า avfs เริ่มต้น) แต่ไม่ได้อยู่ในระบบไฟล์เสมือนสำหรับการเก็บถาวรดังนั้นงานเพิ่มเติมจะต้องแท็บเสร็จสมบูรณ์ในคลัง ฉันคาดเดาผ่าน_call_program ... lsหรือบางสิ่งบางอย่างตามเส้นเหล่านั้นสำหรับความสำเร็จที่\#บิตเว้นแต่มีวิธีที่สง่างามมากขึ้นzshในการเชื่อว่าไดเรกทอรีที่ไม่มีอยู่ทำ

ข่าวร้าย! ความสมบูรณ์ไม่ได้ทำให้ผ่าน_path_filesสำหรับไดเรกทอรีปลอม ฉันสงสัยว่านี่คือ zsh globbing ที่เกี่ยวข้อง ทั้ง zsh 4.something on และ zsh 5.0.8 แสดงปัญหา ดังนั้นฉันสงสัยว่าการแก้ไขที่สมบูรณ์จะต้องมีการแก้ไข_path_filesหรือเขียนสิ่งที่แตกต่างที่สมบูรณ์บน dirs ปลอมเหล่านี้ การติดตามการแก้ไขข้อบกพร่องเสร็จสมบูรณ์สามารถสร้างขึ้นได้โดยการพิมพ์ls /root/.avfs/root/sometar.gz\#/จากนั้นในตอนท้ายของการพิมพ์control-xนั้นและจากนั้น?สมมติว่าbindkey -eและที่_complete_debugถูกผูกไว้กับ keycombo ดังกล่าวถ้ามีคนต้องการที่จะตรวจสอบว่าทำไมถึงล้มเหลว


0

ใน zsh คุณสามารถใช้compctl -Kเพื่อลงทะเบียนฟังก์ชั่นของคุณเองเพื่อสร้างตัวเลือกการเติมให้สมบูรณ์ ตัวอย่างเช่น:

compctl -f -c -u -r -K myAVFScompletion "*" -tn

จากนั้นคุณต้องกำหนดฟังก์ชั่นของคุณเอง:

myAVFScompletion () {
    read -c COMMAND ARGS

    # Decide what paths you want to suggest completion for
    # by looking inside the ~/.avfs folder.

    # Place your suggestions into an array:
    reply=( a_path b_path ... )
}

เห็นได้ชัดว่าข้างต้นต้องใช้งานเพิ่มเติม แต่ก็เป็นสิ่งที่ต้องเริ่มต้นด้วย

ฟังก์ชันการเติมเต็มที่กำหนดเองที่คล้ายกัน (แต่แตกต่างกัน) สามารถลงทะเบียนเพื่อทุบตี

นี่คือตัวอย่างกับการใช้งานสำหรับการทุบตีและ zsh (มันนำเสนอตัวเลือกบรรทัดคำสั่งให้เสร็จโดยดึงตัวเลือกออกจากหน้าคำสั่ง)

และนี่คือการคาดเดาอย่างรวดเร็วเกี่ยวกับสิ่งต่าง ๆ ที่อาจจะทำงานในฟังก์ชั่นการเติมเต็มของคุณ:

if [[ -d "$ARGS#" ]]
then reply=( "$ARGS#" )
else reply=
fi

หรือบางทีนี่:

reply=( $(find ~/.avfs -type f -name "*.tgz" -or -name "*.zip" | sed 's+$+#+') )

โชคดี!


ฉันรู้วิธีการเขียนฟังก์ชั่นเสร็จสมบูรณ์ขอบคุณมาก ปัญหาคือวิธีการแก้ไขกลไกความสมบูรณ์ที่มีอยู่สำหรับไฟล์ โปรดทราบว่าฉันใช้กลไกการทำให้เสร็จสมบูรณ์“ ใหม่” ไม่ใช่compctlฉันต้องการเปลี่ยนสิ่งที่_filesทำ คำตอบของคุณไม่เป็นประโยชน์เลย
Gilles 'หยุดความชั่วร้าย'

@Gilles ไม่ให้เริ่มสงครามไฟและมีความเสี่ยงที่จะผิดพลาดอย่างน้อยเขาก็ลอง ... สิ่งนี้นั่งอยู่ในห้องใต้หลังคาที่ไม่มีคำตอบ 2 ปีบวก ... +1 ตั้งค่าใหม่เป็น 0 .
eyoung100

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