2010年3月18日 星期四

將 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

玩了一下還滿有趣的。

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...