มีวิธีใดที่จะทำให้พรอมต์และเอาต์พุตก่อนหน้าไม่สามารถแก้ไขได้ในโหมด shell / term?


9

นี่เป็นคำถามที่ตื้นมาก

แม้ว่าการansi-termเริ่มต้นทำงานได้อย่างถูกต้องเมื่อฉันเปิดมันครั้งแรกดูเหมือนว่าจะลดลงในโหมด 'แก้ไขได้' หลังจากคำสั่งไม่กี่คำเช่นเมื่อฉันC-a(เริ่มต้นบรรทัด) ตามด้วยC-k(เส้นฆ่า) มันจะลบล้างข้อความแจ้งทั้งหมด

สำหรับสติที่สวยงามของฉันมีวิธีใดที่จะทำให้ข้อความแจ้งเตือนและผลลัพธ์ก่อนหน้านี้ไม่สามารถแก้ไขได้ (สำหรับshell) (อัปเดตเพื่อยกเว้นคำศัพท์ที่ระบุความแตกต่างที่มีความหมาย)

ฉันใช้ zsh ใน Emacs 24.4; ระบบปฏิบัติการคือ LXDE (Ubuntu 14.04) ผ่าน Virtual Box

(เป็นการดีที่ฉันยังคงสามารถเลื่อนเคอร์เซอร์ของฉันไปรอบ ๆ ... )


1
คุณใช้ระบบปฏิบัติการ "แปลก" โดยบังเอิญหรือไม่? โดยปกติในโหมดเชลล์ Ca จะข้ามไปยังจุดเริ่มต้นของ commandline หลังจากพรอมต์และจำเป็นต้องใช้ Ca ตัวที่สองเพื่อข้ามไปยังจุดเริ่มต้น ใน Windows และ Solaris (ในอดีต) ฉันมักจะพบว่า Ca เพิ่มขึ้นถึงจุดเริ่มต้น wheras บน MacOS, Linux และอื่น ๆ มันทำงานได้ตามที่คาดไว้สำหรับฉัน
Mark Aufflick

@ Mark A: ฉันได้อัปเดตโพสต์ดั้งเดิมเพื่อให้มีรายละเอียดเพิ่มเติมรวมถึงการตั้งค่าปัจจุบันของฉัน
iceman

อธิบายพฤติกรรมของเสียง ANSI C-c C-jระยะเช่นคุณเปลี่ยนเป็นโหมดบรรทัดโดยเริ่มต้นที่แปลกหรือ C-c C-kลองหาว่าเริ่มต้นหรือสลับไปที่โหมดถ่านด้วย
wasamasa

1
เนื่องจากshell-mode/ term-modeตามลำดับไม่ได้มาจากcomint-modeคุณถามคำถามสองข้อที่แตกต่างกันมากในเวลาเดียวกันที่นี่ จะแยกคำถามนี้ออกเป็นสองคำถามไหม?
purple_arrows

คำตอบ:


16

โหมดcomint -ivedived (like shell,, ielm... ) รองรับฟังก์ชั่นตัวกรองข้อมูลโค้ดต่อไปนี้ทำให้เอาต์พุตและพร้อมต์อ่านอย่างเดียว:

(setq comint-prompt-read-only t)

(defun my-comint-preoutput-turn-buffer-read-only (text)
  (propertize text 'read-only t))

(add-hook 'comint-preoutput-filter-functions 'my-comint-preoutput-turn-buffer-read-only)

สำหรับansi-term(ซึ่งไม่ได้มาจากcomint ) มันมีสองโหมดของการดำเนินการchar modeซึ่งยังคงเป็นความจริงกับการผูกของเชลล์และซอฟต์แวร์ที่ทำงานอยู่ในมันเป็นไปได้และline modeที่ช่วยให้คุณสามารถแก้ไขบัฟเฟอร์ตามที่คุณต้องการ โดยทั่วไปคุณควรอยู่ในchar mode(ถูกผูกไว้C-c C-k) และบางครั้งสลับไปที่line mode(ผูกไว้กับC-c C-j) เพื่อแก้ไขเอาต์พุตคำสั่ง


นี่มันสวยจริงๆ แต่หยุดทำงาน… :( ฉันมีวิธีแก้ปัญหาการทำงานที่ใช้โค้ดมากขึ้น→ github.com/michalrus/dotfiles/commit/ …
Michal Rus

Dunno ยังใช้ได้กับฉันในวันที่ 25.2
wasamasa

เป็นไปได้ว่าคุณไม่สามารถลบข้อความนี้ได้ แต่คุณสามารถแทรกใหม่แทรกข้อความที่ไม่เปลี่ยน
Michal Rus

1
ฉันเห็นไม่ได้ทดสอบเฉพาะ
wasamasa

โอ๊ะการเปลี่ยนแปลงอีกอย่างหนึ่งสำหรับทุกคนที่กำลังมองหา ฉันพลาดช่องโหว่มาก่อน อันนี้ใช้ได้ดีกับฉัน github.com/michalrus/dotfiles/blob/…
Michal Rus

2

เมื่อผสมtermกับshell-modeตัวแปรcomint-use-prompt-regexpดูเหมือนว่าจะได้รับการตั้งค่าเป็นครั้งคราว สิ่งนี้ทำให้เกิดพฤติกรรมเล็กน้อยเหมือนที่คุณอธิบาย: ในโหมดเชลล์ C-aจะไปที่จุดเริ่มต้นของบรรทัดC-kจะฆ่าทั้งบรรทัดรวมถึงพรอมต์

การแก้ไขอย่างง่ายคือการรีเซ็ตcomint-use-prompt-regexpด้วยการC-: (setq comint-use-prompt-regexp nil)บังคับให้โหมดเชลล์ใช้คุณสมบัติข้อความที่รับรู้ถึงคีย์การเคลื่อนไหวของเคอร์เซอร์

มีคำอธิบายวิธีการทำงานในคู่มือ GNU Emacs ที่นี่: https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html


1

ลองปรับแต่งตัวแปรที่จะ comint-prompt-read-onlyt

ซึ่งจะส่งผลกระทบต่อshell-modeและคนอื่น ๆ ที่ได้มาจากแต่ไม่comint-modeterm-mode

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