“ ^ [[O” และ“ ^ [[I] ปรากฏบน iTerm2 เมื่อโฟกัสหายไป


23

ฉันใช้ iTerm2 2.1.1 ใน Yosemite ไม่มี tmux

เมื่อ iTerm เสียโฟกัส (เมื่อเปลี่ยนไปใช้แอปพลิเคชันอื่นโดย Cmd-Tab หรือคลิกที่หน้าต่างอื่น) a ^[[Iและ^[[Oดูเหมือนว่าจะถูกส่งไปยังเทอร์มินัล ซึ่งทำให้ a ^[[I^[[Oปรากฏขึ้นหรือน่าผิดหวังในชุดการรวมกันนี้เปิดบัฟเฟอร์ขนาดเล็กอื่น

ตัวอย่าง: กด Cmd-Tab หลายครั้งหลังจากเริ่มต้น cat

% cat
^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I

สิ่งนี้จะเกิดขึ้นกับ iTerm เท่านั้นไม่ใช่ใน Terminal.app นอกจากนี้มันยังสร้างภาพบน bash หรือ sh ดังนั้นจึงดูเหมือนจะไม่เป็นปัญหา zsh Googling บางคนแนะนำว่านี่เป็นปัญหา "โฟกัส" แต่ "โฟกัส" ในความหมายของเทอร์มินัลคืออะไรและมีวิธีใดในการปิดใช้งานหรือหลีกเลี่ยงปัญหานี้


ดูเหมือนว่าจะทำซ้ำเมื่อฉันเขียนภาษาญี่ปุ่น (เป็นกลุ่ม) แต่ฉันก็ยังไม่แน่ใจว่าการกระทำคือสาเหตุ ...
osyoyu

คำตอบ:


25

ตามนี้ :

เพิ่มการสนับสนุนสำหรับการรายงานโฟกัสหาย / ได้รับ esc [? 1004h เปิดอยู่; จากนั้นเทอร์มินัลส่ง esc [I เมื่อโฟกัส, esc [O เมื่อ de-focus ส่ง esc [? 1004l เพื่อปิดการใช้งาน

Cmd- Rเพื่อรีเซ็ตจะปิดการรายงานโฟกัส (ด้วยสิ่งนี้ )


1
Cmd-Rเป็นลำดับเวทย์มนตร์สำหรับฉัน
bruceg

มีประโยชน์มากขอบคุณ ฉันใช้เวลานานมากในการค้นหาดังนั้น SEO นี้ของ Google: mac iterm iterm2 แสดงเนื้อหาของคลิปบอร์ด vim ex buffer focus
bsb

11

ฉันไม่มี Mac ที่มีประโยชน์ในการทดสอบคำตอบนี้ แต่ฉันพบปัญหานี้ใน XTerm ภายใต้ Linux เป็นครั้งคราวและ (สมมติว่า iTerm2 เคารพรหัสควบคุมเดียวกัน) คุณอาจพบว่าการแก้ไขด้านล่างมีประโยชน์

เรียกใช้คำสั่งเชลล์ต่อไปนี้ภายในเทอร์มินัลที่คุณเห็นปัญหา:

printf "\e[?1004l"

(โปรดทราบว่าอักขระตัวสุดท้ายมีตัวพิมพ์เล็ก 'ell')

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


บน Linux ฉันสามารถสาธิตการควบคุมลำดับนี้โดยใช้ขั้นตอนต่อไปนี้:

  • เรียกใช้xtermและเปิดใช้งานคุณลักษณะโดยการทำงานprintf "\e[?1004h"ในนั้น
  • เรียกใช้xeyesหรือแอปพลิเคชัน GUI อื่น ๆจาก XTerm เดียวกันนั้น (ด้วยเหตุผลบางอย่างเอฟเฟกต์นี้จะไม่เกิดขึ้นกับฉันจนกว่า XTerm ที่เป็นปัญหาจะเปิดแอปพลิเคชั่นใครรู้ว่าทำไม?)
  • สลับโฟกัสเข้าและออกจาก XTerm ดั้งเดิมซ้ำ ๆ (เช่นโดยคลิกที่หน้าต่าง) และดู^[[Oและ^[[Iพิมพ์ "" ลงใน XTerm ดั้งเดิม
  • ตอนนี้ปิด Xeyes กลับไปที่ XTerm ดั้งเดิมแล้วเรียกใช้printf "\e[?1004l"(เพื่อปิดใช้งานคุณลักษณะดังที่อธิบายไว้ในการแก้ไขด้านบน)
  • ทำซ้ำขั้นตอน" เรียกใช้xeyesสลับโฟกัส " ด้านบน แต่คราวนี้จะไม่เห็นอักขระที่ถูกป้อนในเทอร์มินัล

ฉันเห็นปัญหานี้เป็นการส่วนตัวหากฉันทิ้งไบนารีเอาต์พุตไปยังเทอร์มินัลโดยไม่ได้ตั้งใจ แต่หากคุณพบบ่อยขึ้นคุณอาจต้องการเพิ่มprintfเข้าไปในสคริปต์เริ่มทำงานแบบโต้ตอบของเชลล์ (เช่น~/.bashrc) ดูเหมือนว่าจะไม่เป็นอันตราย (ภายใต้ XTerm อย่างน้อย) ในการส่งรหัสควบคุมหากปิดใช้งานคุณลักษณะนี้อยู่แล้วดังนั้นจึงควรปลอดภัยแม้ว่าคุณจะเห็นปัญหานี้บางครั้งเท่านั้น

หากคุณกังวลเกี่ยวกับเปลือกของคุณมักจะสร้างผลลัพธ์นั้นอาจเป็นเพราะบางครั้งคุณใช้มันในสถานที่ที่ไม่จัดการรหัสควบคุมเหล่านั้นได้ดีหรือหากบางครั้งปัญหาเกิดขึ้นหลังจากเชลล์เริ่มทำงานคุณอาจต้องการตั้งค่า ตั้งชื่อแทน (เช่นด้วยalias focusfix='printf "\e[?1004l"') เพื่อให้เรียกใช้ด้วยตนเองได้สะดวกยิ่งขึ้น


ฉันใช้ Manjaro linux, Gnome, terminator และ oh-my-zsh ปัญหานี้เกิดขึ้นกับฉันและคำตอบนี้ช่วยได้มาก
Fabio Montefuscolo

2

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

จากคำอธิบาย (ดูที่ตัวบ่งชี้บานหน้าต่างปัจจุบันของ Tmux เมื่อโฟกัสกลับคืนมา ) ปรากฏว่า iTerm2 ใช้xtermคุณสมบัตินี้:

FocusIn / FocusOut

FocusIn / FocusOut สามารถใช้ร่วมกับเหตุการณ์เมาส์ใด ๆ เนื่องจากใช้โปรโตคอลที่แตกต่างกัน เมื่อตั้งค่าจะทำให้ xterm ส่ง CSI I เมื่อเทอร์มินัลได้รับโฟกัสและ CSI O เมื่อสูญเสียโฟกัส

มันเปิดใช้งานโดยโหมดส่วนตัว 1004 (เพิ่มลงใน xterm ในปี 2007 แพทช์ # 224 ):

CSI ? Pm h
      DEC Private Mode Set (DECSET).
           Ps = 1 0 0 4  -> Send FocusIn/FocusOut events. 

และอาจเกี่ยวข้องกับแพทช์นี้: Vim - เพิ่มการรองรับโหมดโฟกัสการรายงาน (DECSET / DECRST 1004) ทำงานบนเทอร์มินัลที่ใช้งานร่วมกับ xtermซึ่งเท่ากับพฤติกรรมทั้งหมดของคุณสมบัติเมาส์ "xterm" ในการตั้งค่าเดียว:

/ * การรายงานการโฟกัสได้รับการสนับสนุนโดยเทอร์มินัลที่รองรับ xterm และ tmux * /

ดังนั้น ... คุณสามารถปิดการใช้งานว่าด้วยการบอกว่าเป็นกลุ่ม terminal ของคุณไม่ได้ใช้โปรโตคอล xterm เมาส์ แพตช์ที่ถูกอ้างถึงจะบอกให้ vim เปิดฟีเจอร์ FocusIn / FocusOut (ซึ่งปกติควรปิด) และหากมีข้อบกพร่องในตรรกะของมัน

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


ขอบคุณสำหรับคำตอบโดยละเอียดของคุณ การบอกเป็นกลุ่มเพื่อเพิกเฉย\e\[Oและ\e\[Iแก้ไขปัญหานี้ใน Vim แต่ไม่ใช่ในแอปพลิเคชันอื่นเช่น cat หรือในrails server(อาจเป็นโปรแกรมที่ใช้ readline?)
osyoyu

ดังนั้น ... ใครก็ตามสามารถบอกได้ว่า "บอกให้ Vim เพิกเฉย \ e [O และ \ e [I" ได้อย่างไร?
Libin Wen

0

เพื่อแก้ปัญหานี้คุณต้องรู้ว่าโปรแกรมใดที่เปิดใช้งานโหมดการรายงานโฟกัส คุณควรจดบันทึกที่บันทึกโดยคำสั่งscript (1)


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

-2

ฉันพบคำถามนี้โดยพยายามที่จะแก้ปัญหาเทอร์มินัลของฉันแสดง "^ @" เมื่อโฟกัสหายไป

เมื่ออ่านถึงคำตอบฉันลองไปที่การตั้งค่า iTerm2 -> โปรไฟล์ -> "ค่าเริ่มต้น" -> เซสชั่นและยกเลิกการเลือก: "เมื่อไม่ได้ใช้งานให้ส่งรหัส ASCII 0 ทุก 60 วินาที"

แก้ไขปัญหาได้แล้วหวังว่าจะช่วยใครซักคน

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