“^ [[O” e “^ [[I” appaiono su iTerm2 in caso di perdita di messa a fuoco


23

Sto usando iTerm2 2.1.1 su Yosemite. No tmux.

Quando iTerm perde lo stato attivo (quando si passa a un'altra applicazione da Cmd-Tab o facendo clic su un'altra finestra), a ^[[Ie ^[[Osembra essere inviato al terminale. Questo fa ^[[I^[[Oapparire, o più frustrante, in Vim, questa combinazione apre un altro piccolo buffer.

Esempio: premere Cmd-Tab più volte dopo l'avvio cat

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

Questo succede solo su iTerm e non su Terminal.app. Inoltre, si riproduce su bash o sh, quindi non sembra essere un problema zsh. Alcuni google hanno suggerito che si tratta di un problema di "focus", ma che cos'è "focus" nei significati di un terminale, e c'è un modo per disabilitarlo o evitarlo?


Questo sembra riprodursi quando scrivo giapponese (in Vim), ma non sono ancora sicuro di quale azione sia la causa ...
osyoyu,

Risposte:


25

Secondo questo :

Aggiungi supporto per la segnalazione dell'attenzione persa / acquisita. esc [? 1004h lo attiva; quindi il terminale invia esc [I durante la messa a fuoco, esc [O durante la de-messa a fuoco. Invia esc [? 1004l per disabilitare.

Cmd- il Rreset disattiverà il focus focus (grazie a questo )


1
Cmd-Rè la sequenza magica per me
bruceg

Molto utile, grazie. Mi ci è voluto molto tempo per trovare così SEO su Google: mac iterm iterm2 mostra il contenuto degli appunti vim ex buffer focus
bsb

11

Non ho un Mac a portata di mano per testare questa risposta, ma ho riscontrato questo problema in XTerm sotto Linux molto occasionalmente e (supponendo che iTerm2 rispetti gli stessi codici di controllo) potresti trovare utile la correzione di seguito.

Esegui il seguente comando shell all'interno del terminale in cui riscontri il problema:

printf "\e[?1004l"

(Nota che l'ultimo carattere è un 'ell' minuscolo.)

Questa sequenza di controllo ANSI è simile a quella elencata nella risposta di Thomas Dickey, ma disattiva la funzionalità (anziché attivarla). Dovrebbe risolvere il tuo problema in tutte le applicazioni, non solo in Vim, evitando che i personaggi si presentino affatto.


Su Linux posso dimostrare questa sequenza di controllo lavorando con i seguenti passaggi:

  • Esegui xterme abilita la funzione eseguendola printf "\e[?1004h".
  • Esegui xeyeso un'altra applicazione GUI dallo stesso XTerm . (Per qualche motivo, questo effetto non si verifica per me fino a quando l'XTerm in questione non avvia un'applicazione. Qualcuno sa perché?)
  • Cambia ripetutamente lo stato attivo all'interno e all'esterno dell'XTerm originale (ad esempio facendo clic su Windows) e vedi ^[[Oed ^[[Iessere "digitato" nell'XTerm originale.
  • Ora chiudi Xeyes, torna all'XTerm originale ed esegui printf "\e[?1004l"(per disabilitare la funzione, come descritto nella correzione sopra).
  • Ripeti i passaggi " Esegui xeyes, cambia focus " sopra, ma questa volta non vedi alcun carattere inserito nel terminale.

Personalmente vedo questo problema solo se ho scaricato inavvertitamente l'output binario sul terminale, ma se lo incontri più regolarmente potresti volerlo aggiungere printfallo script di avvio interattivo della tua shell (ad es ~/.bashrc.). Non sembra esserci alcun danno (almeno in XTerm) all'invio del codice di controllo se la funzione è già disabilitata, quindi dovrebbe essere sicura anche se a volte vedi questo problema.

Se sei preoccupato che la tua shell generi sempre quell'output, forse perché a volte lo usi in posti che non gestiscono bene quei codici di controllo, o se il problema a volte viene innescato dopo l'avvio della shell, allora potresti preferire impostare un alias (ad es. con alias focusfix='printf "\e[?1004l"') per rendere più comodo l'esecuzione manuale.


Sto eseguendo Manjaro Linux, Gnome, Terminator e oh-my-zsh. Questo problema mi stava accadendo e questa risposta mi ha aiutato molto.
Fabio Montefuscolo,

2

Il termine "focus" si riferisce a quale terminale (o finestra) sta attualmente accettando eventi di input da tastiera e mouse. Solo uno può avere il focus; ci sono protocolli per stabilire come ottenere e perdere la concentrazione in un ambiente grafico che non sarebbe utile esplorare.

Dalla descrizione (vedi anche l' indicatore del riquadro corrente di Tmux quando viene ripristinato lo stato attivo ), sembra che iTerm2 implementa questa xtermfunzione:

FocusIn / focusOut

FocusIn / FocusOut può essere combinato con uno qualsiasi degli eventi del mouse poiché utilizza un protocollo diverso. Se impostato, fa sì che xterm invii CSI I quando il terminale ottiene lo stato attivo e CSI O quando perde lo stato attivo.

È abilitato dalla modalità privata 1004 (aggiunta a xterm nel 2007, patch # 224 ):

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

e può essere correlato a questa patch: Vim - Aggiungi il supporto per la modalità di reporting focus (DECSET / DECRST 1004) funziona su terminali compatibili xterm , che equivale a tutto il comportamento delle funzionalità del mouse "xterm" in un'unica impostazione:

/ * Il focus focus è supportato da terminali compatibili xterm e tmux. * /

Quindi ... si potrebbe disabilitare che dicendo vim che il terminale non utilizza il protocollo xterm mouse. La patch citata dice a vim di attivare la funzione FocusIn / FocusOut (che normalmente dovrebbe essere spenta) e, se c'è qualche difetto nella sua logica, potrebbe lasciare abilitata la funzione dopo essere usciti da vim.

Mentre vim è la causa più probabile dell'attivazione della modalità, è possibile che qualche altro programma (o script) la attivi. Come suggerito in un'altra risposta, potresti restringerlo raccogliendo l'output sul tuo terminale usando il scriptprogramma (producendo un typescriptfile). Analizzare ciò può richiedere molto tempo (e poiché questo sito non sembra supportare gli allegati , non sembra adatto a sollecitare discussioni dettagliate). A unmapquesto scopo generalmente utilizzo la trasformazione di file dattiloscritti in forma leggibile.


Grazie per la tua risposta dettagliata. Dire a Vim di ignorare \e\[Oe \e\[Irisolvere questo problema in Vim, ma non in altre applicazioni come cat o in rails server(forse programmi che usano readline?).
Osyoyu,

Quindi ... qualcuno potrebbe dire esattamente come "dire a Vim di ignorare \ e [O e \ e [I"?
Libin Wen,

0

Per risolvere questo problema, devi sapere quale programma abilita la modalità di segnalazione focus. Dovresti prendere un registro registrato dal comando script (1) .


Focus Reporting è una funzionalità disattivata per impostazione predefinita e attivata da una sequenza di escape? In realtà, ho notato che questo problema non si verifica in una nuova finestra del terminale, ma si riproduce dopo aver fatto qualcosa , quindi proverò a identificarlo.
Osyoyu,

-2

Ho trovato questa domanda provando a risolvere il mio terminale mostrando "^ @" quando si è perso lo stato attivo.

Leggendo le risposte, ho provato ad andare alle preferenze iTerm2 -> Profili -> "Predefinito" -> Sessione e deselezionando: "Quando inattivo, invia il codice ASCII 0 ogni 60 secondi"

Problema risolto, spero che aiuti qualcuno

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.