本篇使用bash shell
其他的shell基本上也有相對應的方式
感謝denny在sitcon台南聚的分享
introduction
假設有一個指令叫做operate
:
$ operate -aaa-c -bbb -ccc -ddd -eee -fff file
有一天突然你不小心打錯了
$ operatt -aaa-c -bbb -ccc -ddd -eee -fff file
看到很多人的做法通常就直接案del
按到刪除到第一個為止, 要是指令更長的話, 是相當的沒效率的, 尤其是每天接觸shell
的工程師, 如果沒辦法在shell
中快速移動, 像是vi
和emacs
快速移動的指法, 那就浪費了許多時間.
效果展示
我們先看一下vim
和emacs
常用的三種指法.
-
單詞快速移動
-
行頭行尾移動
-
刪除單詞
vi mode in shell
輸入這個指令後就可以像 vi一樣得操作, 這裡我只列出常用的基本操作:
$ set -o vi
change mode
mode | key |
---|---|
normal | <esc> |
insert | i |
visual | no implement |
常用操作
# Move
0 數字0,左移光標到本行開始
$ 右移光標,到本行的結尾
w 右移光標到下一個字的開頭(以空白和符號分隔)
W 右移光標到下一個字的開頭(以空白分隔)
e 右移光標到一個字的結尾(以空白和符號分隔)
E 右移光標到一個字的結尾(以空白分隔)
b 左移光標到前一個字的開頭(空白和符號分隔)
B 左移光標到前一個字的開頭(以空白分隔)
j 上一筆歷史紀錄
k 下一筆歷史紀錄
# Other
dd 刪除整行
S 刪除整行, 並轉換到insert mode
dw 刪除光標所在的字
這裡較特別的是j
, k
分別是上下一筆歷史紀錄.
為何要使用E
,W
,B
, 在vi
, 字的定義有兩種, 以符號分隔的稱為一個word
,以空白符號分隔的稱為一個WORD
, 在shell
底下因為會有dash
符號會隔開option
, 所以使用E
,W
,B
會較快, 如果還是不懂請用一開始$ operate -aaa-c -bbb -ccc -ddd -eee -fff file
的例子操作使用看看差異.
emacs mode in shell
首先先輸入這個指令:
$ set -o emacs
常用操作
# Move
C-a 左移光標到本行開始
C-e 右移光標,到本行的結尾
M-f 右移光標到一個字的結尾
C-p 上一筆歷史紀錄
C-n 下一筆歷史紀錄
# Other
C-k 刪除整行
M-d 刪除光標所在的字
結論
如果你喜歡這種操作方式的話, 可以將set -o emacs
或是將set -o vi
加入你的.bashrc
.
其實你會發現, 不用輸入set -o emacs
就可以達到emacs
的操作效果, 因為預設值就是emacs mode
,emacs
列出來的不多並不是因為emacs mode
比較弱, 因為筆者對emacs
不太熟.
這裡所列出來的並不是所有的功能, 只是將我覺得需要的功能列出來, 更多的功能請看man bash和man readline, 如果你使用其他shell
也可以用man
查查看, 每一種shell
支援的程度並不一樣.
題外話
fish shell
對於vim mode
支援相當的多, 在切換mode
的時候也會顯示, bash shell
切換之後常常會不知道你在insert mode
還是normal mode
.