將 bash 設成 vi mode 並保有 ctrl+ l 清除螢幕的功能

習慣用 vi 後, 想將 bash 的操作方式也換用 vi 的方式操作, 這樣就能按 ctrl + [ 進入 normal mode, 接著用 w, b, f 暢遊在文字之間。但令人困擾的是, vi 模式的 insert mode 無法按 ctrl + l (L) 清除螢幕。

查了一下發現解法是將 ctrl + l 對應到清螢幕的功能, 總結來說, 就是這麼設:
set -o vi
bind -m vi-insert "C-l":clear-screen
其實以上都是在設定 readline 的行為, 詳細內容見 man bash (搜 "bind \[" 跳到相關章節) 和 man 3 readline (是的, 它是個 function!) 。clear-screen 是 readline 的功能之一。

與本文無關的花絮

好奇之下試著用 C 呼叫 readline:

/* f.c */
#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>

int main(void) {
    char *s = readline ("promp> ");
    printf("%s\n", s);
}
編譯方式:
$ gcc f.c -lreadline -o f
在編譯前要先確定有裝 readline.h 和 libreadline.so, 不然編譯後會出現「error: readline/readline.h: No such file or directory」。

Ubuntu 下安裝方式是:
# 用 apt-file 找出 readline.h 放在那個 package 裡
$ apt-file search readline/readline.h
ghc6-doc: /usr/share/doc/ghc6-doc/libraries/readline/readline.haddock
guile-1.6-dev: /usr/include/guile-readline/readline.h
libreadline5-dev: /usr/include/readline/readline.h

$ sudo aptitude install libreadline5-dev

玩了一下還滿有趣的。

留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

熟悉系統工具好處多多

virtualbox 使用 USB 裝置