ความคิดเห็นในบรรทัดคำสั่ง Zsh


115

ฉันเพิ่งเปลี่ยนจาก Bash เป็น Zsh บน Ubuntu และฉันค่อนข้างพอใจกับมัน อย่างไรก็ตามมีบางอย่างที่ฉันคิดถึงมากและฉันไม่พบวิธีที่จะบรรลุสิ่งเดียวกัน

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

me@home> #mysuperlongcommand with some arguments
me@home> thecommandIhavetorunfirst #and then: then up up
me@home> #mysuperlongcommand with some arguments #I just need to uncomment it!

แต่นี้สถานการณ์ที่เกิดขึ้นอีกค่อนข้างไม่เป็นเรื่องง่ายที่จะอยู่เช่นเดียวกับzshที่ได้รับ#mysuperlongcommandจะถูกเรียกใช้เป็นเช่นนี้ zsh: command not found: #mysuperlongcommand(และผลในการ:

คำตอบ:


172

เพิ่งเริ่มลองใช้ zsh ฉันก็พบปัญหานี้เช่นกัน คุณสามารถทำได้setopt interactivecommentsเพื่อเปิดใช้งานความคิดเห็นแบบทุบตี


3
นอกจากนี้คุณยังสามารถทำได้set -kหากเป็นการปิดเพียงครั้งเดียว แต่ฉันจะใช้setoptบรรทัดจากคำตอบนี้ใน zshrc
Hamish Downer

12
มีเหตุผลไหมที่ไม่ใช่พฤติกรรมเริ่มต้น
naught101

1
@ naught101 บิตที่ดีที่สุดจำนวนมากของ zsh เป็นค่าเริ่มต้นปิด ไม่รู้ทำไม
zzapper

@ naught101 เพราะเป็นนวัตกรรมใหม่. คืบหน้ามากปรับปรุงมาก
ЯрославРахматуллин

40

ฉันใช้

bindkey "^Q" push-input

จากคู่มือ zsh:

ผลักโครงสร้างหลายบรรทัดปัจจุบันทั้งหมดไปยังกองบัฟเฟอร์และกลับไปที่พรอมต์ระดับบนสุด (PS1) หากโครงสร้างตัวแยกวิเคราะห์ปัจจุบันเป็นเพียงบรรทัดเดียวสิ่งนี้จะเหมือนกับ push-line ครั้งต่อไปที่โปรแกรมแก้ไขเริ่มต้นขึ้นหรือโผล่ขึ้นมาพร้อมกับ get-line โครงสร้างจะโผล่ออกมาจากด้านบนของกองบัฟเฟอร์และโหลดลงในบัฟเฟอร์การแก้ไข

จึงมีลักษณะดังนี้:

> long command
Ctrl+Q => long command disappears to the stack
> forgotten command
long command reappears from stack
> long command

นอกจากนี้หากคุณตั้งค่าINTERACTIVE_COMMENTSตัวเลือก ( setopt INTERACTIVE_COMMENTS) คุณจะสามารถใช้ความคิดเห็นในเชลล์แบบโต้ตอบได้เช่นที่คุณคุ้นเคย


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

2
@Mihnea หากคำสั่งหายไปดูเหมือนว่า push-input กำลังทำงาน ควรปรากฏกลับมาเมื่อคุณเรียกใช้คำสั่งถัดไปหรือเพียงแค่กด Enter มันไม่ทำเหรอ?
Michał Politowski

1
@barbaz สแต็กสามารถจัดการได้ด้วยread -zและprint -zด้วยการเขียนสคริปต์และไฟล์ชั่วคราวที่คุณทำได้ แต่วิดเจ็ต zle ที่กำหนดเองสำหรับการบันทึกบรรทัดคำสั่งลงในไฟล์ temp อาจง่ายกว่าและประวัติการแชร์จะยังคงง่ายกว่า
Michał Politowski

1
ในขณะที่อยู่ในขณะนี้คำตอบที่ได้รับการยอมรับของผู้ถามคำถามคำตอบนี้อยู่ถามของความตั้งใจ เช่น zsh มีวิธีที่ดีกว่าในการบรรลุผลตามที่ตั้งใจไว้และนี่คือมัน
wjv

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ หากคุณใช้ oh-my-zsh คุณสามารถใช้ Ctrl-Q สำหรับสิ่งนี้ได้ทันที
ตุ๊กแก

18

ฉันพบว่าตัวเองทำแบบนี้บ่อยเช่นกัน สิ่งที่ฉันทำคือตัดคำสั่งยาวเรียกใช้คำสั่งที่ต้องไปก่อนแล้ววางคำสั่ง long กลับเข้าไปสิ่งนี้ทำได้ง่าย: CTRL + Uตัดคำสั่งปัจจุบันลงในบัฟเฟอร์CTRL + Yวางมัน ทำงานใน zsh และ bash


ที่จริงวิธีของฉันเป็นวิธีแก้ปัญหาในขณะที่วิธีแก้ปัญหาของคุณเหมาะสมที่สุด;)
Rolf

4
นี่ไม่ควรเป็นคำตอบที่ยอมรับได้ วิธีแก้ปัญหาด้านล่างซึ่งระบุว่าใช้ "setopt interactivecomments" ควรเป็น เหตุผลก็คือถ้าคุณเพิ่งตัดคำสั่งปัจจุบันคำสั่งนั้นจะไม่อยู่ในประวัติ zsh ของคุณและคุณไม่สามารถใช้ตัดและวางได้อย่างง่ายดายในขณะที่พิมพ์คำสั่งใหม่ของคุณโดยไม่ต้องเขียนทับคำสั่งที่คุณพยายาม บันทึก
Douglas

1
การใช้ความคิดเห็นและวิธีแก้ปัญหาในคำตอบนี้เป็นวิธีแก้ปัญหา วิธีการป้อนข้อมูลแบบพุชที่โพสต์โดยMichał Politowski นั้นถูกต้องกว่า
Fredrik Möllerstrand

0

นอกจากที่setopt interactivecommentsแนะนำโดย @Lajnold คุณอาจต้องการเพิ่มสิ่งต่อไปนี้เพื่อป้องกันไม่ให้ความคิดเห็นบางอย่างถูกเขียนลงในประวัติ (จาก/superuser/352788/how-to-prevent-a- command-in-the-zshell-from-being-บันทึกลงในประวัติศาสตร์ ):

สิ่งนี้จะแทนที่ฟังก์ชัน ZSH ในตัว zshaddhistory ():

  • จะบันทึกความคิดเห็นที่เริ่มต้นในคอลัมน์ 1 โดยไม่ตามด้วยช่องว่างอย่างน้อยหนึ่งช่อง (เช่น #somecommand ที่ฉันต้องการกลับมา)
  • จะไม่บันทึกความคิดเห็นที่ขึ้นต้นในคอลัมน์ 1 ตามด้วยช่องว่างอย่างน้อยหนึ่งช่อง
  • จะไม่บันทึกความคิดเห็นที่เยื้องโดยเว้นวรรคจากคอลัมน์ 1
  • จะไม่บันทึกคำสั่งด้วยช่องว่างในคอลัมน์ 1 (ทางลัดที่สะดวกสำหรับการเรียกใช้คำสั่งที่คุณไม่ต้องการบันทึก
setopt interactivecomments

function zshaddhistory() {
  emulate -L zsh
  if ! [[ "$1" =~ "(^#\s+|^\s+#|^ )" ]] ; then
      print -sr -- "${1%%$'\n'}"
      fc -p
  else
      return 1
  fi
}

สำหรับการอ้างอิงนี่คือค่าเริ่มต้น zshaddhistory () http://zsh.sourceforge.net/Doc/Release/Functions.html

zshaddhistory() {
  print -sr -- ${1%%$'\n'}
  fc -p .zsh_local_history
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.