Date: Thu, 31 May 2018 09:11:29 +0200 From: Polytropon <freebsd@edvax.de> To: =?UTF-8?B?5bSU54GP?= (CUI Hao) <cuihao.leo@gmail.com> Cc: freebsd-questions@freebsd.org Subject: Re: `reset` command makes backspace unusable Message-ID: <20180531091129.c0ff4dbb.freebsd@edvax.de> In-Reply-To: <CAJm2p=Kk_LhZ6atTA9P4bjv1tN9mXZpo-3orE1hjogTo0WhECg@mail.gmail.com> References: <CAJm2p=Kk_LhZ6atTA9P4bjv1tN9mXZpo-3orE1hjogTo0WhECg@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 29 May 2018 17:10:01 +0800, 崔灏 (CUI Hao) wrote: > Hi, new to FreeBSD. On Linux, I often use `reset` command to recover > an broken terminal. On FreeBSD, `reset` seems to render backspace > unusable in some CLI programs. > > Steps to reproduce the problem: > 1. SSH login FreeBSD server from a Linux terminal emulator. TERM is > set to `xterm-256color`. > I tried Konsole / Termite. Both reproducible. > But xterm/uxterm doesn't trigger the problem. > 2. Executing `reset` on FreeBSD. > 3. Then pressing backspace will yields `^?` instead of backward > delete in most CLI programs including bash/vim/cat, but not tcsh and > sh. > > Like this: > wm@wmc:~$ reset > Erase is backspace. > wm@wmc:~$ ^?^?^?^? # typing backspace... This indicates that backspace's ^H has been altered to ^?, which usually is delete, but it only works when the "support chain" does react correctly to this code (the C shell sometimes doesn't, which is why you see the "replacement text" instead of the shell per- forming the correct edit action). > I googled about the problem. `stty erase ^?` after `reset`, or `reset > -e ^?` fix it. But I still wonder why `reset` doesn't work like on > Linux. I do some investigation, here are some of my observations: > > 1. terminal line settings (`stty -a`) > I checked the output of `stty -a`. On Linux terminal (Termite), I saw > `erase = ^?`. For full output, see https://cfp.vim-cn.com/cbff6 Here is some relevant output to compare: % stty -a [...] cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>; eol2 = <undef>; erase = ^H; erase2 = ^H; intr = ^C; kill = ^U; lnext = ^V; min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T; stop = ^S; susp = ^Z; time = 0; werase = ^W; Note that backspace is called "erase" here, and correctly set to ^H, while there is no mentioning of delete (see further notes). > After SSH login FreeBSD, `stty -a` shows `erase = ^?; erase2 = ^H`, > which seem to be consistent with Linux. See > https://cfp.vim-cn.com/cbff7 This makes the DEL key the backspace key, if I read it correctly. > But after `reset`, the settings changed and becomes `erase = ^H; > erase2 = ^H`. see https://cfp.vim-cn.com/cbff8 Now ^H equals backspace (here: "erase"), which is what should happen when the terminal capabilities are reset according to the database. > 2. termcap > It seems default terminal line settings are determined by termcap db. > I checked `/etc/termcap` and found the entry of `xterm-256color`, > which inherits settings of `xterm-basic` entry. `xterm-basic` sets > `kb=^H`. Yes, that again is "key backspace" with the correct setting. > On Linux, I get the termcap settings by `infocmp -Cr`. Terminal > `xterm-256color` sets `kb=^H`, while `xterm-termite` sets `kb=\177`. Key code 177 (0x7F or 127) is a problematic key code because it sometimes means backspace, sometimes delete. > I tried to override FreeBSD termcap settings in `~/.termcap`: > xterm-256color|xterm alias 3:\ > :Co#256:pa#32767:\ > :kb=\177:\ > :AB=\E[48;5;%dm:AF=\E[38;5;%dm:tc=xterm-new > > Above settings indeed works and `reset` won't alter erase setting. > However, Linux `xterm-256color` termcap does set `kb=^H` like FreeBSD, > but it doesn't cause the problem on Linux. This kind of modification should not be needed. However, you can do certain customization to your C shell's settings (and let's assume for now you're using the C shell as your dialog shell, simply because this is FreeBSD's default). Add the following settings to /etc/csh.cshrc (for global effect) or to ~/.cshrc (for user-local effect): if ($?prompt) then # ... stuff omitted ... bindkey ^? delete-char # delete for console bindkey ^[[3~ delete-char # delete for xterm # ... more stuff ... endif You can also experiment with the "ESC sequence spelling" of the key codes (using "\e" instead of "^["), like this: bindkey "\e[3~" delete-char # delete bindkey "\e[1~" beginning-of-line # home bindkey "\e[4~" end-of-line # end Note that backspace will be reset to ^H which is the correct setting for this key, so there should be no need to add it. You can still _always_ simply press Ctrl+H to check if it does correctly perform the backspace operation on the current line. > Although I have found several workaround to fix backspace problem, may > anyone explain why terminal settings inconsistent on Linux and > FreeBSD? Is this a bug or just some compatibility issues? Are there > other compatibility issues with Linux terminal emulator? This is probably because FreeBSD's console subsystem currently still is in a flow, and Linux is always in a flow, so there is no real agreement about how things should be solved in a cross- compatible way... ;-) -- Polytropon Magdeburg, Germany Happy FreeBSD user since 4.0 Andra moi ennepe, Mousa, ...
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20180531091129.c0ff4dbb.freebsd>