bash的shell history和editing mode
经常需要在shell中查询命令历史。因为习惯vim的键绑定,所以在bash里进去就直接 set -o vi ,default editing mode 切换成vi mode了。bash默认是 emacs mode 。
shell history和editing mode(vi or emacs)
emacs mode的问题是,从history中查到命令后,回车就执行,这样太容易误操作了。
Emacs mode: Ctrl-a 行首 Ctrl-e 行尾 Ctrl-b 光标后退 Ctrl-f 光标向前 Ctrl-d 删除当前光标下的字符 Ctrl-r 搜索时往后 Ctrl-s 搜索时往前
Ctrl-p 历史列表上一个. Ctrl-n 历史列表下一个. Ctrl-r 向上搜索历史列表 (incremental search). Ctrl-s 向下搜索历史列表 (incremental search). Meta-p 向上搜索历史列表 non-incremental search. Meta-n 向下搜索历史列表using non-incremental search. Meta-< 移动到历史列表顶端. Meta-> 移动到历史列表末尾.
vi mode可以用 C-r C-s,还用什么emacs mode啊。
- Vi mode: k 历史列表上一个. j 历史列表下一个. /string or CTRL-r 向上搜索历史列表(正则表达式)、增量查找. ?string or CTRL-s 向下搜索历史列表(正则表达式)、增量查找. n 重复上次搜索(同方向)n次 N 重复上次搜索(反方向)n次 G 移动到历史列表第N行 (for example, 15G).
C-s问题
stty -ixon
UNIX tty(terminal)层的配置。UNIX沉重历史包袱的体现之一,大量黑科技的一个子系统。
stty -FOO 命令是禁用当前tty的FOO功能。这里就是禁用 ixon 。可以用 stty -a 查看tty的当前设置。
什么是ixon呢?即 XON/XOFF flow control=,鲜为人知的终端功能之一 —— 按下 =Ctrl-s ,你会发现屏幕上不再显示你打的字了,再按 Ctrl-q ,你会发现你刚才打的字母一股脑突然都出现了。可以理解为终端的一个“缓冲区”,可以把一系列击键暂时保存起来,然后连续击发。现在很少有需要这个功能的情景了。这里是因为你定义的快捷键里包含了 Ctrl-s ,所以……
参考 https://blog.nelhage.com/2009/12/a-brief-introduction-to-termios/
linux
C-a 和 screen 的快捷键有冲突,用emacs风格的话,没法用screen。改screen的快捷键用着不习惯。
dsm
群晖的shell(busybox ash)只有emacs模式,set -o vi 无效。唉,搞这么难用的shell干什么?
- 有stty,默认ixon,可以设置 -ixon。
- 有emacs模式的command line editing,但是找不到 history features
华硕官版固件
shell只有emacs模式,set -o vi 无效。
- 有stty,默认ixon,但是C-s后屏幕上还是会显示打的字。貌似无效。
- C-r 无效
- C-s 无效
梅林固件
shell只有emacs模式,set -o vi 无效。
- 无stty
- C-r 可用
- C-s 无效