Perché Emacs in esecuzione in un terminale non può distinguere Ctrl +; a partire dal ";"?


8

Questa domanda è nata dalla mia precedente domanda su emacs beta . In breve, voglio associare le C-;funzioni di Emacs in un terminale, ma sembra che qualcosa catturi questo tasto prima che raggiunga Emacs: Emacs pensa di aver premuto ;.

L'ovvio sospetto è l'emulatore di terminale, ma ne ho controllati molti (xterm, gnome-terminal, terminator, terminology) e nessuno di questi funziona. Molto probabilmente posso escludere il gestore delle finestre, perché nella versione GUI di Emacs, la chiave C-;funziona perfettamente. Ho provato anche due shell diverse: bash e zsh, ma di nuovo senza successo.

Cos'altro posso provare?


Secondo la tua domanda su Emacs , premendo Ctrl +; invia ;ad Emacs, quindi nulla lo sta catturando , quello che sta succedendo è che Ctrl +; e nudo; inviare le stesse informazioni. Quale è: acquisizione (ovvero che Emacs non riceve nulla) o perdita di informazioni (ovvero che Emacs riceve ;)?
Gilles 'SO- smetti di essere malvagio' il

non esiste un codice standard per C-;nel terminale. Cosa succede se si digita C-v C-;in semplice bash?
artm

@Gilles vedo ;in emacs -nwindipendentemente se mi ha colpito ;o C-;.
WeSenseASoulInSearchOfAnswers

@artm bashproprio come le stampe emacs appena nude ;.
WeSenseASoulInSearchOfAnswers

Risposte:


11

Forse la tua confusione deriva dal non aver usato un vero terminale. Quando i computer seri avevano le dimensioni di diversi frigoriferi verticali, un terminale comunicava con un computer centrale tramite un cavo seriale usando solo caratteri e caratteri. I caratteri facevano parte di alcuni set di caratteri standardizzati, ad esempio ASCII o EBCDIC, ma in genere ASCII. ASCII ha 33 caratteri di controllo e l'operatore terminale li ha inviati premendo un tasto speciale (come DEL) o tenendo premuto il tasto CTRL e premendo un altro tasto. Il computer centrale vedeva solo il carattere di controllo risultante; non sapeva quali tasti fossero premuti per produrre il personaggio.

Un programma di emulazione terminale come xterm imita quel comportamento. L'emulatore di terminale fornisce un modo per inviare tutti i 33 caratteri di controllo ASCII e Emacs riceverà quei caratteri se inviati. Ma Emacs è come il computer centrale nella descrizione sopra --- non ha modo di sapere quali tasti sono stati effettivamente premuti quando lo si esegue sotto un emulatore di terminale. Quindi, se si preme CTRL e punto e virgola, a meno che il programma di emulazione terminale non abbia mappato i tasti premuti su alcuni caratteri ASCII, Emacs non saprà che è stato digitato qualcosa.

Gli emulatori di terminali utilizzano in genere i seguenti mapping per generare caratteri di controllo :

tasto ASCII
--------------------
ESCAPE 27
ELIMINA 127
BACKSPACE 8
CTRL + SPAZIO 0
CTRL + @ 0
CTRL + A 1
CTRL + B 2
CTRL + C 3
eccetera...
CTRL + X 24
CTRL + Y 25
CTRL + Z 26
CTRL + [27
CTRL + \ 28
CTRL +] 29
CTRL + ^ 30
CTRL + _ 31

Si noti che CTRL +; non appare in quell'elenco. I terminali di solito inviano semplicemente il carattere stampabile assegnato alla chiave se CTRL + chiave non è mappato su un carattere di controllo. Quindi cosa ti dice il tuo emulatore di terminale inviando; da solo è che non sa cosa fare quando si preme CTRL + ;.

Tutto ciò si applica solo se si utilizza un terminale o un programma di emulazione terminale. Se stai eseguendo Emacs come un'applicazione nativa in un sistema a finestre, Emacs ha pieno accesso agli eventi di battitura e non solo ai caratteri. Quindi Emacs può vedere che hai premuto CTRL e punto e virgola insieme e ti consente di assegnare un'azione a quella coppia di tasti.

† I terminali hanno spesso tasti funzione e tasti freccia che generano anche sequenze di caratteri che includono caratteri di controllo. Queste sequenze in genere iniziano con il codice ASCII 27 (ESCAPE).


3

I terminali trasmettono caratteri (più precisamente: byte), non chiavi. Quando si preme un tasto o un keychord come Ctrl+ ;, queste informazioni devono essere codificate in una sequenza di byte. Keychords che rappresentano un carattere, come Ao Shift+ Ao À, vengono inviati come quel personaggio: a, A, à(l'ultima delle quali uno o due byte seconda codifica dei caratteri del terminale).

I portachiavi che coinvolgono i tasti funzione non hanno caratteri corrispondenti, quindi vengono inviati come sequenze di escape: una sequenza di byte che inizia con il carattere di escape ( \ein una stringa Emacs, che appare come ciano ^[se inserito letteralmente in un buffer). Alcuni tasti funzione hanno byte corrispondenti che sono caratteri di controllo .

Keychord Ctrl+ ;non ha una sequenza di escape standard, quindi la maggior parte degli emulatori di terminali generano il carattere ;. Questo perde le informazioni che è Ctrlstato premuto il modificatore.

Per definire un'associazione per Ctrl+ ;, è necessario configurare l'emulatore di terminale per inviare una diversa sequenza di escape. Non penso che tu possa farlo con il terminale Gnome (Gnome è raramente configurabile). Puoi farlo con Xterm. Vedi Ci sono dei terminali Linux in grado di gestire tutte le combinazioni di tasti? per istruzioni.

La shell che è possibile eseguire nel terminale non è coinvolta. Una GUI Emacs non ha alcun problema perché la GUI (X11) trasmette gli eventi di input in una forma che codifica chiavi e modificatori, non come una semplice sequenza di caratteri.

Vedi Come funzionano l'input da tastiera e l'output di testo? per informazioni più dettagliate su come l'input arriva dalla tastiera all'applicazione.

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.