Mùi ^ [[O và và ^ ^ [[Tôi xuất hiện trên iTerm2 khi mất tiêu điểm


23

Tôi đang sử dụng iTerm2 2.1.1 trên Yosemite. Không có tmux.

Khi iTerm mất tiêu điểm (khi được chuyển sang ứng dụng khác bằng Cmd-Tab hoặc nhấp vào cửa sổ khác), một ^[[I^[[Odường như được gửi đến thiết bị đầu cuối. Điều này gây ra một sự ^[[I^[[Oxuất hiện, hoặc bực bội hơn, trong Vim, sự kết hợp này mở ra một bộ đệm nhỏ khác.

Ví dụ: Nhấn Cmd-Tab nhiều lần sau khi bắt đầu cat

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

Điều này chỉ xảy ra trên iTerm chứ không phải trên Terminal.app. Ngoài ra, nó sao chép trên bash hoặc sh, vì vậy nó dường như không phải là vấn đề zsh. Một số Googling cho rằng đây là vấn đề của Focus Focus, nhưng phạm vi của Focus Focus là gì theo nghĩa của một thiết bị đầu cuối, và có cách nào để vô hiệu hóa hoặc tránh điều này không?


Điều này dường như tái tạo khi tôi viết tiếng Nhật (bằng Vim), nhưng tôi vẫn không chắc hành động nào là nguyên nhân ...
osyoyu

Câu trả lời:


25

Theo đó :

Thêm hỗ trợ cho báo cáo tập trung bị mất / đạt được. esc [? 1004h bật nó lên; sau đó thiết bị đầu cuối gửi esc [I khi lấy nét, esc [O khi không lấy nét. Gửi esc [? 1004l để tắt.

Cmd- Rđể thiết lập lại sẽ tắt báo cáo tập trung (Nhờ vào điều này )


1
Cmd-Rlà chuỗi ma thuật đối với tôi
bruceg

Rất hữu ích, cảm ơn. Điều này khiến tôi mất nhiều thời gian để tìm kiếm SEO này Google: mac iterm iterm2 hiển thị nội dung clipboard vim ex bộ đệm tập trung
bsb

11

Tôi không có sẵn máy Mac để kiểm tra câu trả lời này, nhưng thỉnh thoảng tôi gặp vấn đề này trong XTerm trong Linux và (giả sử iTerm2 tôn trọng các mã kiểm soát tương tự) bạn có thể thấy cách khắc phục dưới đây hữu ích.

Chạy lệnh shell sau bên trong terminal khi bạn gặp sự cố:

printf "\e[?1004l"

(Lưu ý rằng ký tự cuối cùng có chữ 'ell' viết thường.)

Chuỗi điều khiển ANSI này giống như chuỗi được liệt kê trong câu trả lời của Thomas Dickey, nhưng nó tắt tính năng này (thay vì bật). Nó sẽ giải quyết vấn đề của bạn trong tất cả các ứng dụng, không chỉ Vim, bằng cách ngăn chặn các ký tự xảy ra.


Trên Linux tôi có thể chứng minh chuỗi điều khiển này hoạt động với các bước sau:

  • Chạy xtermvà kích hoạt tính năng bằng cách chạy printf "\e[?1004h"trong nó.
  • Chạy xeyeshoặc một số ứng dụng GUI khác từ cùng đó . (Vì một số lý do, hiệu ứng này không xảy ra với tôi cho đến khi XTerm trong câu hỏi khởi chạy một ứng dụng. Có ai biết tại sao không?)
  • Liên tục chuyển trọng tâm vào và ra khỏi Xterm gốc (ví dụ: bằng cách nhấp vào cửa sổ) và xem ^[[O^[[Iđược "nhập" vào Xterm gốc.
  • Bây giờ hãy đóng Xeyes, quay trở lại Xterm gốc và chạy printf "\e[?1004l"(để tắt tính năng này, như được mô tả trong bản sửa lỗi ở trên).
  • Lặp lại các bước " chạy xeyes, chuyển trọng tâm " ở trên, nhưng lần này không thấy ký tự nào được nhập trong thiết bị đầu cuối.

Cá nhân tôi chỉ thấy vấn đề này nếu tôi vô tình đổ đầu ra nhị phân vào thiết bị đầu cuối, nhưng nếu bạn gặp phải nó thường xuyên hơn, bạn có thể muốn thêm nó printfvào tập lệnh khởi động tương tác của shell (ví dụ ~/.bashrc). Dường như không có bất kỳ tác hại nào (ít nhất là dưới Xterm) khi gửi mã điều khiển nếu tính năng này đã bị vô hiệu hóa, vì vậy nó sẽ an toàn ngay cả khi đôi khi bạn chỉ gặp vấn đề này.

Nếu bạn lo lắng về trình bao của mình luôn tạo ra đầu ra đó, có lẽ vì đôi khi bạn sử dụng nó ở những nơi không xử lý tốt các mã kiểm soát đó hoặc nếu vấn đề đôi khi được kích hoạt sau khi trình bao khởi động, thì bạn có thể muốn đặt lên một bí danh (ví dụ với alias focusfix='printf "\e[?1004l"') để thuận tiện hơn khi chạy thủ công.


Tôi đang chạy Manjaro linux, Gnome, terminator và oh-my-zsh. Vấn đề này đã xảy ra với tôi và câu trả lời này đã giúp rất nhiều.
Fabio Montefuscolo

2

Thuật ngữ "tiêu điểm" dùng để chỉ thiết bị đầu cuối (hoặc cửa sổ) nào hiện đang chấp nhận các sự kiện nhập chuột và bàn phím. Chỉ một người có thể có trọng tâm; có các giao thức để thiết lập làm thế nào để đạt được và mất tập trung trong một môi trường đồ họa mà sẽ không hữu ích để khám phá.

Từ mô tả (xem thêm chỉ báo khung hiện tại Tmux khi lấy lại tiêu điểm ), có vẻ như iTerm2 thực hiện xtermtính năng này:

FocusIn / FocusOut

FocusIn / FocusOut có thể được kết hợp với bất kỳ sự kiện chuột nào vì nó sử dụng một giao thức khác nhau. Khi được đặt, nó khiến xterm gửi CSI I khi thiết bị đầu cuối lấy nét và CSI O khi mất tiêu điểm.

Nó được kích hoạt bởi chế độ riêng tư 1004 (được thêm vào xterm vào năm 2007, bản vá số 224 ):

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

và có thể liên quan đến bản vá này: Vim - Thêm hỗ trợ cho chế độ báo cáo tiêu điểm (DECSET / DECRST 1004) hoạt động trên các thiết bị đầu cuối tương thích xterm , tương đương với tất cả hoạt động của các tính năng chuột "xterm" trong một cài đặt:

/ * báo cáo tập trung được hỗ trợ bởi các thiết bị đầu cuối tương thích xterm và tmux. * /

Vì vậy, ... bạn có thể vô hiệu hóa điều đó bằng cách nói với vim rằng thiết bị đầu cuối của bạn không sử dụng giao thức chuột xterm. Bản vá được trích dẫn yêu cầu vim bật tính năng FocusIn / FocusOut (thường sẽ tắt) và nếu có lỗi nào đó trong logic của nó, có thể để lại tính năng được bật sau khi thoát vim.

Mặc dù vim là nguyên nhân rất có thể của chế độ được bật, nhưng có thể một số chương trình (hoặc tập lệnh) khác bật nó. Như được đề xuất trong một câu trả lời khác, bạn có thể thu hẹp điều đó bằng cách thu thập đầu ra vào thiết bị đầu cuối của bạn bằng scriptchương trình (tạo ra một typescripttệp). Phân tích có thể tốn thời gian (và vì trang web này dường như không hỗ trợ tệp đính kèm , nên có vẻ không phù hợp để thu hút thảo luận chi tiết). Tôi thường sử dụng unmapđể chuyển đổi các tệp bản thảo thành dạng có thể đọc được cho mục đích này.


Cảm ơn câu trả lời chi tiết của bạn. Nói với Vim để bỏ qua \e\[O\e\[Igiải quyết vấn đề này trong Vim, nhưng không phải trong các ứng dụng khác như cat hay in rails server(có thể là các chương trình sử dụng readline?).
osyoyu

Vậy ... có ai có thể nói chính xác "bảo Vim bỏ qua \ e [O và \ e [I" không?
Libin Wen

0

Để giải quyết vấn đề này, bạn phải biết chương trình nào cho phép chế độ báo cáo tập trung. Bạn nên lấy một bản ghi được ghi bởi lệnh script (1) .


Có phải Báo cáo tập trung là một tính năng bị tắt theo mặc định và được bật theo trình tự thoát? Trên thực tế, tôi nhận thấy rằng vấn đề này không xảy ra trên một cửa sổ đầu cuối mới, nhưng tái tạo sau khi làm một cái gì đó , vì vậy tôi sẽ cố gắng xác định nó.
osyoyu

-2

Tôi đã tìm thấy câu hỏi này bằng cách cố gắng giải quyết thiết bị đầu cuối của mình hiển thị "^ @" khi mất tiêu điểm.

Đọc qua các câu trả lời, tôi đã thử chuyển sang tùy chọn iTerm2 -> Cấu hình -> "Mặc định" -> Phiên và bỏ chọn: "Khi rảnh, hãy gửi mã ASCII 0 cứ sau 60 giây"

Vấn đề được giải quyết, hy vọng nó sẽ giúp được ai đó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.