Su OS X Lion 10.7.4 in Terminal.app Non riesco a digitare 'C-M- @' o 'C-M-%', perché?

3

Sul mio MacBook Pro con OS X Lion 10.7.4 sembra esserci un problema di tastiera. Ho notato questo problema per la prima volta quando ho provato a utilizzare la combinazione di tasti predefinita per eseguire mark-sexp e query-replace-regexp in emacs, che sono rispettivamente associati a C-M-@ e C-M-% per impostazione predefinita. Poiché uso molto emacs, mi mancano molto queste due potenti funzionalità.

Dato che non ho esperienza con i tipi di terminale ecc, ho fatto un semplice debugging in emacs:

  • C-M-f e C-M-b funzionano come previsto. Quindi il controllo e l'opzione funzionano bene insieme.
  • M-% , M-< e M-> funzionano come previsto. Quindi l'opzione e il turno funzionano bene insieme.
  • C-S-backspace non funziona. (Ma non ho mai provato questo comando prima: la prima volta che l'ho eseguito era oggi quando l'ho trovato nel manuale di emacs.) Ma C-@ funziona come previsto. Quindi il controllo e lo spostamento probabilmente funzionano bene insieme.
  • Se non sbaglio, il comando digit-argument è associato a C-9 , C-8 , ecc. Queste chiavi non funzionano altrettanto bene. Mi sono assicurato che in System Preferences.app ho spento queste chiavi per cambiare spazio.

Nelle preferenze di Terminal.app, ho selezionato "use option come meta key" perché facilita la digitazione dei tasti di emacs. Ho anche provato a disabilitare questa opzione e usare ESC ma ancora inutilmente. Qualche idea?

P.S. Ho lanciato X11.app e nella finestra di xterm ho avviato emacs. Usando ESC come meta, C-M-% e C-M-@ funzionano perfettamente. Nella versione Cocoa di Emacs, anche questi due funzionano perfettamente. Quindi penso che sia un bug di Terminal.app o probabilmente ci potrebbe essere un settaggio o un interruttore di configurazione che posso modificare per farlo funzionare in Terminal.app?

Ed ecco l'output di stty -a dalla shell di emacs, si spera sia utile ...

bash-3.2$ stty -a
speed 9600 baud; 0 rows; 0 columns;
lflags: icanon isig iexten -echo echoe -echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -iutf8
    -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost -onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = <undef>; intr = ^C; kill = <undef>;
    lnext = ^V; min = 1; quit = ^\; reprint = ^R; start = ^Q;
    status = ^T; stop = ^S; susp = ^Z; time = 0; werase = ^W;
bash-3.2$ 

Lo stesso comando direttamente dalla shell:

$ stty -a
speed 9600 baud; 24 rows; 80 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
    -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
    stop = ^S; susp = ^Z; time = 0; werase = ^W;
$

(Commento laterale: sembra strano che la sintassi per un blocco di codice sia di quattro spazi precedenti. Tutti gli utenti di StackExchange si aspettano di sapere come utilizzare paste(1) , sed(1) o modifiche rettangolari?)

    
posta kccqzy 13.05.2012 - 05:55
fonte

2 risposte

6

In generale, le applicazioni Mac che si aspettano l'immissione di testo dalla tastiera non gestiscono combinazioni C-S o combinazioni C-digit. I programmi che funzionano con le combo di controllo-shift (come qualsiasi cosa che gira sotto X11) lo fanno gestendo gli eventi chiave come eventi, non i caratteri immessi. In questo modo possono distinguere tra Tab e Ctrl-i, che generano entrambi lo stesso carattere ASCII. (Puoi leggere in dettaglio come Lion (veramente Cocoa) gestisce gli eventi chiave se vuoi davvero saperlo.)

Storicamente (di nuovo nei giorni Teletype), c'erano solo lettere maiuscole sulla tastiera e non c'erano caratteri di caret (^) o underscore (_) sulla tastiera (invece c'erano up-arrow e back-arrow). Il tasto Shift ha funzionato alternando il bit 16 e il tasto control ha funzionato azzerando il bit 64 dei codici ASCII a 7 bit della tastiera prodotta.

Ciò significa che il tasto di controllo non ha avuto effetto per i 32 caratteri sulla tastiera che avevano già il bit 64 impostato su zero (la maggior parte dei caratteri non alfabetici, comprese le cifre), e poiché il teletype era volutamente limitato solo per le lettere maiuscole, il tasto Maiusc non ha avuto alcun effetto sulla maggior parte dei caratteri alfabetici (e dove ha avuto un effetto, ha prodotto un carattere speciale come @).

Sono state aggiunte stranezze nella migrazione per supportare il testo in minuscolo, dato che le combinazioni di tasti di controllo sono state tutte digitate senza utilizzare il tasto Maiusc, ma ora la lettera digitata senza utilizzare il tasto Maiusc era cambiata, quindi la decisione era quella del controllo della mappa -luce-caso a ciò che era stato il controllo-maiuscolo. Ma allora cosa fai con il control-shift?

Per un po 'il problema è stato risolto facendo in modo che il tasto di controllo azzeri anche il bit dei 32, che è ciò che differenzia le lettere minuscole dalle lettere maiuscole. Ma alla fine l'ASCII è stato sostituito con Unicode e quei tipi di assegnazioni di tasti duplicati erano troppo sprechi di spazio sulla tastiera per poter continuare, quindi hanno ottenuto mappature diverse e sulla tastiera standard degli Stati Uniti la maggior parte delle combo C-S non è assegnata.

Quindi ciò che hai incontrato è il supporto legacy per l'input da tastiera che ritorna ai giorni Teletype. I caratteri che Terminal (e altre app OS X) non supportano sono caratteri che non è possibile digitare sulla tastiera Teletype. A riprova di ciò, si noti che CS-2 (C- @), CS-6 (C- ^) e CS-- (C-_) funzionano tutti, perché quelle chiavi sono state rimappate dopo l'ASR-33 , dove S-2 era "(e @ era SP), S-6 era &, e S-- era =, ma in generale le combo di control-shift non producono caratteri di alcun tipo.

    
risposta data 13.05.2012 - 19:26
fonte
0

Solo condivisione,

Ho provato a personalizzare quei tasti e trasporre l'opzione a comando come meta ma a non avere successo.

Quello che realizzo è che Terminal.app non riconosce 4 pulsanti contemporaneamente. O almeno penso che non sia così.

Tuttavia, questo potrebbe aiutarti a impostare la combinazione di tasti tra software.

Ho anche scoperto altro discussioni correlato anche a questo.

(btw digit-argument funziona con M- {1..9}, non con C- {1..9} come detto. strano)

    
risposta data 13.05.2012 - 17:00
fonte

Leggi altre domande sui tag