แยกค้นหาลูกศรขึ้นสำหรับประวัติ ZSH ในพื้นที่และทั่วโลก


25

เป็นไปได้ที่จะ ...

  • เพิ่มประวัติเชลล์ ZSH ในพื้นที่ (การกระทำเกิดขึ้นในพรอมต์นั้นเท่านั้น)

  • เพิ่มระดับประวัติ ZSH ทั่วโลก (เปิดใช้งานประวัติที่แชร์) - เริ่มต้นสิ่งที่เกิดขึ้นเมื่อคุณกดลูกศรขึ้นเมื่อเปิดใช้งานประวัติที่แชร์

... แยกจากกัน

ตัวอย่างหนึ่งอาจผูก CTRL + ขึ้นสำหรับประวัติศาสตร์โลกปกติสำหรับประวัติศาสตร์ท้องถิ่น ในขณะเดียวกันก็เหมาะสมที่จะใช้ประวัติศาสตร์โลกสำหรับการค้นหาประวัติย้อนหลัง (เช่นCTRL+ R)

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

คำตอบ:


25

คัดลอกและวางสิ่งนี้ลงใน.zshrc:

เคอร์เซอร์กำลังใช้ประวัติท้องถิ่น:

bindkey "${key[Up]}" up-line-or-local-history
bindkey "${key[Down]}" down-line-or-local-history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

หากคุณต้องการการเชื่อมโยงคีย์ ( CTRL+ เคอร์เซอร์) เพื่อก้าวผ่านประวัติศาสตร์โลกไปเพิ่มสิ่งนี้ใน.zshrc:

bindkey "^[[1;5A" up-line-or-history    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-history  # [CTRL] + Cursor down

ในการทำให้ตัวเลือกนี้ทำงานต้องมีการเปิดใช้งานตัวเลือก SHARE_HISTORY (ดู16.2.4 ประวัติ ) เรียกใช้setoptและตรวจสอบว่ามีรายการ "sharehistory" อยู่หรือไม่ ถ้าไม่ได้เพิ่มที่คุณsetopt sharehistory .zshrcจากนั้นหนึ่งสามารถใช้ประวัติศาสตร์ท้องถิ่นตั้งค่าตามที่เราทำข้างต้น documenation พูดว่า:

ตามค่าเริ่มต้นคำสั่งการเคลื่อนย้ายประวัติจะไปที่บรรทัดที่นำเข้ารวมถึงบรรทัดท้องถิ่น แต่คุณสามารถสลับเปิดและปิดได้ด้วยการเชื่อมโยง zle ชุดประวัติโลคอล นอกจากนี้ยังเป็นไปได้ที่จะสร้างวิดเจ็ต zle ที่จะทำให้บางคำสั่งละเว้นคำสั่งที่นำเข้าและบางคำสั่งรวมถึง

โปรดทราบว่าตามค่าเริ่มต้นจะใช้ประวัติทั่วโลก (และฟังก์ชั่นทั้งหมดลงท้ายด้วย "zle set-local-history 0" นั่นคือปิดใช้งานประวัติท้องถิ่น) ดังนั้นการกดCTRL+ Rจะค้นหาประวัติทั่วโลกตามค่าเริ่มต้น (ซึ่งส่วนใหญ่แล้วจะสมเหตุสมผล)

สิ่งนี้ค่อนข้างคล้ายกับโซลูชันโดย @mpy แต่พร้อมสำหรับการคัดลอกและวาง มันเขียนทับเคอร์เซอร์คีย์ขึ้นและลง ฉันใช้รายการจดหมายนี้

ดูสิ่งนี้ด้วย:


1
ใน zsh 5.0.2 ฉันได้รับข้อผิดพลาดที่ไม่สามารถผูกกับลำดับคีย์ว่างได้ แม้ว่าฉันจะแทนที่ด้วยปุ่มจากคำตอบอื่นด้านล่างทั้งขึ้น / ลงและ Ctrl + ขึ้น / ลงเพียงผ่านประวัติศาสตร์โลก ฉันทำอะไรผิดที่นี่?
rjh

1
@rjh: ลองนี้: ${key[Up]}ในการแก้ไขเช่นกลุ่มการลบ จากนั้น (ในโหมดแก้ไข) ให้พิมพ์ Ctrl + V แล้วตามด้วยลูกศรขึ้น สิ่งนี้ควรแทรกรหัสคีย์ที่ถูกต้อง ทำเช่นเดียวกันสำหรับลูกศรลง
robinst

ฉันใช้วิธีนี้และใช้งานได้ แต่ฉันสูญเสียความสามารถในการค้นหาประวัติด้วยการเขียนส่วนเริ่มต้นของคำสั่งจากนั้นลูกศรขึ้น Ctrl+Rมันจะไปผ่านคำสั่งทั้งหมดเช่นทุบตีดังนั้นผมจึงต้องทำงานรอบการใช้
Melebius

5

คุณสามารถตั้งค่าวิดเจ็ต zle พิเศษเพื่อแสดงเฉพาะรายการประวัติท้องถิ่น:

function only-local-history () {
        zle set-local-history 1
        zle up-history
        zle set-local-history 0
}
zle -N only-local-history

สมมติว่าถูกผูกไว้กับup-line-or-history(ฉันคิดว่าเป็นค่าเริ่มต้น) คุณสามารถผูกวิดเจ็ตนี้กับจังหวะคีย์อื่นเช่นCTRL+ :

 bindkey "^[Oa" only-local-history

หากการทำงานนี้อาจขึ้นอยู่กับสถานีของคุณ URxvt/Screenผลงานดังกล่าวข้างต้นในบรรทัด ด้วยxtermคุณจะต้อง

 bindkey "^[[1;5A" only-local-history

สำหรับ+CTRL

ตัวแปรอื่นอาจเป็น

function peek-history () {
        zle set-local-history
        zle up-history
        zle set-local-history
}
zle -N peek-history

ดังนั้นหากคุณเปิดใช้งานประวัติท้องถิ่นคุณสามารถดูข้อมูลระดับโลกหรือในทางกลับกัน


4

คำตอบของ @ lumbic ใช้ได้กับฉันเมื่อมีการเปลี่ยนแปลงเพียงเล็กน้อย:

setopt share_history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey '^[OA' up-line-or-history     # Cursor up
bindkey '^[OB' down-line-or-history   # Cursor down
bindkey '^[[1;5A' up-line-or-local-history    # [CTRL] + Cursor up
bindkey '^[[1;5B' down-line-or-local-history  # [CTRL] + Cursor down

รหัสนี้ทำให้ประวัติทั่วโลกเป็นค่าเริ่มต้นและใช้ CTRL-arrow สำหรับประวัติท้องถิ่น

หมายเหตุ: ฉันใช้ zsh 5.0.2 พร้อมด้วย oh-my-zsh


ดูเหมือนว่าตรงข้ามกับที่ OP ร้องขอ - Ctrl+arrowsสำหรับประวัติท้องถิ่น
Melebius

1

ฉันลองตัวเลือกต่าง ๆ ที่ระบุไว้ในคำตอบอื่น ๆ ที่นี่ แต่ฉันไม่พอใจพวกเขา วิดเจ็ต1 up-historyหรือup-line-or-historyไม่รวมการค้นหาเริ่มต้นและวิดเจ็ต1 up-line-or-beginning-searchดูเหมือนว่าจะทำงานได้ไม่ดีเมื่อเปลี่ยนการตั้งค่าประวัติท้องถิ่นขณะใช้งาน 2

ดังนั้นฉันมาถึงการตั้งค่าต่อไปนี้ มันช่วยให้Ctrl+ ลูกศรเพื่อเรียกดูประวัติศาสตร์โลกAlt+ ลูกศรเพื่อเรียกดูประวัติท้องถิ่นเท่านั้น (คล้ายกับ Bash) และลูกศรแบบสแตนด์อโลนเพื่อใช้การค้นหาเริ่มต้นที่ชาญฉลาด (ค่าเริ่มต้นในOh My Zsh )

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-search
    zle set-local-history 0
}
zle -N up-line-or-local-history

down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-search
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey "${key[Up]}" up-line-or-beginning-search
bindkey "${key[Down]}" down-line-or-beginning-search
bindkey "^[[1;5A" up-line-or-search    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-search  # [CTRL] + Cursor down
bindkey "^[[1;3A" up-line-or-local-history    # [ALT] + Cursor up
bindkey "^[[1;3B" down-line-or-local-history  # [ALT] + Cursor up

1downคู่ของพวกเขามีความหมายโดยนัยเช่นกัน

2จุดเริ่มต้นที่ใช้ในการค้นหาจะถูกนิยามใหม่หลังจากเปลี่ยนแปลงการกำหนดค่าตามความชอบประวัติท้องถิ่นดังนั้นคำสั่งที่พบครั้งแรกทั้งหมดจะถูกใช้เป็นจุดเริ่มต้นที่จะค้นหาในการค้นหาครั้งที่สอง


1

จากคำตอบต่าง ๆ ที่นี่ฉันสามารถสร้างเวอร์ชันที่มีเงื่อนไข:

function up-line-or-history() {
    zle set-local-history 1
    zle .up-line-or-history
    zle set-local-history 0
}

function down-line-or-history() {
    zle set-local-history 1
    zle .down-line-or-history
    zle set-local-history 0
}

# Overwrite existing {up,down}-line-or-history widgets with the functions above.
zle -N up-line-or-history
zle -N down-line-or-history

เวอร์ชันนี้จะเขียนทับวิดเจ็ตที่มีอยู่up-line-or-historyและdown-line-or-historyวิดเจ็ตใหม่ที่ผู้ใช้กำหนดเอง วิดเจ็ตนี้เปิดใช้งานประวัติโลคัลและจากนั้นจะเรียกใช้วิดเจ็ตดั้งเดิมซึ่งมีอยู่ภายใต้.ชื่อ -prefixed ดูเอกสารประกอบวิดเจ็ต zleสำหรับรายละเอียด

นี่หมายความว่าคุณได้รับการเก็บรักษาการผูกคีย์ที่มีอยู่ ดังนั้นคุณสามารถหลีกเลี่ยงการคิดออกว่าลำดับการหลบหนีคืออะไรสำหรับการพิมพ์ลูกศรขึ้นใน terminal ปัจจุบันของคุณ


-1
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down

คำตอบข้างต้นใช้ได้สำหรับฉัน

การอ้างอิง: https://coderwall.com/p/jpj_6q/zsh-better-history-searching-with-arrow-keys


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