| <!doctype linuxdoc system> |
| |
| <article> |
| |
| <title>The Linux keyboard and console HOWTO |
| <author>Andries Brouwer, <tt/aeb@cwi.nl/ |
| <date>v2.13, 2002-10-12 |
| |
| <abstract>This note contains some information about the Linux keyboard |
| and console, and the use of non-ASCII characters. |
| It describes Linux 2.0. |
| <nidx>HOWTOs!keyboard and console</nidx> |
| <nidx>HOWTOs!console and keyboard</nidx> |
| </abstract> |
| |
| <toc> |
| |
| <sect>Useful programs<p> |
| <nidx>programs!keyboard-related</nidx> |
| <nidx>programs!console-related</nidx> |
| <nidx>keyboard!programs related to</nidx> |
| <nidx>console!programs related to</nidx> |
| |
| The following packages contain keyboard or console related programs. |
| <p> |
| <tt/kbd-1.06.tar.gz/ contains <tt/loadkeys/, <tt/dumpkeys/, <tt/showkey/, |
| <tt/setmetamode/, <tt/setleds/, <tt/setfont/, <tt/showconsolefont/, |
| <tt/mapscrn/, <tt/kbd_mode/, <tt/kbdrate/, <tt/loadunimap/, <tt/chvt/, |
| <tt/resizecons/, <tt/deallocvt/, <tt/getkeycodes/, <tt/setkeycodes/. |
| It also contains <tt/openvt/, formerly called <tt/open/. |
| <p> |
| There exists a clone of the kbd package, namely <tt/console-tools/, |
| that contains more or less the same stuff. The latest version, |
| <tt/console-tools-0.3.3/ is roughly up-to-date with <tt/kbd-0.99/. |
| <p> |
| <tt/SVGATextMode-1.10/ contains <tt/SVGATextMode/, a program that |
| obsoletes <tt/resizecons/. |
| <p> |
| <tt/util-linux-2.11/ contains <tt/setterm/. |
| <p> |
| <tt/sh-utils-1.12/ contains <tt/stty/. |
| <p> |
| See also <tt/dynamic-vc-1.2.tar.gz/ and <tt/consd-1.3.tgz/ for |
| programs that exploit the `Keyboard Signal' key. Very primitive |
| versions are <tt/spawn_login/ or <tt/spawn_console/ found in the kbd package. |
| <p> |
| See <htmlurl name="font.tgz" url="http://www.cix.co.uk/~mayday/font.tgz"> |
| for a package that handles console fonts. |
| <p> |
| Packages like <tt/recode/ and <tt/konwert-1.8/ allow one to convert |
| between different character encodings. |
| <p> |
| |
| The X distribution contains <tt/xmodmap/, <tt/xset/, <tt/kbd_mode/. |
| (See also X386keybd(1) for the situation under XFree86 1.3, |
| and Xserver(1) for the XKEYBOARD extension under X11R6.) |
| A handy interface to <tt/xmodmap/ is <tt/xkeycaps/, see |
| <htmlurl name="http://www.jwz.org/xkeycaps/" url="www.jwz.org/xkeycaps/">. |
| |
| <tt/termcap-2.0.8.tar.gz/ contains <tt/termcap/, an old terminal |
| capabilities data base. <tt/ncurses-1.9.9e.tar.gz/ contains the |
| <tt/termlib/ data base which obsoletes <tt/termcap/. (However, |
| there are still many programs using <tt/termcap/.) |
| |
| See loadkeys(1), setleds(1) and setmetamode(1) for the codes generated by the |
| various keys and the setting of leds when not under X. Under X, see xmodmap(1) |
| and xset(1). |
| |
| See setfont(8) for loading console fonts. Many people will want to |
| load a font like <tt/iso01.f16/ because the default font is the |
| hardware font of the video card, and often is a `Code Page 437' font |
| missing accented characters and other Latin-1 symbols. |
| |
| See setterm(1) and kbdrate(8) for properties such as foreground and background |
| colors, screen blanking and character repeat rate when not under X. |
| Under X, see xset(1), also for key click and bell volume. |
| |
| The file <tt>/etc/termcap</tt> defines the escape sequences |
| used by many programs addressing the console (or any other terminal). |
| See termcap(5). |
| A more modern version is found in <tt>/usr/lib/terminfo</tt>. |
| See terminfo(5). Terminfo files are compiled |
| by the terminfo compiler <tt>/usr/lib/terminfo/tic</tt>, see tic(1). |
| Their contents can be examined using the program <tt/infocmp/, |
| see infocmp(1). |
| |
| The Linux console sequences are documented in console_codes(4). |
| |
| The package <tt>funkey</tt> by Rick van Rein provides support |
| for all these new keys modern keyboards have. See |
| <htmlurl url="http://rick.vanrein.org/linux/funkey" |
| name="rick.vanrein.org/linux/funkey">. |
| |
| <sect>Keyboard generalities<p> |
| <nidx>keyboard!theory of operation</nidx> |
| |
| You press a key, and the keyboard controller sends |
| <htmlurl name="scancodes" |
| url="http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html"> |
| to the kernel keyboard driver. Some keyboards can be programmed, |
| but usually the scancodes corresponding to your keys are fixed. |
| The kernel keyboard driver just transmits whatever it receives |
| to the application program when it is in <em>scancode mode</em>, |
| like when <tt/X/ is running. Otherwise, it parses the stream of scancodes |
| into keycodes, corresponding to key press or key release events. |
| (A single key press can generate up to 6 scancodes.) |
| These keycodes are transmitted to the application program when it is |
| in <em>keycode mode</em> (as used, for example, by <tt/showkey/ |
| and some X servers). |
| Otherwise, these keycodes are looked up in the keymap, and the character |
| or string found there is transmitted to the application, or the action |
| described there is performed. |
| (For example, if one presses and releases the <tt/a/ key, then the keyboard |
| produces scancodes 0x1e and 0x9e, this is converted to keycodes 30 and 158, |
| and then transmitted as 0141, the ASCII or latin-1 code for `a'; |
| if one presses and releases <tt/Delete/, then the keyboard produces scancodes |
| 0xe0 0x53 0xe0 0xd3, these are converted to keycodes 111 and 239, and then |
| transmitted as the 4-symbol sequence ESC [ 3 ˜, all assuming |
| a US keyboard and a default keymap. An example of a key combination to which |
| an action is assigned is Ctrl-Alt-Del.) |
| <P> |
| The translation between unusual scancodes and keycodes can be set using the |
| utility <tt/setkeycodes/ - only few people will need it. |
| The translation between keycodes and characters or strings or actions, that is, |
| the keymap, is set using the utilities <tt/loadkeys/ and <tt/setmetamode/. |
| For details, see getkeycodes(8), setkeycodes(8), dumpkeys(1), loadkeys(1), |
| setmetamode(1). The format of the files output by <tt/dumpkeys/ and read |
| by <tt/loadkeys/ is described in keymaps(5). |
| <P> |
| Where it says `transmitted to the application' in the above description, |
| this really means `transmitted to the terminal driver'. That is, further |
| processing is just like that of text that comes in over a serial line. |
| The details of this processing are set by the program <tt/stty/. |
| |
| <sect>Console generalities<p> |
| <nidx>console!theory of operation</nidx> |
| |
| Conversely, when you output something to the console, it first undergoes |
| the standard tty processing, and then is fed to the console driver. |
| The console driver emulates a VT100, and parses the input in order to |
| recognize VT100 escape sequences (for cursor movement, clear screen, etc.). |
| The characters that are not part of an escape sequence are first converted |
| into Unicode, using one of four mapping tables if the console was not |
| in UTF-8 mode to start with, then looked up in the table describing |
| the correspondence between Unicode values and font positions, |
| and the obtained 8- or 9-bit font indices are then written to video memory, |
| where they cause the display of character shapes found in the video card's |
| character ROM. |
| One can load one's own fonts into character ROM using <tt/setfont/. |
| The obsolete programs <tt/loadunimap/ and <tt/mapscrn/ can be used |
| to manipulate the Unicode map belonging to the font, or the mapping |
| table of the console. More details will be given below. |
| |
| There are many consoles (called <it/Virtual Consoles/ or |
| <it/Virtual Terminals/, abbreviated VCs or VTs) that share the same |
| screen. You can use them as independent devices, either to run |
| indendent login sessions, or just to send some output to, perhaps |
| from <tt/top/, or the tail of the system log or so. |
| See below (`Console switching') on how to set them up and |
| switch between them. |
| |
| |
| <sect>Resetting your terminal<p> |
| <nidx>terminal!resetting</nidx> |
| <nidx>screen!clearing</nidx> |
| <nidx>console!clearing</nidx> |
| |
| There is garbage on the screen, or all your keystrokes are echoed |
| as line drawing characters. What to do? |
| |
| Many programs will redraw the screen when Ctrl-L is typed. This might |
| help when there is some modem noise or broadcast message on your screen. |
| The command <tt/clear/ will clear the screen. |
| |
| The command <tt/reset/ will reset the console driver. This helps when |
| the screen is full of funny graphic characters, and also if it is |
| reduced to the bottom line. If you don't have this command, or if it |
| does something else, make your own by putting the following two lines |
| in an executable file <tt/reset/ in your PATH: |
| <tscreen><verb> |
| #!/bin/sh |
| echo -e \\033c |
| </verb></tscreen> |
| that is, you want to send the two characters ESC c to the console. |
| |
| Why is it that the display sometimes gets confused and gives you |
| a 24-line or 1-line screen, instead of the usual 25 lines? |
| Well, the main culprit is the use of <tt/TERM=vt100/ (or some other |
| entry with 24 lines) instead of <tt/TERM=linux/ when logged in remotely. |
| If this happens on <tt>/dev/tty2</tt> then typing |
| <tscreen><verb> |
| % cat > /dev/tty2 |
| ^[c |
| ^D |
| </verb></tscreen> |
| on some other VT (where 4 symbols are typed to <tt/cat/: ESC, c, ENTER, |
| Ctrl-D) and refreshing the screen on <tt>/dev/tty2</tt> |
| (perhaps using Ctrl-L) will fix things. Of course the permanent fix |
| is to use the right termcap or terminfo entry. |
| A command that only changes the number of lines is |
| <tscreen><verb> |
| % echo -e "\033[1;25r" |
| </verb></tscreen> |
| |
| Why is it that you sometimes get a lot of line-drawing characters, |
| e.g., after catting a binary to the screen? |
| Well, there are various character set changing escape sequences, |
| and by accident your binary might contain some of these. |
| The ESC c is a general reset, a cure for all, but if you know |
| precisely what went wrong you can repair it without resetting |
| other console attributes. For example, after |
| <tscreen><verb> |
| % cat |
| ^N |
| ^D |
| </verb></tscreen> |
| your shell prompt will be all line-drawing characters. |
| Now do (typing blindly) |
| <tscreen><verb> |
| % cat |
| ^O |
| ^D |
| </verb></tscreen> |
| and all is well again. (Three symbols typed to each <tt/cat/: |
| Ctrl-N (or Ctrl-O), ENTER, Ctrl-D.) To understand what is happening, |
| see `The console character sets' below. |
| |
| If you loaded some strange font, and want to return to the default, |
| <tscreen><verb> |
| % setfont |
| </verb></tscreen> |
| will do (provided you stored the default font in the default place). |
| If this default font does not contain an embedded Unicode map (and |
| gives the wrong symbols for accented characters), then say |
| <tscreen><verb> |
| % loadunimap |
| </verb></tscreen> |
| For example, if I do |
| <tscreen><verb> |
| % loadkeys de-latin1 |
| </verb></tscreen> |
| then I have a German keyboard, and the key left of the Enter key |
| gives me a-umlaut. This works, because the a-umlaut occurs |
| on the CP437 code page and the kernel Unicode map is initialized |
| to CP437, and my video card has a CP437 font built-in. |
| If I now load an ISO 8859-1 font with |
| <tscreen><verb> |
| % setfont iso01.f16 |
| </verb></tscreen> |
| then everything still works, because <tt/setfont/ invalidates the kernel |
| Unicode map (if there is no Unicode map attached to the font), and without |
| map the kernel goes directly to the font, and that is precisely correct |
| for an ISO 8859-1 system with <tt/iso01.f16/ font. |
| But going back to the previous font with |
| <tscreen><verb> |
| % setfont |
| </verb></tscreen> |
| gives capital Sigma's instead of a-umlaut - all accented letters |
| are mixed up because also this font has no embedded Unicode map. After |
| <tscreen><verb> |
| % loadunimap |
| </verb></tscreen> |
| which loads the default Unicode map (which is right for the default |
| font) all works correctly again. Usually <tt/loadunimap/ is not |
| invoked directly, but via <tt/setfont/. Thus, the previous two |
| commands may be replaced by |
| <tscreen><verb> |
| % setfont -u def |
| </verb></tscreen> |
| These days most fonts have embedded Unicode maps (often this is |
| indicated by the extension <tt/.psfu/), and none of this nonsense |
| is needed anymore. |
| |
| On very old terminals output involving tabs may require a delay, |
| and you have to say |
| <tscreen><verb> |
| % stty tab3 |
| </verb></tscreen> |
| (see stty(1)). |
| |
| You can change the video mode using <tt/resizecons/ or |
| <tt/SVGATextMode/. Or by rebooting and having "vga=ask" |
| in the LILO configuration file. |
| |
| This usually settles the output side. |
| |
| On the input side there are many things that might be wrong. If <tt/X/ or |
| <tt/DOOM/ or some other program using raw mode crashed, your keyboard may |
| still be in raw (or mediumraw) mode, and you must give the command |
| <tscreen><verb> |
| % kbd_mode -a |
| </verb></tscreen> |
| or |
| <tscreen><verb> |
| % kbd_mode -u |
| </verb></tscreen> |
| to get back to normal 8-bit or Unicode mode again. Of course in this |
| situation it may be difficult to give commands. |
| (See "How to get out of raw mode" below.) |
| |
| If you loaded a bad keymap, then |
| <tscreen><verb> |
| % loadkeys -d |
| </verb></tscreen> |
| loads the default map again, but it may well be difficult to type `-'! |
| An alternative is |
| <tscreen><verb> |
| % loadkeys defkeymap |
| </verb></tscreen> |
| Sometimes even the letters are garbled. It is useful to know that there |
| are four main types of keyboards: QWERTY, QWERTZ, AZERTY and DVORAK. |
| The first three are named after the first six letter keys, and roughly |
| represent the English, German and French speaking countries. |
| Compared to QWERTY, the QWERTZ map interchanges Y and Z. |
| Compared to QWERTY, the AZERTY map interchanges Q and A, W and Z, and has |
| its M right of the L, at the semicolon position. |
| DVORAK has an entirely different letter ordering. |
| There are two types of Turkish keyboard. The so-called `Q'-keyboard |
| has a QWERTY layout, while the `F'-keyboard has an entirely |
| different layout, let us say fgGIod, where G stands for Gbreve |
| and I for dotlessi. |
| |
| <sect1>Keyboard hardware reset<p> |
| <nidx>keyboard!resetting</nidx> |
| |
| Things may be wrong on a lower level than Linux knows about. |
| There are at least two distinct lower levels (keyboard and keyboard controller) |
| where one can give the command "keyboard disable" to the keyboard hardware. |
| Keyboards can often be programmed to use one out of three |
| different sets of scancodes. |
| <p> |
| However, I do not know of cases where this turned out to be |
| a problem. |
| <p> |
| Some keyboards have a remapping capability built in. |
| Stormy Henderson (<tt/stormy@Ghost.Net/) writes: |
| `If it's your keyboard accidently being reprogrammed, you can |
| (on a Gateway AnyKey keyboard) press control-alt-suspend_macro |
| to reset the keys to normal.' |
| |
| <sect>Delete and Backspace<p> |
| <nidx>delete key!problems with</nidx> |
| <nidx>backspace key!problems with</nidx> |
| |
| Getting Delete and Backspace to work just right is nontrivial, |
| especially in a mixed environment, where you talk to console, |
| to <tt/X/, to <tt/bash/, to <tt/emacs/, login remotely, etc. |
| You may have to edit several configuration files to tell all |
| of the programs involved precisely what you want. |
| On the one hand, there is the matter of which keys generate |
| which codes (and how these codes are remapped by e.g. <tt/kermit/ |
| or <tt/emacs/), and on the other hand the question of what functions |
| are bound to what codes. |
| |
| People often complain `my backspace key does not work', as if this |
| key had a built-in function `delete previous character'. |
| Unfortunately, all this key, or any key, does is producing a code, |
| and one only can hope that the kernel tty driver and |
| all application programs can be configured such that |
| the backspace key indeed does function as a `delete previous character' |
| key. |
| |
| Most Unix programs get their tty input via the kernel tty driver |
| in `cooked' mode, and a simple <tt/stty/ command determines the |
| erase character. However, programs like <tt/bash/ and <tt/emacs/ |
| and <tt/X/ do their own input handling, and have to be convinced |
| one-by-one to do the right thing. |
| |
| <sect1>How to tell Unix what character you want to use to delete the last typed character<p> |
| <nidx>stty!using to set erase character</nidx> |
| |
| <tscreen><verb> |
| % stty erase ^? |
| </verb></tscreen> |
| If the character is erased, but in a funny way, then something is |
| wrong with your tty settings. If <tt/echoprt/ is set, then erased characters |
| are enclosed between <tt>\</tt> and <tt>/</tt>. |
| If <tt/echoe/ is not set, then the erase char is echoed |
| (which is reasonable when it is a printing character, like #). |
| Most people will want <tt/stty echoe -echoprt/. Saying <tt/stty sane/ |
| will do this and more. Saying <tt/stty -a/ shows your current settings. |
| How come this is not right by default? It is, if you use the right |
| <tt/getty/. |
| |
| Note that many programs (like <tt/bash/, <tt/emacs/ etc.) have their own |
| keybindings (defined in <tt>˜/.inputrc</tt>, |
| <tt>˜/.emacs</tt> etc.) and are unaffected by the setting |
| of the erase character. |
| |
| The standard Unix tty driver does not recognize a cursor, or keys |
| (like the arrow keys) to move the current position, and hence does not |
| have a command `delete current character' either. But for example |
| you can get <tt/bash/ on the console to recognize the Delete key by putting |
| <tscreen><verb> |
| set editing-mode emacs |
| "\e[3˜":delete-char |
| </verb></tscreen> |
| into <tt>˜/.inputrc</tt>. |
| |
| <sect2>`Getty used to do the right thing with DEL and BS but is broken now?'<p> |
| <nidx>getty!problems with BS and DEL</nidx> |
| |
| Earlier, the console driver would do BS Space BS |
| (<tt>\010\040\010</tt>) |
| when it got a DEL (<tt>\177</tt>). |
| Nowadays, DEL's are ignored (as they should be, |
| since the driver emulates a vt100). Get a better getty, i.e., |
| one that does not output DEL. |
| |
| <sect2>`Login behaves differently at the first and second login attempts?'<p> |
| <nidx>login!problems with BS and DEL</nidx> |
| |
| At the first attempt, you are talking to <tt/getty/. At the second attempt, |
| you are talking to <tt/login/, a different program. |
| |
| <sect1>How to tell Linux what code to generate when a key is pressed<p> |
| <nidx>keyboard!keycode remapping</nidx> |
| <nidx>keycode remapping</nidx> |
| |
| On the console, or, more precisely, when not in (MEDIUM)RAW mode, use |
| <tscreen><verb> |
| % loadkeys mykeys.map |
| </verb></tscreen> |
| and under X use |
| <tscreen><verb> |
| % xmodmap mykeys.xmap |
| </verb></tscreen> |
| Note that (since XFree86-2.1) X reads the Linux settings of the keymaps |
| when initialising the X keymap. Although the two systems are not |
| 100% compatible, this should mean that in many cases the use of |
| <tt/xmodmap/ has become superfluous. |
| |
| For example, suppose that you would like the Backspace key |
| to send a BackSpace (Ctrl-H, octal 010) and the grey Delete key |
| a DEL (octal 0177). Add the following to <tt>/etc/rc.local</tt> |
| (or wherever you keep your local boot-time stuff): |
| <tscreen><verb> |
| /usr/bin/loadkeys << EOF |
| keycode 14 = BackSpace |
| keycode 111 = Delete |
| EOF |
| </verb></tscreen> |
| Note that this will only change the function of these keys |
| when no modifiers are used. (You need to specify a keymaps line |
| to tell which keymaps should be affected if you want to change |
| bindings on more keymaps.) |
| The Linux kernel default lets |
| Ctrl-Backspace generate BackSpace - this is sometimes useful |
| as emergency escape, when you find you can only generate DELs. |
| |
| The left Alt key is sometimes called the Meta key, and by |
| default the combinations AltL-X are bound to the symbol MetaX. |
| But what character sequence is MetaX? |
| That is determined (per-tty) by the Meta flag, set by the command |
| <tt/setmetamode/. The two choices are: ESC X or X or-ed with 0200. |
| |
| Many distributions have a <tt/loadkeys/ command somewhere in the |
| bootup sequence. For example, one may have the name of the desired |
| keymap in <tt>/etc/sysconfig/keyboard</tt> and the <tt/loadkeys/ |
| command that loads it in <tt>/etc/rc.d/init.d/keytable</tt>. |
| Or one may have the actual default keymap in <tt>/etc/default.keytab</tt> |
| and the loadkeys command that loads it in <tt>/etc/rc.d/boot</tt>. |
| Etc. Instead of adding a local modification to the default, one can |
| of course change the default by editing the default keymap or changing |
| the name of the keymap to be loaded at boot time. Note that <tt/loadkeys/ |
| itself has default keymap <tt/defkeymap.map/ located somewhere under |
| <tt>/usr/lib/kbd</tt> or <tt>/usr/share/kbd</tt> (just like all other |
| keymaps) and this may not yet be available in single user boot before |
| <tt>/usr</tt> has been mounted. |
| |
| <sect2>`How do I get a dvorak keyboard?'<p> |
| <nidx>dvorak keyboard</nidx> |
| The command |
| <tscreen><verb> |
| % loadkeys dvorak |
| </verb></tscreen> |
| will give you a dvorak layout, probably by loading |
| something like <tt>/usr/lib/kbd/keymaps/i386/dvorak/dvorak.map.gz</tt>. |
| Under <tt/X/, put |
| <tscreen><verb> |
| XkbLayout "dvorak" |
| </verb></tscreen> |
| in <tt>XF86Config</tt>. |
| |
| <sect2>`Why doesn't the Backspace key generate BackSpace by default?'<p> |
| <nidx>backspace key!not generating correct keycode</nidx> |
| |
| (i) Because the VT100 had a Delete key above the Enter key. |
| <p> |
| (ii) Because Linus decided so. |
| |
| <sect1>How to tell X to interchange Delete and Backspace<p> |
| <nidx>X!swapping DEL, BS</nidx> |
| <nidx>xmodmap!using to swap DEL, BS</nidx> |
| |
| <tscreen><verb> |
| % xmodmap -e "keysym BackSpace = Delete" -e "keysym Delete = BackSpace" |
| </verb></tscreen> |
| Or, if you just want the Backspace key to generate a BackSpace: |
| <tscreen><verb> |
| % xmodmap -e "keycode 22 = BackSpace" |
| </verb></tscreen> |
| Or, if you just want the Delete key to generate a Delete: |
| <tscreen><verb> |
| % xmodmap -e "keycode 107 = Delete" |
| </verb></tscreen> |
| (but usually this is the default binding already). |
| |
| <sect1>How to tell emacs what to do when it receives a Delete or Backspace<p> |
| <nidx>emacs!binding DEL, BS</nidx> |
| |
| Put in your <tt/.emacs/ file lines like |
| <tscreen><verb> |
| (global-set-key "\?" 'help-command) |
| (global-set-key "\C-h" 'delete-backward-char) |
| </verb></tscreen> |
| Of course you can bind other commands to other keys in the same way. |
| Note that various major and minor modes redefine keybindings. |
| For example, in incremental search mode one finds the code |
| <tscreen><verb> |
| (define-key map "\177" 'isearch-delete-char) |
| (define-key map "\C-h" 'isearch-mode-help) |
| </verb></tscreen> |
| This means that it may be a bad idea to use the above two |
| global-set-key commands. There are too many places where |
| there are built-in assumptions about Ctrl-H = help and DEL = delete. |
| That doesn't mean that you have to setup keys so that Backspace |
| generates DEL. But if it doesn't then it is easiest to remap |
| them at the lowest possible level in emacs. |
| |
| <sect1>How to tell emacs to interchange Delete and Backspace<p> |
| <nidx>emacs!swapping DEL, BS</nidx> |
| |
| Put in your <tt/.emacs/ file lines |
| <tscreen><verb> |
| (setq keyboard-translate-table (make-string 128 0)) |
| (let ((i 0)) |
| (while (< i 128) |
| (aset keyboard-translate-table i i) |
| (setq i (1+ i)))) |
| (aset keyboard-translate-table ?\b ?\^?) |
| (aset keyboard-translate-table ?\^? ?\b) |
| </verb></tscreen> |
| Recent versions of emacs have a function <tt/keyboard-translate/ |
| and one may simplify the above to |
| <tscreen><verb> |
| (keyboard-translate ?\C-h ?\C-?) |
| (keyboard-translate ?\C-? ?\C-h) |
| </verb></tscreen> |
| Note that under X emacs can distinguish between Ctrl-h and the |
| Backspace key (regardless of what codes these produce on the console), |
| and by default emacs will view the Backspace key as DEL |
| (and do deletion things, as bound to that character, rather than |
| help things, bound to Ctrl-H). One can distinguish Backspace and Delete, |
| e.g. by |
| <tscreen><verb> |
| (global-unset-key [backspace] ) |
| (global-set-key [backspace] 'delete-backward-char) |
| (global-unset-key [delete] ) |
| (global-set-key [delete] 'delete-char) |
| </verb></tscreen> |
| |
| <sect1>How to tell kermit to interchange Delete and Backspace<p> |
| <nidx>kermit!swapping DEL, BS</nidx> |
| |
| Put in your <tt/.kermrc/ file the lines |
| <tscreen><verb> |
| set key \127 \8 |
| set key \8 \127 |
| </verb></tscreen> |
| |
| <sect1>How to tell xterm to interchange Delete and Backspace<p> |
| <nidx>xterm!swapping DEL, BS</nidx> |
| <tscreen><verb> |
| XTerm*VT100.Translations: #override\n\ |
| <KeyPress> BackSpace : string(0x7f)\n\ |
| <KeyPress> Delete : string(0x08)\n |
| </verb></tscreen> |
| |
| <sect1>How to tell xterm about your favourite tty modes<p> |
| <nidx>xterm!setting tty modes for</nidx> |
| |
| Normally xterm will inherit the tty modes from its invoker. |
| Under <tt/xdm/, the default erase and kill characters are <tt/#/ and <tt/@/, |
| as in good old Unix Version 6. |
| If you don't like that, you might put something like |
| <tscreen><verb> |
| XTerm*ttymodes: erase ^? kill ^U intr ^C quit ^\ eof ^D \ |
| susp ^Z start ^Q stop ^S eol ^@ |
| </verb></tscreen> |
| in <tt>/usr/lib/X11/app-defaults/XTerm</tt> or in |
| <tt>$HOME/.Xresources</tt>, assuming that you have a line |
| <tscreen><verb> |
| xrdb -merge $HOME/.Xresources |
| </verb></tscreen> |
| in your <tt>$HOME/.xinitrc</tt> or <tt>$HOME/.xsession</tt>. |
| |
| <sect1>How to tell non-Motif X applications that the Del key deletes forward<p> |
| Put |
| <tscreen><verb> |
| *Text.translations: #override \ |
| ~Shift ~Meta <Key>Delete: delete-next-character() |
| </verb></tscreen> |
| into <tt>.Xresources</tt> to make non-Motif X applications such as |
| <tt>xfig</tt>, <tt>xedit</tt>, etc., work correctly. (Daniel T. Cobra) |
| |
| <sect1>How to tell xmosaic that the Backspace key generates a DEL<p> |
| <nidx>xmosaic!remapping BS key</nidx> |
| <nidx>Netscape!remapping BS</nidx> |
| |
| Putting |
| <tscreen><verb> |
| *XmText.translations: #override\n\ |
| <Key>osfDelete: delete-previous-character() |
| *XmTextField.translations: #override\n\ |
| <Key>osfDelete: delete-previous-character() |
| </verb></tscreen> |
| in your <tt>$HOME/.Xdefaults</tt> or |
| <tt>$HOME/.Xresources</tt> helps. |
| (What file? The file that is fed to <tt>xrdb</tt>, for example |
| in <tt>.xinitrc</tt>.) |
| |
| The netscape FAQ, however, says: |
| <verb> |
| Why doesn't my Backspace key work in text fields? |
| By default, Linux and XFree86 come with the Backspace and Delete keys |
| misconfigured. All Motif programs (including, of course, Netscape |
| Navigator) will malfunction in the same way. |
| |
| The Motif spec says that Backspace is supposed to delete the previous |
| character and Delete is supposed to delete the following character. |
| Linux and XFree86 come configured with both the Backspace and Delete |
| keys generating Delete. |
| |
| You can fix this by using any one of the xmodmap, xkeycaps, or |
| loadkeys programs to make the key in question generate the BackSpace |
| keysym instead of Delete. |
| |
| You can also fix it by having a .motifbind file; see the man page |
| for VirtualBindings(3). |
| |
| Note: Don't use the *XmText.translations or *XmTextField.translations |
| resources to attempt to fix this problem. If you do, you will blow |
| away Netscape Navigator's other text-field key bindings. |
| </verb> |
| |
| <sect1>A better solution for Motif-using programs, like netscape<p> |
| <nidx>Netscape!remapping BS</nidx> |
| <nidx>Motif!remapping BS</nidx> |
| |
| Ted Kandell (<tt/ted@tcg.net/) suggests the following: |
| |
| Somewhere in your .profile add the following: |
| <tscreen><verb> |
| stty erase ^H |
| </verb></tscreen> |
| If you are using <tt/bash/, add the following lines to your <tt/.inputrc/: |
| <tscreen><verb> |
| "\C-?": delete-char |
| "\C-h": backward-delete-char |
| </verb></tscreen> |
| Add the following lines to your .xinitrc file: |
| <tscreen><verb> |
| xmodmap <<-EOF |
| keycode 22 = BackSpace osfBackSpace |
| keycode 107 = Delete |
| EOF |
| |
| # start your window manager here, for example: |
| #(fvwm) 2>&1 | tee /dev/tty /dev/console |
| |
| stty sane |
| stty erase ^H |
| loadmap <<-EOF |
| keycode 14 = BackSpace |
| keycode 111 = Delete |
| EOF |
| </verb></tscreen> |
| |
| This will definitely work for a PC 101 or 102 key keyboard |
| with any Linux/XFree86 layout. |
| |
| The important part to making Motif apps like Netscape work properly |
| is adding osfBackSpace to keycode 22 in addition to BackSpace. |
| |
| Note that there must be spaces on either side of the = sign. |
| |
| |
| <sect1>What about termcap and terminfo?<p> |
| <nidx>termcap!remapping BS with</nidx> |
| <nidx>terminfo!remapping BS with</nidx> |
| |
| When people have problems with backspace, they tend to look at their termcap |
| (or terminfo) entry for the terminal, and indeed, there does exist a kb |
| (or kbs) capability describing the code generated by the Backspace key. |
| However, not many programs use it, so unless you are having problems with one |
| particular program only, probably the fault is elsewhere. |
| Of course it is a good idea anyway to correct your termcap (terminfo) entry. |
| See also below under "The TERM variable". |
| |
| <sect1>A complete solution<p> |
| There are many possibilities to get a functioning system. |
| Can't you give one complete set of settings that works? |
| <nidx>delete key!a solution</nidx> |
| <nidx>backspace key!a solution</nidx> |
| <p> |
| One way of getting a setup that works in all contexts |
| is to have the Backspace key generate DEL when on the |
| console (or xterm), and BackSpace when under X. |
| Maybe that is most convenient - there are too many X utilities |
| that expect BackSpace, and emacs on the console or xterm |
| expects DEL, while emacs under X can distinguish [BackSpace] |
| from Ctrl-H and does the right thing. |
| <p> |
| What is needed? |
| No loadkeys changes, since the Backspace key already generates |
| DEL by default. No stty settings, they are OK by default. |
| No X settings, they are OK by default. |
| One just has to tell xterm that the Backspace key should generate DEL: |
| put |
| <tscreen><verb> |
| XTerm*VT100.Translations: #override\n\ |
| <KeyPress> BackSpace : string(0x7f)\n\ |
| </verb></tscreen> |
| in <tt/.Xresources/, and |
| <tscreen><verb> |
| xrdb -merge .Xresources |
| </verb></tscreen> |
| in <tt/.xinitrc/, and you are settled. |
| |
| For a much more extensive discussion of these things, and |
| alternative solutions, see |
| <htmlurl url="http://www.ibb.net/~anne/keyboard.html" |
| name="Anne Baretta's page">. |
| |
| <sect>The console character sets<p> |
| <nidx>console character sets</nidx> |
| <nidx>character sets, console</nidx> |
| |
| The kernel first tries to figure out what symbol is meant by any given |
| user byte, and next where this symbol is located in the current font. |
| |
| The kernel knows about 5 translations of bytes into console-screen symbols. |
| In Unicode (UTF-8) mode, the UTF-8 code is just converted directly into |
| Unicode. The assumption is that almost all symbols one needs are present |
| in Unicode, and for the cases where this does not hold the codes |
| 0xf000-0xf1ff are reserved for direct font access. |
| When not in Unicode mode, one of four translation tables is used. |
| The four tables are: a) Latin1 -> Unicode, b) VT100 graphics -> Unicode, |
| c) PC -> Unicode, d) user-defined. |
| |
| There are two character sets, called G0 and G1, and one of them |
| is the current character set. (Initially G0.) |
| Typing Ctrl-N causes G1 to become current, Ctrl-O causes G0 to become current. |
| |
| These variables G0 and G1 point at a translation table, and can be changed |
| by the user. Initially they point at tables a) and b), respectively. |
| The sequences ESC ( B and ESC ( 0 and ESC ( U and ESC ( K cause G0 to point |
| at translation table a), b), c) and d), respectively. |
| The sequences ESC ) B and ESC ) 0 and ESC ) U and ESC ) K cause G1 to point |
| at translation table a), b), c) and d), respectively. |
| |
| The sequence ESC c causes a terminal reset, which is what you want if the |
| screen is all garbled. The oft-advised <tt/echo ˆVˆO/ will only |
| make G0 current, but there is no guarantee that G0 points at table a). |
| In some distributions there is a program reset(1) that just does |
| <tt>echo ˆ[c</tt>. |
| If your termcap entry for the console is correct (and has an entry |
| <tt>:rs=\Ec:</tt>), then also <tt/setterm -reset/ will work. |
| |
| The user-defined mapping table can be set using mapscrn(8). |
| The result of the mapping is that if a symbol c is printed, the symbol |
| <tt>s = map[c]</tt> is sent to the video memory. The bitmap that corresponds to |
| <tt/s/ is found in the character ROM, and can be changed using setfont(8). |
| |
| <sect>Console switching<p> |
| <nidx>console!switching</nidx> |
| |
| By default, console switching is done using Alt-Fn or Ctrl-Alt-Fn. |
| Under <tt/X/ (or recent versions of <tt/dosemu/), only Ctrl-Alt-Fn works. |
| Many keymaps will allow cyclic walks through all allocated consoles |
| using Alt-RightArrow and Alt-LeftArrow. |
| |
| XFree86 1.3 does not know that Alt is down when you switch to the X |
| window. Thus, you cannot switch immediately to some other VT again |
| but have to release Alt first. |
| In the other direction this should work: the kernel always keeps |
| track of the up/down status of all keys. (As far as possible: on some |
| keyboards some keys do not emit a scancode when pressed (e.g.: the PFn |
| keys of a FOCUS 9000) or released (e.g.: the Pause key of many keyboards).) |
| |
| XFree86 1.3 saves the fonts loaded in the character ROMs when started, |
| and restores it on a console switch. Thus, the result of <tt/setfont/ on |
| a VT is wiped out when you go to X and back. |
| Using <tt/setfont/ under X will lead to funny results. |
| |
| One can change VT under program control using the <tt/chvt/ command. |
| |
| <sect1>Changing the number of Virtual Consoles<p> |
| <nidx>console!changing number of</nidx> |
| |
| This question still comes up from time to time, but the answer is: |
| you already have enough of them. |
| Since kernel version 1.1.54, there are between 1 and 63 virtual |
| consoles. A new one is created as soon as it is opened. It is |
| removed by the utility <tt/deallocvt/ (but it can be removed only when |
| no processes are associated to it anymore, and no text on it has been |
| selected by programs like <tt/selection/ or <tt/gpm/). |
| |
| For older kernels, change the line |
| <tscreen><verb> |
| #define NR_CONSOLES 8 |
| </verb></tscreen> |
| in <tt>include/linux/tty.h</tt> (don't increase this number beyond 63), |
| and recompile the kernel. |
| |
| If they do not exist yet, create the tty devices with <tt/MAKEDEV/ |
| or <tt/mknod tty/N <tt/c 4/ N where N denotes the tty number. For example, |
| <tscreen><verb> |
| for i in 9 10 11 12; do mknod /dev/tty$i c 4 $i; done |
| </verb></tscreen> |
| or, better (since it also takes care of owner and permissions), |
| <tscreen><verb> |
| for i in 9 10 11 12; do /dev/MAKEDEV tty$i; done |
| </verb></tscreen> |
| |
| If you want the new VCs to run <tt/getty/, add lines in <tt>/etc/inittab</tt>. |
| (But it is much better to have only two <tt/getty/'s running, |
| and to create more consoles dynamically as the need arises. |
| That way you'll have more memory when you don't use all these consoles, |
| and also more consoles, in case you really need them. |
| Edit <tt>/etc/inittab</tt> and comment out all <tt/getty/'s except |
| for the first two.) |
| |
| When the consoles are allocated dynamically, it is usually easiest |
| to have only one or two running <tt/getty/. More are opened by |
| <tt>open -l -s bash</tt>. Unused consoles (without associated processes) |
| are deallocated using <tt/deallocvt/ (formerly <tt/disalloc/). |
| But, you say, I am involved in activities when I suddenly need more |
| consoles, and do not have a bash prompt available to give the <tt/open/ |
| command. |
| Fortunately it is possible to create a new console upon a single |
| keystroke, regardless of what is happening at the current console. |
| |
| If you have <tt/spawn_login/ from <tt/kbd-1.04.tar.gz/ and you put |
| <tscreen><verb> |
| loadkeys << EOF |
| alt keycode 103 = Spawn_Console |
| EOF |
| spawn_login & |
| </verb></tscreen> |
| in <tt>/etc/rc.local</tt>, then typing Alt-UpArrow will create a fresh VC |
| running <tt/login/ (and switch to it). With <tt/spawn_console &/ instead of |
| <tt/spawn_login &/ you'll have bash running there. |
| See also <tt>open-1.4.tgz</tt> and <tt/dynamic-vc-1.1.tar.gz/. |
| |
| What action should be taken upon this Spawn_Console keypress |
| can also be set in <tt>/etc/inittab</tt> under <tt/kbrequest/, |
| if you have a recent <tt/init/. See inittab(5). |
| |
| (This action can be something entirely different - I just called |
| the key Spawn_Console because that is what I used it for. |
| When used for other purposes it is less confusing to use |
| its synonym KeyboardSignal. |
| For example, some people like to put the lines |
| <tscreen><verb> |
| kb::kbrequest:/sbin/shutdown -h now |
| </verb></tscreen> |
| in <tt>/etc/inittab</tt>, and |
| <tscreen><verb> |
| control alt keycode 79 = KeyboardSignal |
| control alt keycode 107 = KeyboardSignal |
| </verb></tscreen> |
| in their keymap. Now Ctrl-Alt-End will do a system shutdown.) |
| |
| You can only login as "root" on terminals listed in <tt>/etc/securetty</tt>. |
| There exist programs that read terminal settings from files |
| <tt>/etc/ttys</tt> and <tt>/etc/ttytype</tt>. If you have such |
| files, and create additional consoles, then it might be a good idea |
| to also add entries for them in these files. |
| |
| <sect>Ctrl-Alt-Del and other special key combinations<p> |
| |
| <sect1>Ctrl-Alt-Del (Boot)<p> |
| <nidx>ctrl-alt-del!action taken by</nidx> |
| |
| If you press Ctrl-Alt-Del (or whatever key was assigned the keysym Boot by |
| loadkeys) then either the machine reboots immediately (without sync), or |
| <tt/init/ is sent a SIGINT. The former behaviour is the default. The default |
| can be changed by root, using the system call reboot(), see ctrlaltdel(8). |
| Some <tt/init/'s change the default. What happens when <tt/init/ gets SIGINT depends |
| on the version of <tt/init/ used - often it will be determined by the pf entry in |
| <tt>/etc/inittab</tt> (which means that you can run an arbitrary program |
| in this case). |
| In the current kernel Ctrl-AltGr-Del is no longer by default assigned to Boot. |
| |
| <sect1>Other combinations<p> |
| <nidx>keyboard!special key combinations</nidx> |
| <nidx>key combinations, special</nidx> |
| |
| <verb> |
| Name Default binding |
| ------------------------------- |
| Show_Memory Shift-Scrollock |
| Show_Registers AltGr-ScrollLock |
| Show_State Ctrl-ScrollLock |
| Console_n Alt-Fn and Ctrl-Alt-Fn (1 <= n <= 12) |
| Console_{n+12} AltGr-Fn (1 <= n <= 12) |
| Incr_Console Alt-RightArrow |
| Decr_Console Alt-LeftArrow |
| Last_Console Alt[Gr]-PrintScreen |
| Scroll_Backward Shift-PageUp |
| Scroll_Forward Shift-PageDown |
| Caps_On (CapsLock is a toggle; this key sets) |
| Compose Ctrl-. |
| </verb> |
| |
| <sect1>X Combinations<p> |
| <nidx>keyboard!key combinations for X</nidx> |
| <nidx>key combinations, X</nidx> |
| <nidx>X!key combinations for</nidx> |
| |
| <verb> |
| Ctrl-Alt-Fn Switch to VT n |
| Ctrl-Alt-KP+ Next mode |
| Ctrl-Alt-KP- Previous mode |
| Ctrl-Alt-Backspace Kill X |
| </verb> |
| On some motherboards, Ctrl-Alt-KP- and Ctrl-Alt-KP+ will be equivalent to |
| pressing the Turbo button. That is, both will produce the scancodes |
| 1d 38 4a ca b8 9d and 1d 38 4e ce b8 9d, and both will switch between |
| Turbo (>= 25MHz) and non-Turbo (8 or 12 MHz). |
| (Often these key combinations only function this way when enabled |
| by jumpers on the motherboard.) |
| |
| Perry F Nguyen (<tt/pfnguyen@netcom22.netcom.com/) writes: |
| AMI BIOS has a feature that locks up the keyboard and flashes the LED's |
| if the Ctrl-Alt-Backspace combination is pressed while a BIOS password |
| is enabled, until the CMOS/BIOS password is typed in. |
| |
| On some SiS based motherboards the combination Ctrl-Alt-Backspace |
| will cause a power off, or puts the machine in power save mode. |
| (Reported for SiS 630 and for SiS645DX.) |
| |
| <sect1>Dosemu Combinations<p> |
| <nidx>key combinations!dosemu</nidx> |
| <nidx>dosemu!key combinations for</nidx> |
| |
| <verb> |
| Ctrl-Alt-Fn Switch to VT n (from version 0.50; earlier Alt-Fn) |
| Ctrl-Alt-PgDn Kill dosemu (when in RAW keyboard mode) |
| (and many other combinations - see the dosemu documentation) |
| </verb> |
| |
| <sect1>Composing symbols<p> |
| <nidx>keyboard!composing symbols with</nidx> |
| <nidx>symbols!composing with keyboard</nidx> |
| |
| One symbol may be constructed using several keystrokes. |
| <itemize> |
| <item> |
| LeftAlt-press, followed by a decimal number typed on the keypad, followed |
| by LeftAlt-release, yields the symbol with code given by this number. |
| (In Unicode mode this same mechanism, but then with 4 hexadecimal digits, |
| may be used to define a Unicode symbol.) |
| <item> |
| A dead diacritic followed by a symbol, yields that symbol adorned with |
| that diacritic. If the combination is undefined, both keys are taken |
| separately. |
| Which keys are dead diacritics is user-settable; none is by default. |
| Five (since 2.0.25 six) dead diacritics can be defined (using loadkeys(1)): |
| dead_grave, dead_acute, dead_circumflex, dead_tilde, dead_diaeresis |
| (and dead_cedilla). |
| Precisely what this adorning means is also user-settable: |
| dead-diacritic, symbol is equivalent to Compose + diacritic + symbol. |
| <item> |
| Compose followed by two symbols yields a combination symbol. These |
| combinations are user-settable. Today there are 68 combinations |
| defined by default; you can see them by saying "dumpkeys | grep compose". |
| <item> |
| Then there are `Sticky' modifier keys (since 1.3.33). For example, |
| one can type Ctrl-C as SControl, C and Ctrl-Alt-BackSpace as SControl, |
| SAlt, BackSpace. |
| </itemize> |
| |
| Note that there are at least four such composition mechanisms: |
| <enum> |
| <item> |
| The Linux keyboard driver mechanism, used in conjunction with loadkeys. |
| <item> |
| The X mechanism - see X386keybd(1), later XFree86kbd(1). |
| Under X11R6: edit <tt>/usr/X11R6/lib/X11/locale/iso8859-1/Compose</tt>.<p> |
| See also Andrew D. Balsa's comments at |
| <htmlurl url="http://wauug.erols.com/~balsa/linux/deadkeys/index.html" |
| name="http://wauug.erols.com/~balsa/linux/deadkeys/index.html">. |
| <item> |
| The emacs mechanism obtained by loading "iso-insert.el" or |
| calling `iso-accents-mode'. |
| <item> |
| The vim mechanism: insert a composed symbol by pressing Ctrl-K |
| followed by two symbols. A list of the possible combinations is |
| obtained by the command <tt>:digraphs</tt>. |
| </enum> |
| For X the order of the two symbols is arbitrary: both Compose-,-c and |
| Compose-c-, yield a c-cedilla; for Linux and emacs only the former sequence |
| works by default. For X and vim the list of compose combinations is fixed. |
| Linux and emacs are flexible. |
| The default lists are somewhat similar, but the details are different. |
| |
| <sect1>The SysRq key<p> |
| <nidx>SysRq key</nidx> |
| In case your kernel was compiled with CONFIG_MAGIC_SYSRQ enabled |
| (a feature that is present since Linux 2.1.43) |
| there is a single key (defined in <tt><linux/keyboard.h></tt>) |
| to which special system functions are attached, regardless of the |
| current keyboard mode. For the PC architecture this special key is, |
| naturally, the Alt+SysRq key, and any of the two Alt keys will work. |
| (Note that if CONFIG_MAGIC_SYSRQ was not enabled, the default action |
| of this key is to return to the previous console.) |
| <p> |
| If you press this key, do not release it, and hit another key, |
| a corresponding action is performed. The action is performed whether |
| anybody is logged in or not, is root or not. For the details, see |
| <tt>drivers/char/sysrq.c</tt>. Since this feature is meant only |
| for kernel hackers, that should suffice. Still, let me add a few |
| remarks. |
| <p> |
| For the key r the keyboard mode is reset to K_XLATE. |
| For the key k a SAK and console reset is done. |
| For the key b the machine is rebooted immediately. |
| (See, not something you want to have enabled on a production machine.) |
| For the key o the power is turned off (when the machine is capable of that). |
| For the key s an emergency sync is scheduled. |
| For the key u an emergency read-only remount is scheduled. |
| For the keys p,t,m various information is shown |
| (namely the same information also shown for RAlt,RCtrl,RShift+ScrollLock). |
| For the keys e,i,l all processes get a SIG_TERM or SIG_KILL, respectively; |
| for l even the init process is killed. |
| Digits set the log level. Anything else prints a short summary: |
| <tt>SysRq: unRaw saK Boot Off Sync Unmount showPc showTasks showMem |
| loglevel0-8 tErm kIll killalL</tt>. |
| <p> |
| Note: These are very dangerous actions! And they do not use your |
| keymap - indeed, are meant for emergency cases where the state |
| of your keymap, or even of the entire kernel, is uncertain. |
| If you use a dvorak keyboard - bad luck! Most other people will |
| be able to survive: the dangerous letters A,M,Q,W,Y,Z that are |
| differently placed on English, French and German keyboards, are |
| not used for actions. (But if your finger slips and you hit L |
| instead of K - bye bye to your system.) |
| <p> |
| In Linux 2.3.13 the possibility to enable/disable SysRq was added. |
| <tscreen><verb> |
| echo 0 > /proc/sys/kernel/sysrq |
| </verb></tscreen> |
| will disable it (if the kernel was compiled with CONFIG_MAGIC_SYSRQ). |
| |
| <sect1>Problems<p> |
| A good keyboard accurately reports multiple key presses. |
| Especially for people using a keyboard as Braille input device, |
| where they have to be able to press up to six keys simultaneously, |
| this is important. Many modern keyboards fail here due to sloppy |
| design and testing - they misreport or fail in other ways when |
| four or more keys are pressed simultaneously, sometimes already |
| when two non-modifier keys are pressed simultaneously. |
| This affects Linux users a bit: the SysRq key is not a modifier key, |
| and people report problems using Alt-SysRq-<it>X</it> for various |
| letters or digits <it>X</it>. |
| <p> |
| Long ago a similar problem (`ghosting') was caused by the design |
| of the scan matrix: when three keys were pressed a fourth was |
| also seen. That problem was solved by the use of diodes. |
| Today it is the interface logic that is deficient. |
| |
| <sect>How to get out of raw mode<p> |
| <nidx>raw mode, exiting</nidx> |
| |
| If some program using K_RAW keyboard mode exits without restoring the keyboard |
| mode to K_XLATE, then it is difficult to do anything - not even Ctrl-Alt-Del |
| works. However, it is sometimes possible to avoid hitting the reset button. |
| (And desirable as well: your users may get angry if you kill their Hack game |
| by rebooting; you might also damage your file system.) |
| Easy solutions involve logging in from another terminal or another machine |
| and doing <tt>kbd_mode -a</tt>. |
| The procedure below assumes that no X is running, that the display is in |
| text mode, and that you are at your bash prompt, that you are using a US |
| keyboard layout, and that your interrupt character is Ctrl-C. |
| |
| Step 1. Start X. |
| As follows: press 2 (and don't release), press F12 (and don't release) |
| and immediately afterwards press = . This starts X. |
| (Explanation: if a key press produces keycode K, then the key release |
| produces keycode K+128. Probably your shell does not like these high |
| characters, so we avoid generating them by not releasing any key. |
| However, we have to be quick, otherwise key repeat starts. The digit 2 |
| produces a Ctrl-C that discards previous junk, the F12 produces an X |
| and the = a Return.) |
| Probably your screen will be grey now, since no <tt/.xinitrc/ was specified. |
| However, Ctrl-Alt-Fn will work and you can go to another VT. |
| (Ctrl-Alt-Backspace also works, but that exits X, and gets you back into |
| the previous state, which is not what you want.) |
| |
| Step 2. Setup to change the keyboard mode. |
| (For example, by <tt>sleep 5; kbd_mode -a</tt>.) |
| |
| Step 3. Leave X again. |
| Alt-Fx (often Alt-F7) brings you back to X, and then Ctrl-Alt-Backspace |
| exits X. Within 5 seconds your keyboard will be usable again. |
| |
| If you want to prepare for the occasion, then make |
| <tt>\215A\301</tt> (3 symbols) an alias for <tt/kbd_mode -a/. |
| Now just hitting = F7 = (3 symbols) will return you to sanity. |
| |
| <sect>The keyboard LEDs<p> |
| <nidx>LEDs, keyboard</nidx> |
| <nidx>keyboard!LEDs on</nidx> |
| |
| 1. There are per-tty keyboard flags: |
| each VC has its own NumLock, CapsLock, ScrollLock. |
| By default these keyboard flags are shown in the LEDs. |
| The usual way to change them is by pressing the corresponding key. |
| (Side remark: pressing the NumLock key when in application key mode |
| will not change the NumLock status, but produce an escape sequence. |
| If you want the NumLock key to always change the Numlock status, |
| bind it to Bare_Num_Lock.) |
| |
| 2. Next, there are per-tty default keyboard flags, |
| to initialize the keyboard flags when a reset occurs. |
| Thus if you want NumLock on all the time, that is possible. |
| The usual way to change them is by `<tt/setleds -D/ ...'. |
| |
| 3. There is the possibility that the leds do not reflect |
| the keyboard flags, but something else. |
| <p> |
| 3A. This something else can be three bits somewhere in the kernel - |
| which can be used if you want to monitor some hardware or software |
| status bit(s). If you want this, edit the kernel source to call |
| <tt/register_leds()/ somewhere. |
| <p> |
| 3B. This something else can also be whatever some user program wants |
| to show in the LEDs. Thus, people who like such things can make |
| nice patterns of lights. If you want this, use the KDSETLED ioctl. |
| |
| This latter use is not per-tty, but the choice between former |
| and latter use is per-tty. |
| |
| Summarizing: Each tty has a flag <tt/kbd->ledmode/. |
| If this has the value LED_SHOW_FLAGS then the keyboard flags |
| (NumLock etc.) of that tty are shown. |
| If this has the value LED_SHOW_MEM then three selected memory |
| addresses are shown. |
| If this has the value LED_SHOW_IOCTL then the leds show whatever |
| value was last assigned to them using the KDSETLED ioctl. |
| |
| One may add that X uses ioctl's to set the LEDs, but fails |
| to reset its VT when it exits, so after using X there may |
| be one VT that is not in the default LED_SHOW_FLAGS state. |
| This can be fixed by doing `<tt/setleds -L/' on that VT. |
| See setleds(1). |
| |
| <sect>The TERM variable<p> |
| <nidx>TERM environment variable</nidx> |
| <nidx>environment variables!TERM</nidx> |
| |
| Many programs use the <tt/TERM/ variable and the database |
| <tt>/etc/termcap</tt> or <tt>/usr/lib/terminfo/*</tt> to decide |
| which strings to send for clear screen, move cursor, etc., |
| and sometimes also to decide which string is sent |
| by the users backspace key, function keys etc. |
| This value is first set by the kernel (for the console). |
| Usually, this variable is re-set by <tt/getty/, using <tt>/etc/ttytype</tt> or |
| the argument specified in <tt>/etc/inittab</tt>. |
| Sometimes, it is also set in <tt>/etc/profile</tt>. |
| |
| Older systems use <tt/TERM=console/ or <tt/TERM=con80x25/. Newer systems (with |
| ncurses 1.8.6) use the more specific <tt/TERM=linux/ or <tt/TERM=linux-80x25/. |
| However, old versions of <tt/setterm/ test for <tt/TERM=con*/ and hence fail |
| to work with <tt/TERM=linux/. |
| |
| Since kernel version 1.3.2, the kernel default for the console is |
| <tt/TERM=linux/. |
| |
| If you have a termcap without entry for linux, add the word linux |
| to the entry for the console: |
| <tscreen><verb> |
| console|con80x25|linux:\ |
| </verb></tscreen> |
| and make <tt>/usr/lib/terminfo/l/linux</tt> a copy of or symbolic link to |
| <tt>/usr/lib/terminfo/c/console</tt>. |
| |
| <sect1>Terminfo<p> |
| <nidx>terminfo</nidx> |
| |
| The terminfo entry for the linux console from ncurses 1.8.6 misses the |
| entry <tt>kich1=\E[2˜</tt>, needed by some programs. |
| Edit the file and <tt/tic/ it. |
| |
| <sect>How to make other programs work with non-ASCII chars<p> |
| <nidx>non-ASCII characters, using</nidx> |
| |
| In the bad old days this used to be quite a hassle. Every separate |
| program had to be convinced individually to leave your bits alone. |
| Not that all is easy now, but recently a lot of gnu utilities have |
| learned to react to <tt/LC_CTYPE=iso_8859_1/ or <tt/LC_CTYPE=iso-8859-1/. |
| Try this first, and if it doesn't help look at the hints below. |
| Note that in recent versions of libc the routine setlocale() only |
| works if you have installed the locale files (e.g. in |
| <tt>/usr/lib/locale</tt>). |
| |
| NOTE! The above was written years ago. Today locale stuff is a bit different. |
| Try the command <tt>locale -a</tt> to see which locales are available. |
| Then use one of these locale names instead of the <tt>iso_8859-1</tt> |
| mentioned above. For example, <tt>LC_CTYPE=fr_FR.ISO-8859-1</tt> or |
| <tt/LC_CTYPE=fr_FR@euro</tt>. |
| |
| NOTE! Some of the below may still be true. Most of it is outdated. |
| (Please report on what is incorrect today, so that it can be deleted.) |
| |
| First of all, the 8-th bit should survive the kernel input processing, |
| so make sure to have <tt/stty cs8 -istrip -parenb/ set. |
| |
| A. For <tt/emacs/ the details strongly depend on the version. |
| The information below is for version 19.34. Put lines |
| <tscreen><verb> |
| (set-input-mode nil nil 1) |
| (standard-display-european t) |
| (require 'iso-syntax) |
| </verb></tscreen> |
| into your <tt>$HOME/.emacs</tt>. |
| The first line (to be precise: the final 1) |
| tells <tt/emacs/ not to discard the 8-th bit from input characters. |
| The second line tells <tt/emacs/ not to display non-ASCII characters |
| as octal escapes. |
| The third line specifies the syntactic properties |
| and case conversion table for the Latin-1 character set |
| These last two lines are superfluous if you have something like |
| <tt/LC_CTYPE=ISO-8859-1/ in your environment. |
| (The variable may also be <tt/LC_ALL/ or even <tt/LANG/. |
| The value may be anything with a substring `88591' or `8859-1' |
| or `8859_1'.) |
| <p> |
| This is a good start. |
| On a terminal that cannot display non-ASCII ISO 8859-1 symbols, |
| the command |
| <tscreen><verb> |
| (load-library "iso-ascii") |
| </verb></tscreen> |
| will cause accented characters to be displayed comme {,c}a. |
| If your keymap does not make it easy to produce non-ASCII characters, |
| then |
| <tscreen><verb> |
| (load-library "iso-transl") |
| </verb></tscreen> |
| will make the 2-character sequence Ctrl-X 8 a compose character, |
| so that the 4-character sequence Ctrl-X 8 , c produces c-cedilla. |
| Very inconvenient. |
| <p> |
| The command |
| <tscreen><verb> |
| (iso-accents-mode) |
| </verb></tscreen> |
| will toggle ISO-8859-1 accent mode, in which the six |
| characters ', `, ", ˆ, ˜, / are dead keys |
| modifying the following symbol. |
| Special combinations: ˜c gives a c with cedilla, |
| ˜d gives an Icelandic eth, ˜t gives an Icelandic thorn, |
| "s gives German sharp s, /a gives a with ring, |
| /e gives an a-e ligature, ˜< and ˜> give guillemots, |
| ˜! gives an inverted exclamation mark, |
| ˜? gives an inverted question mark, and '' gives an acute accent. |
| This is the default mapping of accents. |
| The variable <tt/iso-languages/ is a list of pairs (language name, |
| accent mapping), and a non-default mapping can be selected using |
| <tscreen><verb> |
| (iso-accents-customize LANGUAGE) |
| </verb></tscreen> |
| Here LANGUAGE can be one of <tt/"portuguese"/, <tt/"irish"/, |
| <tt/"french"/, <tt/"latin-2"/, <tt/"latin-1"/. |
| |
| Since the Linux default compose character is Ctrl-. |
| it might be convenient to use that everywhere. Try |
| <tscreen><verb> |
| (load-library "iso-insert.el") |
| (define-key global-map [?\C-.] 8859-1-map) |
| </verb></tscreen> |
| The latter line will not work under <tt/xterm/, if you use <tt/emacs -nw/, |
| but in that case you can put |
| <tscreen><verb> |
| XTerm*VT100.Translations: #override\n\ |
| Ctrl <KeyPress> . : string("\0308") |
| </verb></tscreen> |
| in your <tt/.Xresources/.) |
| |
| B. For <tt/less/, put <tt/LESSCHARSET=latin1/ in the environment. |
| This is also what you need if you see <tt/\255/ or <tt/<AD>/ |
| in <tt/man/ output: some versions of <tt/less/ will render the soft hyphen |
| (octal 0255, hex 0xAD) this way when not given permission to output Latin-1. |
| |
| C. For <tt/ls/, give the option <tt/-N/. (Probably you want to make an alias.) |
| |
| D. For <tt/bash/ (version 1.13.*), put |
| <tscreen><verb> |
| set meta-flag on |
| set convert-meta off |
| set output-meta on |
| </verb></tscreen> |
| into your <tt>$HOME/.inputrc</tt>. |
| |
| E. For <tt/tcsh/, use |
| <tscreen><verb> |
| setenv LANG en_US |
| setenv LC_CTYPE iso_8859_1 |
| </verb></tscreen> |
| If you have nls on your system, then the corresponding routines are used. |
| Otherwise <tt/tcsh/ will assume iso_8859_1, regardless of the values given to |
| LANG and LC_CTYPE. See the section NATIVE LANGUAGE SYSTEM in tcsh(1). |
| (The Danish HOWTO says: <tt>setenv LC_CTYPE ISO-8859-1; stty pass8</tt>) |
| |
| F. For <tt/flex/, give the option <tt/-8/ if the parser it generates must be |
| able to handle 8-bit input. (Of course it must.) |
| |
| G. For <tt/elm/, set <tt/displaycharset/ to <tt/ISO-8859-1/. |
| (Danish HOWTO: <tt/LANG=C/ and <tt/LC_CTYPE=ISO-8859-1/) |
| |
| H. For programs using curses (such as <tt/lynx/) David Sibley reports: |
| The regular curses package uses the high-order bit for reverse video mode |
| (see flag _STANDOUT defined in <tt>/usr/include/curses.h</tt>). However, |
| <tt/ncurses/ seems to be 8-bit clean and does display iso-latin-8859-1 |
| correctly. |
| |
| I. For programs using <tt/groff/ (such as <tt/man/), make sure to use |
| <tt/-Tlatin1/ instead of <tt/-Tascii/. Old versions of the program <tt/man/ |
| also use <tt/col/, and the next point also applies. |
| |
| K. For <tt/rlogin/, use option <tt/-8/. |
| |
| L. For <tt/joe/, |
| <tt>metalab.unc.edu:/pub/Linux/apps/editors/joe-1.0.8-linux.tar.gz</tt> |
| is said to work after editing the configuration file. Someone else said: |
| <tt/joe/: Put the <tt/-asis/ option in <tt>/isr/lib/joerc</tt> in the |
| first column. |
| |
| M. For LaTeX: <tt>\documentstyle[isolatin]{article}</tt>. |
| For LaTeX2e: <tt>\documentclass{article}\usepackage{isolatin}</tt> |
| where <tt>isolatin.sty</tt> is available from |
| <htmlurl url="ftp://ftp.vlsivie.tuwien.ac.at/pub/8bit" |
| name="ftp.vlsivie.tuwien.ac.at/pub/8bit">. |
| |
| A nice discussion on the topic of ISO-8859-1 and how to manage 8-bit |
| characters is contained in the file <tt>grasp.insa-lyon.fr:/pub/faq/fr/accents</tt> |
| (in French). Another fine discussion (in English) can be found in |
| <htmlurl |
| url="ftp://rtfm.mit.edu/pub/usenet-by-group/comp.answers/internationalization/iso-8859-1-charset" |
| name="rtfm.mit.edu:pub/usenet-by-group/comp.answers/internationalization/iso-8859-1-charset">. |
| |
| If you need to fix a program that behaves badly with 8-bit characters, |
| one thing to keep in mind is that if you have a signed char type then |
| characters may be negative, and using them as an array index will fail. |
| Several programs can be fixed by judiciously adding (unsigned char) casts. |
| |
| <sect>X<p> |
| |
| This FAQ/HOWTO is about the Linux keyboard and console, not about X, |
| which substitutes its own handling. However, it seems useful to |
| document some of the Linux keyboard and console related properties |
| of X. |
| |
| First of all, when X is started (say using <tt/startx/ or <tt/xinit/) |
| it opens the first unused console, unless the desired console has been |
| indicated explicitly, as in <tt/xinit -- vt12/. |
| Note that this will fail when there is no device file <tt>/dev/tty12</tt>, |
| but that it will not fail when the indicated console was in use already. |
| When X finishes, it will return to the original console. |
| While it is running one can use Ctrl-Alt-Fn to switch to VTn. |
| <p> |
| The XFree86 keymap mechanism is much poorer than the Linux mechanism. |
| For each keycode there are at most 4 symbols defined, namely for the |
| 4 keymaps plain, shift, mod, mod+shift. What is the modifier mod? |
| It is the one designated by the symbol <tt/Mode_switch/. |
| For example, the command <tt/xmodmap keys.dk/, where the file |
| <tt/keys.dk/ contains |
| <tscreen><verb> |
| keycode 64 = Mode_switch |
| keycode 113 = Mode_switch |
| keycode 38 = a A aring Aring |
| keycode 26 = e E ae AE |
| keycode 32 = o O oslash Ooblique |
| </verb></tscreen> |
| will make both Alt keys into mod keys, so that Alt+a gives å (a-ring), etc. |
| (Note the illogical naming of oslash and Ooblique.) |
| Such an <tt/xmodmap/ command can be placed in the <tt/.xinitrc/ |
| shell script that is executed by default when X is started. |
| |
| <sect1>What precisely does XFree86-2.1 do when it initializes its keymap?<p> |
| <nidx>keymap!initialization by XFree86</nidx> |
| <nidx>XFree86!keymap initialization</nidx> |
| |
| Since version 2.1, XFree86 will initialize its keymap from the Linux keymap, |
| as far as possible. However, Linux had 16 entries per key (one for each |
| combination of the Shift, AltGr, Ctrl, Alt modifiers) and presently has |
| 256 entries per key, while X has 4 entries per key (one for each combination |
| of Shift, Mod), so some information is necessarily lost. |
| |
| First <tt/X/ reads the <tt/Xconfig/ file, where definitions of the LeftAlt, RightAlt, |
| RightCtl, ScrollLock keys as Meta, ModeShift, Compose, ModeLock or ScrollLock |
| might be found - see X386keybd(1), later XFree86kbd(1). |
| |
| For Mod the LeftAlt key is taken, unless RightCtl was defined as ModeShift or |
| ModeLock, in which case RightCtl is taken, or RightAlt was so defined, in which |
| case RightAlt is taken. |
| This determines how the 4 XFree86 meanings of a key are selected from the 16 |
| Linux meanings. |
| Note that Linux today does not distinguish by default between the two Ctrl keys |
| or between the two Shift keys. <tt/X/ does distinguish. |
| |
| Now the kernel keymap is read and the usually obvious corresponding X |
| bindings are made. The bindings for the "action keys" Show_Memory, Show_State, |
| Show_Registers, Last_Console, Console_n, Scroll_Backward, Scroll_Forward, |
| Caps_On and Boot are ignored, as are the dead diacriticals, and the locks |
| (except for ShiftLock), and the "ASCII-x" keys. |
| |
| Next, the definitions in the <tt/Xconfig/ file are used. (Thus, a definition |
| of Compose in <tt/Xconfig/ will override its value as found in the Linux |
| keymap.) |
| |
| What happens to the strings associated with the function keys? Nothing, |
| X does not have such a concept. (But it is possible to define strings |
| for function keys in <tt/xterm/ - note however that the window manager gets the |
| keys first.) |
| |
| I don't know how to convince <tt/xterm/ that it should use the X keymap |
| when Alt is pressed; it seems just to look at its resource <tt/eightBitInput/, |
| and depending on whether that is true or false either set the high order bit |
| of the character, or generate an additional Escape character |
| (just like setmetamode(1) does for the console). |
| |
| <sect>Unusual keys and keyboards<p> |
| <nidx>keyboard!unusual versions of</nidx> |
| <nidx>keyboard!non-standard keys on</nidx> |
| |
| The two keys PrintScrn/SysRq and Pause/Break are special in that they |
| have two keycodes: the former has keycode 84 when Alt is pressed |
| simultaneously, and keycode 99 otherwise; the latter has keycode |
| 101 when Ctrl is pressed simultaneously, and keycode 119 otherwise. |
| (Thus, it makes no sense to bind functions to Alt keycode 99 or |
| Ctrl keycode 119.) The Pause/Break key is also special in another way: |
| it does not generate key-up scancodes, but generates the entire |
| 6-scancode sequence on key-down. |
| |
| If you have strange keys, that do not generate any code under Linux |
| (or generate messages like "unrecognized scancode"), and your kernel |
| is 1.1.63 or later, then you can use setkeycodes(1) to tell the kernel |
| about them. Once they have gotten a keycode from <tt/setkeycodes/, |
| they can be assigned a function by <tt/loadkeys/. |
| |
| For example, using <tt/showkey -s/ one sees that Microsoft keyboards |
| use the scancode sequences (in hexadecimal) e0 5b (left Windows key), |
| e0 5c (right Windows key), e0 5d (Menu key). |
| Microsoft Internet keyboard also uses e0 6a (Back), e0 69 (Forward), |
| e0 68 (Stop), e0 6c (Mail), e0 65 (Search), e0 66 (Favorites), |
| e0 32 (Web/Home), e0 6b (My Computer), e0 21 (Calculator), e0 5f (Sleep). |
| Use <tt>dumpkeys</tt> to see what keycodes are still unused. |
| Typically values like 89-95 and 112-118 and 120-127 are free. |
| Now |
| <tscreen><verb> |
| % setkeycodes e05b 125 |
| % setkeycodes e05c 126 |
| % setkeycodes e05d 127 |
| </verb></tscreen> |
| assigns keycodes to these scancode sequences, and |
| <tscreen><verb> |
| % loadkeys |
| keycode 125 = Decr_Console |
| keycode 126 = Incr_Console |
| keycode 127 = KeyboardSignal |
| % |
| </verb></tscreen> |
| would make these Windows keys go to the previous or next virtual console, |
| and let the Menu key create a fresh virtual console (in case you have |
| something like <tt/spawn_console/ running). |
| |
| <sect1>Funkeys<p> |
| Many modern keyboards have buttons or keys with labels like |
| "Vol Up", "Eject" etc. that suggest actions rather than strings. |
| Of course one can bind shell commands to them, but then they'll |
| work only when you are at a shell prompt. |
| Rick van Rein wrote a package funkey consisting of a kernel patch |
| and a daemon. The kernel patch creates a new character device, |
| and adds a new key type to indicate which keystrokes should be |
| sent to this new character device. A daemon can now listen to |
| the character device, somewhat like <tt>gpm</tt> listens to the |
| mouse device, and perform the actions indicated in its config file. |
| See <htmlurl url="http://rick.vanrein.org/linux/funkey" |
| name="rick.vanrein.org/linux/funkey">. |
| |
| <sect>Examples of use of loadkeys and xmodmap<p> |
| <nidx>loadkeys!example using</nidx> |
| <nidx>xmodmap!example using</nidx> |
| |
| Switching Caps Lock and Control on the keyboard (assuming you use |
| keymaps 0-15; check with <tt>dumpkeys | head -1</tt>) |
| <tscreen><verb> |
| % loadkeys |
| keymaps 0-15 |
| keycode 58 = Control |
| keycode 29 = Caps_Lock |
| % |
| </verb></tscreen> |
| Switching them under X only: |
| <tscreen><verb> |
| % xmodmap .xmodmaprc |
| </verb></tscreen> |
| where <tt/.xmodmaprc/ contains lines |
| <tscreen><verb> |
| remove Lock = Caps_Lock |
| remove Control = Control_L |
| keysym Control_L = Caps_Lock |
| keysym Caps_Lock = Control_L |
| add Lock = Caps_Lock |
| add Control = Control_L |
| </verb></tscreen> |
| What is this about the key numbering? Backspace is 14 under Linux, |
| 22 under X? Well, the numbering can best be regarded as arbitrary; |
| the Linux number of a key can be found using showkey(1), and the |
| X number using xev(1). Often the X number will be 8 more than the |
| Linux number. |
| |
| Something else people like to change are the bindings of the function keys. |
| Suppose that you want to make F12 produce the string "emacs ". |
| Then |
| <tscreen><verb> |
| % loadkeys |
| keycode 88 = F12 |
| string F12 = "emacs " |
| % |
| </verb></tscreen> |
| will do this. More explicitly, the procedure is like this: |
| (i) find the keycodes of the keys to be remapped, using showkey(1). |
| (ii) save the current keymap, make a copy and edit that: |
| <tscreen><verb> |
| % dumpkeys > my_keymap |
| % cp my_keymap trial_keymap |
| % emacs trial_keymap |
| % loadkeys trial_keymap |
| % |
| </verb></tscreen> |
| The format of the table can be guessed by looking at the output |
| of <tt/dumpkeys/, and is documented in keymaps(5). |
| When the new keymap functions as desired, you can put an invocation |
| <tscreen><verb> |
| loadkeys my_new_keymap |
| </verb></tscreen> |
| in <tt>/etc/rc.local</tt> or so, to execute it automatically at boot-up. |
| Note that changing modifier keys is tricky, and a newbie can easily |
| get into a situation only an expert can get out of. |
| <p> |
| The default directory for keymaps is <tt>/usr/lib/kbd/keymaps</tt>. |
| The default extension for keymaps is <tt>.map</tt>. |
| For example, <tt>loadkeys uk</tt> would probably load |
| <tt>/usr/lib/kbd/keymaps/i386/qwerty/uk.map</tt>. |
| (With kbd-0.95 and older this would be <tt>/usr/lib/kbd/keytables</tt> |
| and <tt>/usr/lib/kbd/keytables/uk.map</tt>.) |
| <p> |
| |
| (On my machine) <tt>/dev/console</tt> is a symbolic link to <tt>/dev/tty0</tt>, |
| and the kernel regards <tt>/dev/tty0</tt> as a synonym for the current VT. |
| XFree86 1.3 changes the owner of <tt>/dev/tty0</tt>, but does not reset this |
| after finishing. Thus, <tt/loadkeys/ or <tt/dumpkeys/ might fail because |
| someone else owns <tt>/dev/tty0</tt>; |
| in such a case you might run X first. |
| Note that you cannot change keyboard mappings when not at the console |
| (and not superuser). |
| |
| <sect1>`I can use only one finger to type with'<p> |
| <nidx>keyboard!making modifier keys toggle</nidx> |
| |
| "Can the Shift, Ctrl and Alt keys be made to behave as toggles?"<p> |
| Yes, after saying |
| <tscreen><verb> |
| % loadkeys |
| keymaps 0-15 |
| keycode 29 = Control_Lock |
| keycode 42 = Shift_Lock |
| keycode 56 = Alt_Lock |
| % |
| </verb></tscreen> |
| the left Control, Shift and Alt keys will act as toggles. |
| The numbers involved are revealed by showkey |
| (and usually are 29, 97, 42, 54, 56, 100 for left and right control, |
| shift and alt, respectively), and the functions are |
| Control_Lock, Shift_Lock, Alt_Lock, ALtGr_Lock. |
| |
| "What about `sticky' modifier keys?"<p> |
| Since version 1.3.33, the kernel knows about `sticky' modifier keys. |
| These act on the next key pressed. So, where one earlier needed |
| the 3-symbol sequence Shift_Lock a Shift_Lock to type `A', one |
| can now use the 2-symbol sequence SShift_Lock a. |
| You can say |
| <tscreen><verb> |
| % loadkeys |
| keymaps 0-15 |
| keycode 54 = SShift |
| keycode 97 = SCtrl |
| keycode 100 = SAlt |
| % |
| </verb></tscreen> |
| to make the right Shift, Ctrl, Alt sticky versions of the left ones. |
| This will allow you to type Ctrl-Alt-Del in three keystrokes with one hand. |
| |
| The keymaps line in these examples should cover all keymaps you have in use. |
| You find what keymaps you have in use by |
| <tscreen><verb> |
| % dumpkeys | head -1 |
| </verb></tscreen> |
| |
| |
| <sect1>Sticky keys under <tt/X/<p> |
| The following text was contributed by Piotr Mitros. |
| |
| XFree86 supports an accessibility option which allows disabled users |
| to type single-handed. With sticky keys enabled, the user can hit a |
| modifier key (ctrl, alt, shift) followed by another key, rather than |
| having to hold the modifier key while hitting the letter. |
| |
| To enable sticky keys, first make sure the xkb extension is enabled |
| (this is done during initial <tt/X/ server configuration and is usually |
| enabled by default). Next, run the <tt/X/ server with the <tt/+accessx/ |
| option. If you use <tt/startx/, either run <tt/startx -- +accessx/ or |
| add <tt/+accessx/ to the serverargs line in the <tt/startx/ script. |
| If you use <tt/xdm/, add <tt/+accessx/ to the appropriate server line |
| in <tt>/etc/X11/xdm/Xservers</tt>. |
| |
| It is also possible to enable <tt/X/ accessibility with some end-user |
| utilities with a running <tt/X/ server. |
| |
| Once <tt/X/ accessibility is enabled, press the shift key five times in a |
| row to enable sticky keys. To disable sticky keys, either press the |
| shift key five times again, or press a key while holding a modifier |
| key. |
| |
| XFree86 also supports Slow Keys, Repeat Keys, Bounce Keys and an |
| audible bell. <tt/xkbcomp/ can be used to generate a <tt/.xkm/ file |
| to enable these. The appropriate <tt/xkbcomp/ commands are listed in |
| <tt>/usr/X11R6/lib/X11/xkb/compat/accessx</tt>. |
| Unfortunately, the exact process is still undocumented. |
| |
| <sect>Changing the video mode<p> |
| <nidx>console!changing video modes</nidx> |
| <nidx>video modes, changing</nidx> |
| <nidx>resolution, changing</nidx> |
| |
| As far as I know there are 6 ways to change resolution: |
| |
| 1. At compile time: change the line |
| <tscreen><verb> |
| SVGA_MODE= -DSVGA_MODE=NORMAL_VGA |
| </verb></tscreen> |
| in <tt>/usr/src/linux/Makefile</tt>. |
| |
| 1A. After compilation: use <tt>rdev -v</tt> - a terrible hack, but it exists. |
| |
| 2. At boot time: put <tt>vga=ask</tt> in the lilo config file, and lilo will |
| ask you what video mode you want. Once you know, put <tt/vga=/mypreference. |
| |
| 3. At run time: |
| A. Use the <tt/resizecons/ command. (This is a very primitive wrapper around |
| the VT_RESIZE ioctl.) |
| B. Use the <tt/SVGATextMode/ command. (This is a less primitive wrapper around |
| the VT_RESIZE ioctl.) |
| |
| 4. Not "on the console": |
| Under <tt/dosemu/, or with svgalib etc. you can change the hardware video mode |
| without the console driver being aware of it. Sometimes this is useful in |
| getting <tt/resizecons/ or <tt/SVGATextMode/ set up: use <tt/dosemu/ and some |
| DOS program to get into the desired videomode, dump (say from another VT) the |
| contents of all video hardware registers, and use that in the initialization |
| that <tt/resizecons/ and <tt/SVGATextMode/ require. |
| In some cases where the video mode has gotten into some unusable state, |
| starting <tt/dosemu/, relying on the BIOS to set up the video mode, and then |
| killing <tt/dosemu/ (with <tt/kill -9/), is the easiest way to get into shape |
| again. |
| |
| <sect1>Instructions for the use of resizecons<p> |
| <nidx>resizecons program</nidx> |
| |
| Get svgalib and compile the program <tt/restoretextmode/. |
| Boot up your machine in all possible video modes |
| (using <tt/vga=ask/ in the lilo config file), and write |
| the video hardware register contents to files CxR |
| (C=cols, R=rows), e.g., 80x25, 132x44, etc. |
| Put these files in <tt>/usr/lib/kbd/videomodes</tt>. |
| Now <tt>resizecons 132x44</tt> will change videomode for you |
| (and send SIGWINCH to all processes that need to know |
| about this, and load another font if necessary). |
| |
| At present, <tt/resizecons/ only succeeds when there is memory enough |
| for both the old and the new consoles at the same time. |
| |
| <sect>Changing the keyboard repeat rate<p> |
| <nidx>keyboard!repeat rate, setting</nidx> |
| |
| At startup, the Linux kernel sets the repeat rate to its maximal value. |
| For most keyboards this is reasonable, but for some it means that you |
| can hardly touch a key without getting three copies of the corresponding |
| symbol. Use the program kbdrate(8) to change the repeat rate, or, if |
| that doesn't help, edit or remove the section |
| <code> |
| ! set the keyboard repeat rate to the max |
| |
| mov ax,#0x0305 |
| xor bx,bx ! clear bx |
| int 0x16 |
| </code> |
| of <tt>/usr/src/linux/[arch/i386/]boot/setup.S</tt>. |
| |
| Scott Johnston (<tt/sj@zule.com/) reports: `To program the |
| repeat rate of a Gateway AnyKey keyboard all one has to do |
| is press the "Repeat Rate" key, then a function key |
| F1-F8, then "Repeat Rate" again. F1 is the slowest possible repeat rate, |
| and F8 is really fast. If you somehow manage to mess up your AnyKey |
| keyboard doing this, simply press Ctrl-Alt-SuspndMacro to reset |
| your keyboard to factory default settings.' |
| |
| <sect>Scrolling<p> |
| <nidx>console!scrolling</nidx> |
| <nidx>scrolling, console</nidx> |
| |
| There are two ways to get a screen to scroll. |
| The first, called `hard scrolling', is to leave the text in |
| video memory as it is, but change the viewing origin. This is |
| very fast. |
| The second, called `soft scrolling', involves moving all screen text |
| up or down. This is much slower. |
| The kernel console driver will write text starting at the top of |
| the video memory, continuing to the bottom, then copy the bottom |
| part to the top again, and continue, all the time using hard scrolling |
| to show the right part on the screen. |
| You can scroll back until the top op the video memory by using |
| Shift-PageUp (the grey PageUp) and scroll down again using |
| Shift-PageDown (the grey PageDown), assuming a default keymap. |
| The amount of scrollback is thus limited to the amount of video memory |
| you happen to have and you cannot increase this amount. |
| If you need more scrollback, use some program that |
| buffers the text, like <tt/less/ or <tt/screen/ - by using |
| a buffer on disk you can go back to what you did last week. |
| (One can set the amount of scrollback for <tt/xterm/ by |
| adding a line like <tt/XTerm*saveLines: 2500/ in <tt/.Xresources/.) |
| |
| Upon changing virtual consoles, the screen content of the old VT |
| is copied to kernel memory, and the screen content of the new VT |
| is copied from kernel memory to video memory. Only the visible screen |
| is copied, not all of video memory, so switching consoles means |
| losing the scrollback information. |
| |
| Sometimes, hard scrolling is undesirable, for example when the hardware |
| does not have the possibility to change viewing origin. The first |
| example was a Braille machine that would render the top of video |
| memory in Braille. There is a kernel boot-time option <tt/no-scroll/ |
| to tell the console driver not to use hard scrolling. |
| See bootparam(7). |
| |
| <sect>Screensaving<p> |
| <nidx>screensaving!controlling</nidx> |
| <nidx>screen blanking</nidx> |
| |
| <tt>setterm -blank</tt> <it/nn/ will tell the console driver to blank the |
| screen after <it/nn/ minutes of inactivity. (With <it/nn/ = 0, screensaving |
| is turned off. In some old kernels this first took effect after the next |
| keyboard interrupt.) |
| |
| The <tt/s/ option of xset(1) will set the X screensaving parameters: |
| <tt>xset s off</tt> turns off the screensaver, |
| <tt>xset s 10</tt> blanks the screen after 10 minutes. |
| |
| The video hardware powersaving modes can be enabled/disabled |
| using the <tt/setvesablank/ program given in the starting comment of |
| <tt>/usr/src/linux/drivers/char/vesa_blank.c</tt>. |
| |
| <sect>Screen dumps<p> |
| <nidx>console!screenshots, obtaining</nidx> |
| <nidx>screenshots!obtaining from console</nidx> |
| |
| <tt>setterm -dump</tt> <it/N/ will dump the contents of the |
| screen of <tt>/dev/tty</tt><it/N/ to a file <tt/screen.dump/ |
| in the current directory. See setterm(1). |
| |
| The current contents of the screen of <tt>/dev/tty</tt><it/N/ |
| can be accessed using the device <tt>/dev/vcs</tt><it/N/ |
| (where `vcs' stands for `virtual console screen'). |
| For example, you could have a clock program that displays the |
| current time in the upper right hand corner of the console screen |
| (see the program <tt/vcstime/ in <tt/kbd-1.04.tar.gz/). |
| Just dumping the contents goes with <tt>cat /dev/vcs</tt><it/N/. |
| These device files <tt>/dev/vcs</tt><it/N/ do not contain |
| newlines, and do not contain attributes, like colors. From a program |
| it is usually better to use <tt>/dev/vcsa</tt><it/N/ |
| (`virtual console screen with attributes') instead - it starts with |
| a header giving the number of rows and columns and the location |
| of the cursor. |
| See vcs(4). |
| |
| <sect>Some properties of the VT100 - application key mode<p> |
| <nidx>keyboard!VT100 application key mode</nidx> |
| <nidx>VT100 application key mode</nidx> |
| |
| : Sometimes my cursor keys or keypad keys produce strange codes? |
| |
| When the terminal is in application cursor key mode the cursor keys |
| produce Esc O x and otherwise Esc [ x where x is one of A,B,C,D. |
| Certain programs put the terminal in application cursor key mode; |
| if you kill them with <tt/kill -9/, or if they crash, then the mode will |
| not be reset. |
| <verb> % echo -e '\033c' </verb> |
| resets all properties of the current VC. Just changing the cursor |
| application key mode is done by |
| <verb> % echo -e '\033[?1h' </verb> |
| (set) and |
| <verb> % echo -e '\033[?1l' </verb> |
| (clear). |
| |
| When the terminal is in application keypad key mode the keypad keys |
| produce Esc O y and otherwise Esc [ z ˜ for |
| certain y and z. Setting application keypad key mode is done by |
| <verb> % echo -e '\033=' </verb> |
| and |
| <verb> % echo -e '\033>' </verb> |
| clears it again. |
| |
| <sect>Hardware incompatibility<p> |
| <nidx>keyboard!hardware incompatibilities</nidx> |
| <nidx>incompatibility!keyboard-related</nidx> |
| |
| Several people have noticed that they lose typed characters when |
| a floppy disk is active. It seems that this might be a problem with |
| Uni-486WB motherboards. |
| |
| Tjalling Tjalkens (<tt/tjalling@ei.ele.tue.nl/) reports very similar problems |
| with "a no-brand GMB-486 UNP Vesa motherboard with AMD 486DX2-66 CPU" - |
| during floppy activity some keystrokes are lost, during floppy tape streamer |
| (Conner C 250 MQ) activity many keystrokes are lost. |
| |
| Some people experience sporadic lockups - sometimes associated to |
| hard disk activity or other I/O. |
| |
| Ulf Tietz (<tt/ulf@rio70.bln.sni.de/) wrote: |
| `I have had the same problems, when I had my motherboard tuned too fast. |
| So I reset all the timings ( CLK, wait statements etc ) to more |
| conventional values, and the problems are gone.' |
| |
| Bill Hogan (<tt/bhogan@crl.com/) wrote: |
| `If you have an AMI BIOS, you might try setting the Gate A20 emulation |
| parameter to "chipset" (if you have that option). Whenever I have had |
| that parameter set to any of the other options on my machine |
| ("fast", "both", "disabled") I have had frequent keyboard lockups.' |
| |
| There may be a relation between keyboard problems and the video card in use. |
| |
| Shawn K. Quinn (<tt/skquinn@wt.net/) wrote: |
| `I have a Zeos Pantera Pentium-90 that originally came with a Diamond Stealth |
| 64 S3-based video card. Under X I frequently got q's inserted into my text |
| (how annoying) especially if I typed very fast (during Netrek for instance, |
| even more annoying because guess what that does :-( ). |
| Switching to a Creative Labs Graphics Blaster MA202 solved the problem. |
| I'm assuming the Stealth 64 did something funny with the timings.' |
| |
| <sect>Copyright<p> |
| Copyright (c) 1993-2001 by Andries Brouwer. This document may be |
| distributed under the terms set forth in the LDP license |
| at <htmlurl url="http://metalab.unc.edu/LDP/COPYRIGHT.html" |
| name="http://metalab.unc.edu/LDP/COPYRIGHT.html"> or |
| <htmlurl url="ftp://www.win.tue.nl/pub/linux/LDP/COPYRIGHT.txt" |
| name="ftp://www.win.tue.nl/pub/linux/LDP/COPYRIGHT.txt">. |
| |
| Additions and corrections are welcome. |
| Andries Brouwer - <tt/aeb@cwi.nl/ |
| |
| </article> |