shift-tab (ISO_left_tab) auf console (tty)...

Warum Debian? Was muss ich vorher wissen? Wo geht's nach der Installation weiter?
Antworten
mutetella
Beiträge: 68
Registriert: 26.02.2013 11:15:44
Kontaktdaten:

shift-tab (ISO_left_tab) auf console (tty)...

Beitrag von mutetella » 06.03.2013 20:23:24

Hallo,

das ist jetzt wieder sowas, bei dem ich schon gleich gar nicht weiß, wo ich ansetzen soll... :?

Unter einer X-Umgebung funktioniert im Vim sowohl Tab (einrücken) wie auch Shift-Tab (ausrücken) ohne Probleme. Auf der Console allerdings sind Tab und Shift-Tab identisch belegt, d. h., beide rücken ein. Die Shift-Tab Sequenz "\E[Z" wird aber verarbeitet. Ich müsste also den keycode von Shift-Tab mit "\E[Z" belegen, oder so...

Nur wie? Wo liegen die mappings für's tty?

mutetella

rendegast
Beiträge: 15038
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: shift-tab (ISO_left_tab) auf console (tty)...

Beitrag von rendegast » 06.03.2013 22:09:45

(Im xterm:vim macht Shift-Tab aber auch dasselbe wie Tab,
Eventuell braucht es irgendwelche deadkeys-oder-sonstiges als Vorgabe?
Oder braucht eine Einstellung in vim?)



xev:Tab:

Code: Alles auswählen

KeyPress event, serial 33, synthetic NO, window 0x1400001,
    root 0xc3, subw 0x0, time 443927856, (830,-106), root:(834,699),
    state 0x10, keycode 23 (keysym 0xff09, Tab), same_screen YES,
    XLookupString gives 1 bytes: (09) " "
    XmbLookupString gives 1 bytes: (09) "       "
    XFilterEvent returns: False
xev:Shift-Tab / ISO_Left_Tab:

Code: Alles auswählen

KeyPress event, serial 33, synthetic NO, window 0x1400001,
    root 0xc3, subw 0x0, time 443921657, (830,-106), root:(834,699),
    state 0x11, keycode 23 (keysym 0xfe20, ISO_Left_Tab), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False
Also 0xff09 <-> 0xfe20

Ein aktuelles 'dumpkeys':
(dumpkeys zeigt eine kmap, die ja aus einer Kombination von Dateien in /usr/share/keymaps/ konstruiert wird.)

Code: Alles auswählen

keycode  15 = Tab             
	alt	keycode  15 = Meta_Tab        
	altgr	alt	keycode  15 = Meta_Tab        
	control	alt	keycode  15 = Meta_Tab        
	altgr	control	alt	keycode  15 = Meta_Tab        
(Das Alt-Tab (Meta_Tab) macht in meinem Konsolen-vim irgendwie garnix)

Das kann erweitert werden

Code: Alles auswählen

keycode  15 = Tab             
	shift	keycode  15 = 0xfe20
	alt	keycode  15 = Meta_Tab        
...
Mit dem keysym resp. dessen numerischen Wert ('man keymaps').

Nach 'dumpkeys -l', sind es bei X wie Konsole dieselben keysym-Werte (an Beispielen a=0x61, e=0x65)
Also hat keysym "ISO_Left_Tab" den numerischen Wert 0xfe20.
'dumpkeys -l' gibt mit aber für Tab 0x0009 und Meta_Tab 0x0809 (?), muß doch noch umgerechnet werden?
Für die keycodes gibt es (bei mir) +8 von Konsole zu X.


Weiter 'man loadkeys',
das führt dann zBsp. zu /etc/consoe-tools/remap / /etc/init.d/console-screen.sh:

Code: Alles auswählen

    # Allow user to remap keys on the console
    if [ -r /etc/console-tools/remap ]
        then
        dumpkeys < ${DEVICE_PREFIX}1 | sed -f /etc/console-tools/remap | loadkeys --quiet
    fi
Jetzt noch etwas sed-"Magie" in remap

Code: Alles auswählen

# fuegt eine Zeile ein
/keycode  15 = Tab/ a \    shift   keycode  15 = 0xfe20




Alternativ nach obiger Bemerkung könnten die Templates in /usr/share/keymaps/ modifiziert werden, naja.
Es gibt wohl (noch) keine Möglichkeit, lokale Templates im 'dpkg-reconfigure console-data' einzubinden.





-------------------------------------------------

Mal damit versucht?
http://feitel.indeedgeek.de/2009/9/vim- ... ngerueckt/
4.1 Ein-/Ausrücken
Ist man gerade im Einfügemodus kann man einfach mit strg+T eine Stufe einrücken bzw. mit strg+D eine Stufe wieder ausrücken.
Viel flexibler ist man allerdings im Befehlsmodus. Hier lassen sich < und > verwenden ...
Funktionieren bei mir im xterm:vim wie auf der Konsole.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

mutetella
Beiträge: 68
Registriert: 26.02.2013 11:15:44
Kontaktdaten:

Re: shift-tab (ISO_left_tab) auf console (tty)...

Beitrag von mutetella » 07.03.2013 08:17:31

Vielen Dank für Deine ausführliche Antwort!
rendegast hat geschrieben:Im xterm:vim macht Shift-Tab aber auch dasselbe wie Tab,...
Bei mir eben nicht, das macht mich eben stutzig... Ich habe folgende vim-mappings, die in einem xterm einwandfrei funktionieren:

Code: Alles auswählen

"Indent                                                           
map <Tab> >>                                                      
vmap <Tab> >
                                                 
"Outdent                                                          
map <S-Tab> <<                                                    
vmap <S-Tab> < 
Ich hatte vor längerem mal ein kleines Pythonskript geschrieben, das mir die keycodes liefert. Das habe ich einmal in einem xterm und einmal in der console gestartet und habe folgendes Ergebnis bekommen:

xterm:
tab: [9]
s-tab: [27, 91, 90]

console:
tab: [9]
s-tab: [9]

Das heißt ja wohl, dass die console ein s-tab überhaupt nicht erkennt und demnach auch überhaupt nicht belegen lässt... :?

Oder interpretiere ich das falsch?

mutetella

rendegast
Beiträge: 15038
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: shift-tab (ISO_left_tab) auf console (tty)...

Beitrag von rendegast » 07.03.2013 10:24:42

Ich habe folgende vim-mappings
Habe ich ja eingeräumt, und ein solches Mapping habe ich dann wohl nicht.



xterm:
tab: [9]
paßt zum xev "keycode 23 (keysym 0xff09, Tab)"

Aber wie ich
s-tab: [27, 91, 90]
zu "keycode 23 (keysym 0xfe20, ISO_Left_Tab)" deuten soll?

(Nebenbei weiß ich auch nicht, wie ich 0xff09 zu 0xfe20 deuten soll. Hat vielleicht was mit UTF8 zu tun.)


und demnach auch überhaupt nicht belegen lässt...
Das ginge dann wie oben dargelegt in remap.
Du solltest noch Dein dumpkey und xev mit dem meinen vergleichen/verifizieren,
ob da eventuell noch irgendwelche Verschiebungen aktiv sind.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

mutetella
Beiträge: 68
Registriert: 26.02.2013 11:15:44
Kontaktdaten:

Re: shift-tab (ISO_left_tab) auf console (tty)...

Beitrag von mutetella » 11.03.2013 17:10:18

rendegast hat geschrieben:Das ginge dann wie oben dargelegt in remap.
Das bezweifel ich inzwischen. `remap` bedeutet letztlich ja, dass ich dort etwas, das bereits an etwas gemappt ist, zusätzlich an etwas weiteres binde bzw. das Mapping komplett an meine Wünsche anpasse.
Das Problem innerhalb der console (tty) ist aber offensichtlich, dass shift-tab an überhaupt nichts gemappt ist, da der keycode derselbe ist wie bei tab. Es lässt sich also schlichtweg nicht zwischen tab und shift-tab unterscheiden.

Falls ich völlig auf dem Holzweg bin, freue ich mich natürlich sehr über weitere Hilfe...

Ansonsten lebe ich vorerst damit, dass die console mir kein backtab gönnt... :(

mutetella

cosmac
Beiträge: 4562
Registriert: 28.03.2005 22:24:30

Re: shift-tab (ISO_left_tab) auf console (tty)...

Beitrag von cosmac » 11.03.2013 22:37:42

hi,
mutetella hat geschrieben:
rendegast hat geschrieben:Das ginge dann wie oben dargelegt in remap.
Das bezweifel ich inzwischen. `remap` bedeutet letztlich ja, dass ich dort etwas, das bereits an etwas gemappt ist, zusätzlich an etwas weiteres binde bzw. das Mapping komplett an meine Wünsche anpasse.
remap benutzt aber seinerseits loadkeys -- dem würde ich mehr Möglichkeiten zutrauen, immerhin überschreibt es direkt die Tabellen im Kernel.

Hier (wheezy) kann ich die Zeichenfolge 27,91,90 (= "\033[Z") zumindest über einen Umweg auf Shift-Tab legen. Nachdem mir dumpkeys die aktuelle Tabelle in eine Datei geschrieben hat, definiere ich (ziemlich weit unten) eine freie Funktionstaste, z.B. F40:

Code: Alles auswählen

string F40 = "\033[Z"
die kann ich dann wie oben bei rendegast mit Shift-Tab verknüpfen:

Code: Alles auswählen

keycode  15 = Tab
        shift   keycode  15 = F40
das ganze mit loadkeys geladen scheint keine Wirkung zu zeigen, aber das liegt am vim. Beim Einfügen mit CTRL-V werden genau die 3 Zeichen eingefügt. Die Gegenprobe kann man mit den Cursor-Tasten machen, CTRL-V und Cursor links fügt "\033[D" ein, obwohl dumpkeys -l "0x0601 Left" dazu sagt und xev "0xff51".

Da X11 die Rohdaten von der Tastatur selbst umkodiert und das schon konnte, als es den Linux-Kernel noch nicht gab, halte ich jede Ähnlichkeit der Codes mit denen des Kernels für rein zufällig.
Beware of programmers who carry screwdrivers.

mutetella
Beiträge: 68
Registriert: 26.02.2013 11:15:44
Kontaktdaten:

Re: shift-tab (ISO_left_tab) auf console (tty)...

Beitrag von mutetella » 12.03.2013 09:45:07

Hmm... ich glaube, wir reden aneinander vorbei oder mir fehlt ein Teil für's Verständnis...

Die Zeichenfolge "\033[Z" auf shift-tab oder irgendeine andere Taste zu legen funktioniert IMHO deshalb nicht, weil diese Zeichenfolge, die innerhalb von X als backtab (ISO_left_tab) gehandelt wird, außerhalb von X, sprich in der console überhaupt nicht interpretiert wird. Es kommt mir so vor, als würde ein backtab innerhalb der console nicht existieren.

Wenn ich im xterm folgendes eingebe

Code: Alles auswählen

$ echo -e "\tT\tT\tT"
        T       T       T
wird um 3 tab-Schritte nach rechts gerückt, bei Eingabe von

Code: Alles auswählen

$ echo -e "\tT\tT\tT\033[ZB"
        T       T       B
um 3 tabs nach rechts und 1 tab nach links. Sowohl tab wie auch shift-tab werden innerhalb von X demnach behandelt.

Selbiges innerhalb der console ergibt

Code: Alles auswählen

$ echo -e "\tT\tT\tT"
        T       T       T
und

Code: Alles auswählen

$ echo -e "\tT\tT\tT\033[ZB"
        T       T       TB
Das "\033[Z" wird demnach überhaupt nicht verarbeitet. Im Grunde genommen das, was mein kleines Pythonskript auch schon zu Tage gebracht hat: tab wie auch shift-tab werden in der console schlichtweg als tab erkannt.

Die Sequenz für ein backtab ("\033[Z") an etwas zu binden bringt demnach wohl keinen Erfolg, weil auf consolenebene diese Sequenz ignoriert wird.

mutetella

rendegast
Beiträge: 15038
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: shift-tab (ISO_left_tab) auf console (tty)...

Beitrag von rendegast » 12.03.2013 11:24:49

Es gibt eventuell ein systematisches Problem,
console-tools (console-screen.sh / loadkeys / remap) <-> console-setup (setupcon / remap.inc)

Welches System bei Dir letztendlich zum Tragen kommt,
kannst Du durch Setzen von validen, aber unterschiedlichen Werten ausprobieren.

In einer wheezy-VM mit console-setup ohne console-tools, kein X.
zBsp. mit remap.inc

Code: Alles auswählen

shift keycode  15 = Incr_Console
(anschl. 'dpkg-reconfigure console-setup', kein Neustart)
kann ich per Shift-Tab die Konsole umschalten.

Nebenbei sehen in einer cached.....kmap.gz numerische Werte so aus: '[+]U+hhhh',
beim 'dumpkeys --numeric' gibt es 'U+hhhh' und '0xhhhh'.





Zu meiner "sed-Magie" bei remap oben:
Die Zeile paßte bei einem squeeze,
bei meinem wheezy sieht die bezugnehmende Zeile aber anders aus

Code: Alles auswählen

keycode  15 = Tab              thai_phosamphao
der sed-Ausdruck paßt dann (bei mir) immer noch,
müßte aber gegebenenfalls angepaßt werden, um überhaupt ausgeführt zu werden.
(abgesehen von einem validen Wert für die Tastenkombination)
Probe jeweils mit

Code: Alles auswählen

dumpkeys | sed -f /etc/console-tools/remap | less
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

mutetella
Beiträge: 68
Registriert: 26.02.2013 11:15:44
Kontaktdaten:

Re: shift-tab (ISO_left_tab) auf console (tty)...

Beitrag von mutetella » 20.03.2013 11:50:00

Ok, ich musste jetzt erstmal noch so einiges lesen und probieren, damit ich das alles auch halbwegs verstehe... :wink:

Jedenfalls funktioniert Eure Lösung hervorragend, hier nochmal kurz zusammengefasst:

In die `/etc/console-setup/remap.inc` habe ich folgende Zeilen eingefügt:

Code: Alles auswählen

# define backtab / shift-tab
shift keycode 15 = F100
string F100 = "\033[Z"
Damit das Mapping dann beim Booten auch geladen wird, folgende Zeile in die `/etc/default/keyboard`:

Code: Alles auswählen

KMAP=/etc/console-setup/remap.inc
Das war's auch schon. Mein vim-mapping auf <S-Tab> funktioniert wunderprächtig!

Vielen Dank für Eure Hilfe!

mutetella

P.S. Ein junges Mädchen von vielleicht 12 Jahren wurde, nachdem sie ein Violinkonzert beendet hatte, von einem Journalisten gefragt, ob das denn nicht unglaublich schwierig sei. Ihre Antwort darauf: "Wenn man es kann ist es eigentlich ganz einfach!"

Bei Dingen wie dieser keymapping Geschichte fällt mir das immer gern ein... :D

Antworten