การเก็บประวัติต่อไดเรกทอรีทำงาน (cf. ต่อเซสชันของเชลล์)


11

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

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

คำตอบ:


5

ด้วยzshคุณสามารถทำ:

mkdir -p ~/.zsh/dirhist

และเพิ่มใน ~ / .zshrc ของคุณ:

HISTSIZE=1000
SAVEHIST=10000
setopt HIST_SAVE_NO_DUPS INC_APPEND_HISTORY
HISTFILE=~/.zsh/dirhist/${PWD//\//@}
chpwd() {
  [[ $PWD = $OLDPWD ]] || fc -Pp ~/.zsh/dirhist/${PWD//\//@}
}

chpwd()ถูกเรียกเมื่อใดก็ตามที่ไดเรกทอรีปัจจุบันมีการเปลี่ยนแปลง ที่นั่นเราตั้งค่าแฟ้มประวัติเพื่อสิ่งที่ต้องการ~/.zsh/dirhist/@foo@barเมื่อคุณไปcd/foo/bar


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

10

ไม่ใช่คำตอบที่เรียบร้อย แต่เป็นอีกทางเลือกถ้าคุณใช้bashเป็นเชลล์: คุณสามารถสร้างชื่อแทนในตัวของคุณ.bashrcได้

ตัวอย่างเช่น

alias a='cd /tmp/A ; history -w ; history -c ; export HISTFILE=/home/user/.a_history ; history -r $HISTFILE'
alias b='cd /tmp/B ; history -w ; history -c ; export HISTFILE=/home/user/.b_history ; history -r $HISTFILE'

จากนั้นถ้าคุณพิมพ์a:

  1. คุณจะถูกย้ายในไดเรกทอรีโครงการของคุณ
  2. ประวัติปัจจุบันจะถูกบันทึกไว้ ( history -w)
  3. จากนั้นประวัติที่เก็บไว้ในหน่วยความจำจะถูกรีเซ็ต ( history -c)
  4. ไฟล์ประวัติโครงการจะถูกตั้งค่า/home/user/.a_historyและอ่าน ( history -r)

ฉันรู้ว่าคำถามของฉันได้ละเว้นความต้องการ / ความต้องการขออภัยในรายละเอียดที่ขาดหายไป คือ: ฉันไม่ต้องการจำที่จะใช้นามแฝง / ฟังก์ชั่น; เช่นการกำหนดขอบเขตควรทำงานเป็นส่วนเสริมตามวิธีที่ปกติฉันโต้ตอบกับเชลล์
sohocoke

HISTFILEอย่าส่งออก ไม่มีเหตุผลที่จะส่งออกไปยังโปรแกรมอื่น ๆ และ ~ / .bashrc จะถูกดำเนินการสำหรับกระบวนการทุบตีแบบโต้ตอบทุกครั้งดังนั้นรหัสของคุณสำหรับการตั้งค่าจะถูกเรียกใช้ในทุกการทุบตีอยู่ดี โดยทั่วไปแล้วหากตัวแปรที่กำหนดโดยเชลล์ไม่ได้ถูกส่งออกเป็นค่าเริ่มต้นคุณจะไม่ควรทำการส่งออก
Chris หน้า

1

หากคุณกำลังใช้ ZSH ลองดูที่ปลั๊กอินขนาดเล็กที่ฉันเพิ่งเขียนเพื่อจัดการกับสิ่งนี้:

https://github.com/ericfreese/zsh-cwd-history

มันเก็บแยกต่างหากHISTFILEสำหรับทุกไดเรกทอรีที่คุณดำเนินการคำสั่งและเพิ่มchpwdตะขอเพื่อสลับระหว่างHISTFILEs เมื่อคุณเปลี่ยนไดเรกทอรี

นอกจากนี้ยังมีวิดเจ็ต zle ที่คุณสามารถผูกกับปุ่มกดที่จะสลับHISTFILEระหว่าง "global" ดั้งเดิมHISTFILEและHISTFILEไดเรกทอรีการทำงานปัจจุบันของคุณ

เดิมนั้นใช้ปลั๊กอินต่อประวัติไดเรกทอรีของ Jim Hesterแต่ได้ถูกเขียนขึ้นใหม่ตั้งแต่ต้นจนถึงขั้นต้นเพื่อแก้ไขปัญหาต่างๆของปลั๊กอินดังกล่าว


ลิงก์เฉพาะคำตอบหมดกำลังใจที่นี่โปรดเพิ่มคำอธิบายว่ามันทำงานอย่างไร

0

ฉันเขียนปลั๊กอิน ZSH ซึ่งทำสิ่งที่คุณต้องการ: https://github.com/tymm/zsh-directory-history

ตรงกันข้ามกับโซลูชันอื่น ๆ ปลั๊กอินของฉันย้อนกลับไปยังประวัติศาสตร์โลกโดยอัตโนมัติ ซึ่งหมายความว่าคุณไม่จำเป็นต้องสลับระหว่างประวัติไดเรกทอรีและประวัติทั่วโลก

อย่างไรก็ตามโซลูชันอื่น ๆ นั้นมีน้ำหนักเบากว่าเล็กน้อยฉันคิดว่า

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