快捷鍵和控制序列 自己實現vi

2021-08-25 07:58:04 字數 1706 閱讀 7511

從《快捷鍵和控制序列--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...