從《快捷鍵和控制序列--bash的命令列編輯原理以及其它雜述》中已經明白了按鍵和控制序列的原理,現在可以猜一下vi的原理了,大體上vi可能會包含類似下面的結構,也就是一些鍵對映,其中有乙個命令對映和乙個插入對映:
keymap map_cmd = ,
,...
}keymap map_inst = ,
,...
}...
可是看了vi的源**之後發現並不是這回事,normal函式夠看一陣了了,edit函式也夠喝一壺的,不過這兩個函式的邏輯都很簡單的。好了,既然vi不是上面猜測的那樣,可是我還是不甘心,上面的那個猜測多好啊,多麼oo啊,不用豈不可惜,於是就著這個猜測自己實現乙個vi,雖然簡陋但是可以說明問題:
#include
#include
#include
#include
typedef int function ();
typedef struct key key;
char bufline[1024] = ; //簡化起見,只編輯一行,不處理換行回車符
int pos = 0; //游標的當前位置
int a_ifunc(); //這裡定義一大堆函式,用來處理字元輸入
...key key_i = ,,,
,};key key_c = ,,,
,};key *cur = key_i;
int set_position(row, line) //設定游標的位置,vt100相容終端下可用
;sprintf(cmd, "/033[%d;%dh", row, line);
printf(cmd);
}int a_ifunc() //插入模式下的字元a處理函式
int b_ifunc() //插入模式下的字元b處理函式
int c_ifunc() //插入模式下的字元c處理函式
int d_ifunc() //插入模式下的字元d處理函式,切換模式
int a_cfunc() //命令模式下的字元a處理函式,前移游標
;pos ++;
set_position(1,pos);
return 1;
}int b_cfunc() //命令模式下的字元b處理函式,後退游標
;pos --;
if (pos <= 0)
pos = 0;
set_position(1,pos);
return 1;
}int c_cfunc() //命令模式下的字元c處理函式,自定義
int d_cfunc() //命令模式下的字元d處理函式,切換模式
int main(int argc, char **argv)
printf("/033[2j/n" ); //學習vi,清屏,配置乙個好的試驗場
set_position(1,0); //游標設定到最上面的一行開始
memset(bufline, 32, 1024); //將緩衝區設定成空格,方便使用printf列印,否則全部初始化為0的話就要逐字元列印了
while (1) }}
編譯它:
gcc minivi.c -o minivi
然後執行minivi,輸入一下,切換一下,再輸入一下...輸入乙個a,b,c,d之外的字元就以段錯誤退出,並且minivi只能處理4個字元只有兩個模式,這問題決定了minivi是乙個很值得擴充套件的程式,大框架在此,懶得擴充套件了,骨架好身材就好,不在乎肉多肉少
vi常用快捷鍵
2011 04 28 16 43 27 分類 linux unix 編 舉報 字型大小 訂閱 以前習慣在editplus,vs上編輯,感覺很方便,工作原因,現在不得不在黑框框上折騰,總覺得旁邊同事用vi很牛很強大,剛才csdn上搜了下,上面講述vi快捷鍵的文章一大堆,並且長的讓你不忍心浪費時間看下去...
vi 快捷鍵積累
根據自己用到的 或者還沒記住的 或者用的時候忘了的,慢慢積累。一 全選複製貼上。全選 ggvg 注釋 gg 游標移到首行 v 進入visual 可視 模式 g 游標移到最後一行全選 選中後可以進行其他操作,比如 y 複製選中內容到 暫存器,也就是系統的剪貼簿,供其他程式使用 d 刪除選中內容 y 複...
vi常用快捷鍵
進入vi的命令 vi filename 開啟或新建檔案,並將游標置於第一行首 vi n filename 開啟檔案,並將游標置於第n行首 vi filename 開啟檔案,並將游標置於最後一行首 vi pattern filename 開啟檔案,並將游標置於第乙個與pattern匹配的串處 vi r...