BindKey 實現可自定義的快捷鍵

2021-05-23 19:52:22 字數 1020 閱讀 6169

用過emacs的人都知道,其快捷鍵有多麼強大,利用組合鍵c-x c-w,你可以將buffer內容另存為乙個新的檔案。那麼程式是如何響應使用者輸入的快捷鍵呢?又如在linux的shell環境中,ctrl+r可以查詢以前使用過的歷史命令,這是由readline庫來實現的。下面實現的這個**,允許將乙個函式繫結到一串字串,如果命中了該字串,則呼叫繫結的介面函式。

目前的實現,是使用樹來管理所有的快捷鍵路徑,每個節點都可以繫結乙個函式,但我們應該遵循最長命令的原則,即如果a-b是乙個快捷鍵,a-b-c也是乙個快捷鍵,那麼當輸入a-b時需要等待使用者下乙個輸入,如果沒有輸入,或者輸入非c,則呼叫a-b快捷方式;否則呼叫a-b-c快捷方式。還有以下兩個問題沒有很好地解決,乙個是,在使用者輸入a-b後,如何判斷使用者沒有後續的輸入了?乙個是,如果a和a-b都是快捷鍵,如果使用者連續輸入兩個a,應該怎麼呼叫快捷鍵a?

例如對於下面五個快捷鍵, 

axh, axe, axeh, abxh, acxh

我們將會生成一棵如下的多分枝樹:

/->c->x->h* |

a->x->h*

|   |

|   /->e*->h*

/->b->x->h*

我們知道,esc鍵的ascii值為0x1b, 而方向鍵和f1-f12功能鍵的序列值也是以0x1b開始的,那麼如何區別使用者鍵入的是esc鍵還是方向鍵呢?

下面開始貼上分析**。

首先是資料結構,如果有不清楚的,請看詳細注釋。

然後是初始化和銷毀介面,提供了節點記憶體的申請和釋放介面和整個keymap的初始化和銷毀介面。

下面的介面函式可用來列印所有的快捷鍵路徑。

這個介面用來查詢某個字串是否繫結了快捷鍵,如果沒有繫結, 則返回空指標。

下面是實現繫結的介面, 將快捷鍵分散到樹的各個節點上:

以下為測試函式:

另外,下面使用乙個while迴圈來響應使用者的輸入,用來測試如何檢查使用者輸入的每個字元是否被繫結到快捷鍵。

其中函式wdm_keymap_get_next()使用當前節點和當前使用者輸入的鍵值來獲取下乙個節點。

自定義可拖拽view

我們知道view的繪製有三個重要的過程分別是measure,layout,draw.measure負責測量view的尺寸,layout負責定位view的位置,draw負責把view繪製到上。我們這就是通過layout重新定位view。public class custommoveview exten...

可復用的自定義Adapter

public abstract class myadapterextends baseadapter public myadapter arraylis ata,int mlayoutres override public intgetcount override public t getitem ...

自定義Visual Studio 2010 快捷鍵

當我們要輸入console.writeline 的時候,只要輸入cw,然後兩下tab鍵就自動完成輸入了,這個應該你知道吧。可是要想輸入console.readline 怎麼辦?是不是輸入cr,然後兩下tab鍵也可以自動完成呢?可是,不是。額。那怎麼辦呢?嗯。那就自定義咯。自定義步驟 以cr cons...