Usa Super in emacs -nw in linux


15

Ho avuto difficoltà a trovare una domanda semplice e diretta alla risposta e quindi ho deciso di porre qui.

D: Esiste un modo per usare Super in Emacs lanciato in un Terminale in Linux?

PS : ho letto molte informazioni xmodmapma penso che la chiave sia che l'emulatore di terminale non può rappresentare la chiave Super. Tuttavia, (kbd "s-SPC")restituisce qualcosa e stavo pensando di utilizzare la funzione di traduzione di .Xdefaults/X. Sono sulla buona strada? Dato il risultato di kbd, cosa devo mettere come XTerm.VT100.translations?

Risposte:


21

Ti sentirai più a tuo agio in un X11 Emacs, che può ricevere input da tastiera e visualizzare testo senza passare attraverso la codifica e la decodifica per il terminale . Il motivo principale per utilizzare un editor in modalità testo è eseguirlo all'interno dello schermo o di tmux su una macchina remota, ma grazie a Tramp, di solito è più facile modificare il file remoto in Emacs locale. Detto questo, puoi fare quello che vuoi finché il tuo emulatore di terminale collabora, come nel caso di Xterm.

Quando si preme un tasto o una combinazione di tasti in un terminale, questo viene trasmesso all'applicazione in esecuzione nel terminale come una sequenza di uno o più caratteri. Ad esempio, quando si preme a, l'applicazione riceve a. Quando si preme Enter, l'applicazione riceve il carattere CR(aka ^M(pronunciato "control-emm"), aka personaggio numero 13, aka \ro \015). Le combinazioni di tasti che coinvolgono Altsono in genere trasmesse come carattere ESC(a.ka. ^[aka \eo \033) seguito dalla sequenza per il tasto o la combinazione di tasti senza Alt. I tasti funzione e altre combinazioni di tasti vengono trasmessi come sequenze di escape che iniziano con \e[o \eO.

Le sequenze di escape non sono completamente standardizzate e i terminali in genere ignorano determinati attributi per determinate chiavi. Ad esempio, i modificatori hyper e super sono generalmente ignorati. Puoi vedere cosa invia il tuo terminale per una combinazione di tasti premendo Ctrl+ Vseguito da quella combinazione di tasti nel prompt della shell o C-qoppure C-h cseguito dalla combinazione di tasti in Emacs.

Xterm consente di configurare le sequenze di escape per ogni chiave attraverso risorse X . La maggior parte delle configurazioni legge le risorse ~/.Xresourcesall'avvio di X e puoi caricare il file manualmente con xrdb -merge ~/.Xresources.

XTerm.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <Key> Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <Key> percent: string("\033[37;6~")

Una convenzione comune utilizza sequenze di escape del modulo ESC [ number1 ; number2 ~per i tasti funzione con modificatori. number1indica il tasto funzione ( 15da 24per F5a F12- per ragioni storiche, da F1 a F4hanno sequenze di escape diverse) e number2indica il modificatore ( 2per Shift, 5per Ctrl, 3per Meta, 8per Ctrl+ Metae aggiungi 1 per + Shift- no, non è molto coerente).

Dovrai specificare i modificatori Hyper e Super tramite il loro numero, come Mod1attraverso Mod5. Esegui xmodmap -pmper visualizzare la mappatura dei tasti palestra ai modificatori. Ad esempio, se Super_Lè associato a Mod5, la seguente riga (utilizzare questo caso esatto) definisce un'associazione per Super+ Space:

    ~Ctrl ~Meta Mod5 <Key> space: string("\033[32;16~") \n\

Emacs traduce le sequenze di escape nella sua rappresentazione chiave interna attraverso input-decode-mapolocal-function-key-map (o function-key-mapprima di Emacs 23).

(define-key local-function-key-map "\033[32;16~" [(super ?\ )])

Questo post è realizzato per il 80% in materiale riciclato. Esistono terminali Linux in grado di gestire tutte le combinazioni di tasti?


Questa è un'ottima risposta, che comprende tutte le conoscenze che ho trovato un po 'sparse in giro. Solo una domanda: dove hai trovato / come hai scelto 32; 16 ~ e perché non corrisponde con il legame di emacs sotto? Ho capito l'origine dei numeri, ma vorrei chiedervi se è possibile creare un collegamento a un qualche tabella di mappatura per number1 e number2 .
Andrea Richiardi,

@AndreaRichiardi Ho scelto 32 perché è il valore ASCII / Unicode per il carattere spazio e 16 perché i binding standard usano valori fino a 8 per Ctrl, Meta e Shift. Il 33 sotto era un errore di battitura. Puoi scegliere qualsiasi cosa purché non sia in conflitto con altre chiavi.
Gilles 'SO- smetti di essere malvagio' il

Ho dovuto associare la sequenza a una funzione, quindi ho risolto momentaneamente (global-set-key "\033[32;16~" 'set-rectangular-region-anchor). Ma per essere completo, ho provato il tuo define-keysopra, ma non ho potuto innescare (global-set-key (kbd "s-SPC") 'set-rectangular-region-anchor). Stava solo stampando; 16 ~ nel buffer. Sarebbe stato bello associare quella sequenza a (kbd "s-SPC") in modo che io abbia la sequenza di tasti associata e posso riassegnarla ad altri comandi.
Andrea Richiardi,

C-h lrestituisce quanto segue premendo s-SPC ora: ESC [ 3 2 ; 1 6 ~ma emacs si lamenta ancora cheM-[ 32 is undefined
Andrea Richiardi,

@AndreaRichiardi Dopo aver corretto più errori di battitura nella parte xterm (che sembra aver risolto poiché Emacs riceve la sequenza di caratteri prevista), funziona per me. Funziona se usi function-key-mapinvece di local-function-key-map? Potrebbe essere una questione di quando si imposta local-function-key-map, poiché dipende dal terminale.
Gilles 'SO- smetti di essere malvagio' il

0

Se sei disposto a installare un pacchetto Emacs e configurare il tuo terminale, ho scritto un pacchetto Emacs che può insegnare a Emacs e ai terminali come riconoscere correttamente tutti i tasti della tastiera del PC e le combinazioni di tasti modificatori:

https://github.com/CyberShadow/term-keys

La codifica del modificatore Super non è abilitata per impostazione predefinita, ma il pacchetto è personalizzabile e consente di configurare quali combinazioni di tasti modificatore sono codificate. Per abilitare le combinazioni di tasti di codifica che includono il modificatore Super, impostare term-keys/want-key-p-funcsu una funzione che ritorna tquando (elt mods 3)è diversa da zero (vedere l'implementazione predefinita per una spiegazione).


0

Ho i seguenti file nei miei file init:

(global-set-key [f7] nil)
(global-set-key [f8] nil)
(define-key function-key-map [(f7)] 'event-apply-super-modifier)
(define-key function-key-map [(f8)] 'event-apply-hyper-modifier)

Questo mi permette di inviare i tasti super e hyper usando i tasti funzione.


-1

Risposta breve: usare Konsole.

Spiegazione:

  • Emacs ' local-function-key-mapha una mappatura delle voci C-x @ ssu event-apply-super-modifier.
  • Konsolemappa Super(il tasto logo Windows) sulla sequenza di escape ^X@s(che non sembra essere documentata da nessuna parte, l'ho scoperto per caso). Puoi provare aprendo Konsolee premendo ad es Ctrl-v Win-o.

Grazie per la risposta, ma cambiare il termine non è la soluzione che sto cercando.
Andrea Richiardi,
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.