Odak kaybolduğunda iTerm2'de “^ [[O” ve “^ [[I” görünüyor


23

Yosemite üzerinde iTerm2 2.1.1 kullanıyorum. Tmux yok.

İTerm odağı kaybettiğinde (Cmd-Tab tarafından başka bir uygulamaya geçildiğinde veya başka bir pencereye tıklandığında), a ^[[Ive ^[[Oterminale gönderilmiş gibi görünür. Bu ^[[I^[[O, Vim'de a'nın görünmesine veya daha sinir bozucu olmasına neden olur , bu kombinasyon başka bir küçük tampon açar.

Örnek: Başladıktan sonra Cmd-Tab tuşlarına birkaç kez basma cat

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

Bu sadece iTerm'de olur, Terminal.app üzerinde olmaz. Ayrıca, bash veya sh üzerinde çoğalır, bu yüzden bir zsh sorunu gibi görünmüyor. Bazı Google çalışanları bunun bir “odak” sorunu olduğunu öne sürdü, ancak bir terminalin anlamında “odak” nedir ve bunu devre dışı bırakmanın veya önlemenin herhangi bir yolu var mı?


Japonca yazarken (
Vim'de) bu çoğalıyor

Yanıtlar:


25

Göre bu :

Kaybedilen / kazanılan odağı bildirme desteği ekleyin. esc [? 1004h açar; sonra terminal odaklanırken esc [I, odak kaldırıldığında esc [O gönderir. Devre dışı bırakmak için esc [? 1004l gönder.

Cmd- Rsıfırlamak odak raporlamayı kapatır ( Bu sayede )


1
Cmd-Rbenim için sihirli dizi
bruceg

Çok faydalı, teşekkürler. Bu beni bu kadar SEO bulmak için uzun zaman aldı Google: mac iterm iterm2 ekran panosu içeriği vim ex buffer focus
bsb

11

Bu cevabı test etmek için kullanışlı bir Macim yok, ancak Linux'ta XTerm'de bu problemle çok sık karşılaşıyorum ve (iTerm2'nin aynı kontrol kodlarına saygı duyduğu varsayılarak) aşağıdaki düzeltmeyi yararlı bulabilirsiniz.

Sorunu gördüğünüz terminalde aşağıdaki kabuk komutunu çalıştırın:

printf "\e[?1004l"

(Son karakterin küçük harfli 'ell' olduğunu unutmayın.)

Bu ANSI kontrol dizisi, Thomas Dickey'nin cevabında listelenen gibidir, ancak özelliği kapatır (açıktır). Sorununuzu sadece Vim'de değil, tüm uygulamalarda karakterlerin oluşmasını engelleyerek çözmelidir.


Linux'ta bu kontrol dizisini aşağıdaki adımlarla çalıştırabilirim:

  • Run xtermve çalıştırarak özelliği etkinleştirmek printf "\e[?1004h"içinde.
  • Aynı XTerm'den çalıştırın xeyesveya başka bir GUI uygulaması . (Bazı nedenlerden dolayı, söz konusu XTerm bir başvuru başlatıncaya kadar bu etki benim için gerçekleşmiyor. Nedenini bilen var mı?)
  • Odağı tekrar tekrar orijinal XTerm'in içine ve dışına değiştirin (örn. Pencerelere tıklayarak) ve orijinal XTerm'e "yazıldığını" görün ^[[Ove ^[[Igörün.
  • Şimdi Xeyes'i kapatın, orijinal XTerm'e dönün ve çalıştırın printf "\e[?1004l"(yukarıdaki düzeltmede açıklandığı gibi özelliği devre dışı bırakmak için).
  • Yukarıdaki " çalıştır xeyes, odak değiştir " adımlarını tekrarlayın , ancak bu sefer terminale herhangi bir karakter girilmediğini göreceksiniz.

Şahsen bu sorunu sadece yanlışlıkla dijital çıkışları terminale döktüysem görüyorum, ancak daha düzenli olarak karşılaşıyorsanız bunu printfkabuğunuzun interaktif başlangıç ​​komut dosyasına (örneğin ~/.bashrc) eklemek isteyebilirsiniz . Özellik zaten devre dışı bırakılmışsa kontrol kodunu göndermenin (en azından XTerm altında) herhangi bir zararı yoktur, bu nedenle yalnızca bu sorunu bazen görseniz bile güvenli olmalıdır.

Kabuğunuzun her zaman bu çıktıyı oluşturmasından endişe ediyorsanız, belki de bazen bu kontrol kodlarını iyi işlemeyen yerlerde kullandığınızdan veya sorun bazen kabuk başladıktan sonra tetiklendiğinde, ayarlamayı tercih edebilirsiniz. alias focusfix='printf "\e[?1004l"'manuel olarak çalıştırmayı daha kolay hale getirmek için bir takma ad (ör. ile ) oluşturun.


Manjaro linux, Gnome, terminatör ve oh-my-zsh kullanıyorum. Bu sorun benim başıma geliyordu ve bu cevap çok yardımcı oldu.
Fabio Montefuscolo

2

"Odak" terimi , şu anda hangi terminalin (veya pencerenin) klavye ve fare giriş olaylarını kabul ettiğini ifade eder . Sadece biri odaklanabilir; araştırmaya yardımcı olmayacak bir grafik ortamında nasıl odaklanacağını ve kaybedileceğini belirlemek için protokoller vardır.

Açıklamadan ( odak yeniden kazanıldığında Tmux geçerli bölme göstergesine de bakın ), iTerm2'nin bu xtermözelliği uyguladığı görülmektedir :

FocusIn / focusOut

FocusIn / FocusOut, farklı bir protokol kullandığı için herhangi bir fare olayıyla birleştirilebilir. Ayarlandığında, terminal netleme yaptığında xterm'in CSI I ve netlemeyi kaybettiğinde CSI O göndermesine neden olur.

Özel mod 1004 tarafından etkinleştirilir (2007'de xterm'e eklenir, yama # 224 ):

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

ve bu düzeltme eki ile ilişkili olabilir: Vim - Odak raporlama modu desteği (DECSET / DECRST 1004) xterm uyumlu terminallerde çalışır ve bu, "xterm" fare özelliklerinin tüm davranışlarını tek bir ortamda eşitler :

/ * odak raporlaması xterm uyumlu terminaller ve tmux tarafından desteklenir. * /

Yani ... devre dışı olabilir o senin terminali xterm fare protokolünü kullanmayan vim belirsizliği ortadan kaldırır. Belirtilen düzeltme eki, vim'e FocusIn / FocusOut özelliğini (normalde kapalı olması gerekir) açmasını söyler ve mantığında bir miktar kusur varsa, vim'den çıktıktan sonra özelliği etkin bırakabilir.

Vim, modun etkinleştirilmesinin en olası nedeni olsa da, başka bir programın (veya komut dosyasının) onu açması mümkündür. Başka bir cevapta önerildiği gibi, scriptprogramı kullanarak terminalinize çıktı toplayarak (bir typescriptdosya oluşturarak) bunu daraltabilirsiniz . Zaman alıcı olabilen analizler (ve bu site ekleri desteklemiyor gibi görünmediğinden, ayrıntılı tartışma talep etmeye uygun görünmemektedir). Ben genellikle unmapbu amaçla daktilo dosyalarını okunabilir forma dönüştürmek için kullanın .


Ayrıntılı cevabınız için teşekkürler. Vim'e, Vim'de bu sorunu görmezden gelmesini \e\[Ove \e\[Içözmesini söyleyin, ancak cat veya diğer uygulamalarda rails server(belki de readline kullanan programlar) değil.
osyoyu

Öyleyse ... Herkes Vim'e \ e [O ve \ e [I ”yi nasıl görmezden geldiğini söyleyebilir mi?
Libin Wen

0

Bu sorunu çözmek için, hangi programın odak raporlama modunu etkinleştirdiğini bilmeniz gerekir. Komut dosyası (1) komutuyla kaydedilmiş bir günlük almalısınız .


Odak Raporlama varsayılan olarak kapalı ve bir kaçış dizisi tarafından açılan bir özellik midir? Aslında, bu sorunun yeni bir terminal penceresinde gerçekleşmediğini fark ettim, ancak bir şey yaptıktan sonra çoğalır , bu yüzden tanımlamaya çalışacağım.
osyoyu

-2

Odak kaybolduğunda terminalimi "^ @" göstererek çözmeye çalışarak bu soruyu buldum.

Cevapları okurken, iTerm2 tercihlerine gitmeye çalıştım -> Profiller -> "Varsayılan" -> Oturum ve işaretini kaldırma: "Boşta kaldığında, her 60 saniyede bir ASCII kodu 0 gönder"

Sorun çözüldü, umarım birine yardım eder

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.