青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 76,  comments - 621,  trackbacks - 0
很多人可能沒有聽過tab trigger這個(gè)功能,那么諸位可以google一把即可知道其為何物。
本來我是打算把這樣的功能放到插件里面做的,可是一想到最后能為我的編輯器開發(fā)插件的,
在初期估計(jì)也沒啥人,于是乎還是在內(nèi)核上給予支持吧。

本篇文章即是分析如何去實(shí)現(xiàn)該功能的,事實(shí)上,我已經(jīng)在MegaxEdit基本上實(shí)現(xiàn)了。不過相較于
TextMate功能有所縮水。縮水的原因主要是因?yàn)槲也捎昧苏齽t表達(dá)式去實(shí)現(xiàn)的,而絕大多數(shù)
正則表達(dá)式庫(kù)是不支持嵌套的(本人使用了日本的鬼車正則庫(kù)),所以在我的編輯器里變量里面
不可以再定義變量。

在我的編輯器里面,這個(gè)東西不叫TextMate上的Bundle,我給起了個(gè)名字叫HotText, hoho~~~

首先我們看一下下面的語(yǔ)句:
for (${1:unsigned int} ${2:i} = ${3:0}; ${4:< ${5:count}}; ${6:++}) {
    $0
\}

基于上面的形式我們作出如下定義:

變量:    變量以${數(shù)字:內(nèi)容}的形式開頭, 內(nèi)容可以為空, 比如${1:name}, ${2:test}, ${3:}
引用:    這里面的引用是指對(duì)變量的引用, 比如 $數(shù)字, $1, $2, $3之類的
常量:    編輯器提供的常量,比如${FILE_NAME}, ${TIME}
規(guī)則:    變量不可嵌套變量, 變量必須順序定義,順序引用

經(jīng)過上面的規(guī)則,這個(gè)for語(yǔ)句就變成了下面這樣:
for (${1:unsigned int} ${2:i} = ${3:0}; ${4:} < ${5:count}}; ${6:++}) {
    $0
\}

Ok, 我們看一下典型的效果,當(dāng)用戶輸入for語(yǔ)句的時(shí)候,編輯器應(yīng)該顯示出:
for (<unsigned int> i = 0; i < count; i++) {
       
}
<>部分為光標(biāo)選擇區(qū)域。

聰明的讀者頭腦里面應(yīng)該馬上知道如何構(gòu)造了,其實(shí)也就是幾步正則替換,因?yàn)槲谋痉浅P。孕适欠浅?br>高效的。偽代碼如下:

const int MAX_HT_CNT = 16;

forint i=1; i<=MAX_HT_CNT; i++ ){   
    
//首先替換變量
    string strFind;
    strFind.Format( 
"\$\{%d:(.*?)\}", i );
    
string strReplace;
    strReplace.Format( 
"$1" );

    
//在進(jìn)行替換的時(shí)候我們同時(shí)要保存該變量Pos和長(zhǎng)度信息
    
//正因?yàn)槿绱?我們?cè)诙x了上面的規(guī)則,變量要順序定義,否則就亂序了。
    GetSearchPos&Length();
    RegexReplace();

    GetBackRef();
//在這兒獲取一下上面的()中內(nèi)引用內(nèi)容,在進(jìn)行一次替換
    
//替換對(duì)變量的引用
    string strRef;
    strRef.Format( 
"\$%d", i );
    RegexReplace();

    
//到這兒對(duì)變量1替換完畢
}


上面是非常簡(jiǎn)單的邏輯。

因?yàn)檫@東西要和編輯器結(jié)合,所以有一些數(shù)據(jù)結(jié)構(gòu)是必要的。最重要的要屬上面循環(huán)中變量的位置和長(zhǎng)度信息了。
有了它我們才能夠?qū)崿F(xiàn)HotSpot(熱點(diǎn)即變量)的跳轉(zhuǎn)。

在這里,我簡(jiǎn)單描述一下我的編輯器的數(shù)據(jù)結(jié)構(gòu):

// 這個(gè)存儲(chǔ)了每一個(gè)變量的信息
struct CTextSpot{
    CText pCText;
    
int nPos;

    CTextSpot(){
        pCText 
= 0;
        nPos 
= -1;
    }
};

// 保存了HotText的基本信息
class HotText{
public:
    
int m_nDocOffset;//HotText應(yīng)該從Doc中哪個(gè)偏移開始插入
    CText m_Text;//原始文字
    CText m_RetText;//替換后的文字
    CTextSpot m_List[ MAX_HT ];//最多可以有幾個(gè)變量
    int m_nSpotPos;//指向當(dāng)前Spot,這樣在Tab跳轉(zhuǎn)的時(shí)候我們就知道該跳到那個(gè)Spot上了
}

這些HotText均保存于Map之中,根據(jù)當(dāng)前的輸入進(jìn)行查詢,思路還是很簡(jiǎn)單的。

和編輯器的結(jié)合,基本上就是一個(gè)Replace命令,用本次輸入產(chǎn)生的HotText替換掉上次的HotText.因?yàn)榇蟛糠值?br>HotText都很短,所以幾乎不會(huì)浪費(fèi)內(nèi)存。EmEditor則是只對(duì)用戶最后的輸入產(chǎn)生Insert命令,雖然節(jié)省了一點(diǎn)內(nèi)存
但卻失去了UndoRedo的能力,到底哪個(gè)好,也不好說。MegaxEdit是采用的前者。

關(guān)于HotText的取消:

用戶在輸入的時(shí)候不能總處于HotText狀態(tài)中吧,比如用戶按下了方向鍵或者其他快捷鍵,這個(gè)時(shí)候我們要取消
HotText的功能,恢復(fù)Tab鍵本來的作用。那么如何取消呢?其實(shí)這東西和編輯器結(jié)合過于緊密,在MegaxEdit中
是這樣來實(shí)現(xiàn)的:
1. 取得當(dāng)前光標(biāo)的偏移量 offsetA
2. 取得當(dāng)前HotSpot的尾部偏移量 offsetB = m_nDocOffset + HotSpot.nPos + HotSpot.pCText.GetLength();
3. offsetA != offsetB, 即取消當(dāng)前HotText;

到此,邏輯即全部結(jié)束。

雖然我們實(shí)現(xiàn)了一個(gè)縮水版的tab trigger,不過根據(jù)我的研究,這幾乎可以滿足絕絕絕絕絕絕大多數(shù)的應(yīng)用,至少比
Notepad++上的QuickText要強(qiáng)多了。不占用 CPU,不占用內(nèi)存,完美UndoRedo, 夠用了。

歡迎討論。
posted on 2010-02-02 20:39 megax 閱讀(3073) 評(píng)論(12)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品理论片| 欧美亚洲在线播放| 久久色中文字幕| 国产美女精品免费电影| 久久精品国产一区二区三区| 欧美 日韩 国产 一区| 亚洲午夜视频在线| 国产精品一卡二| 美女精品自拍一二三四| 亚洲午夜久久久| 亚洲国产你懂的| 亚洲精品美女在线| 黄色国产精品一区二区三区| 国产精品九色蝌蚪自拍| 欧美网站在线| 国产精品mv在线观看| 欧美激情一区二区三区| 免费观看成人www动漫视频| 欧美大片va欧美在线播放| 久久青草久久| 久久久久综合| 国产精品成人观看视频免费| 国产精品成人一区二区网站软件| 欧美美女日韩| 国产一区二区三区奇米久涩| 国产在线播精品第三| 黄色成人片子| 亚洲一区在线免费观看| 亚洲综合另类| 亚洲欧美成人| 免费视频一区二区三区在线观看| 久久亚洲综合色| 亚洲国产高清高潮精品美女| 在线视频免费在线观看一区二区| 最新69国产成人精品视频免费| 亚洲在线观看视频网站| 亚洲图片欧美午夜| 悠悠资源网亚洲青| 亚洲精品欧美极品| 99精品免费| 欧美一区二区三区四区高清| 午夜国产一区| 免费久久99精品国产| 欧美一区激情视频在线观看| 亚洲国内自拍| 亚洲午夜黄色| 久久国产精品黑丝| 一区二区av| 久久精品亚洲一区二区| 99视频超级精品| 久久艳片www.17c.com| 欧美日韩午夜激情| 国产一区二区三区在线观看视频 | 亚洲黄色一区| 亚洲激情第一区| 一区二区av在线| 欧美成人自拍视频| 亚洲日本无吗高清不卡| 欧美亚洲综合在线| 亚洲国产天堂久久国产91| 亚洲精华国产欧美| 亚洲永久免费视频| 欧美69wwwcom| 国产精品毛片| 欧美日韩国产片| 国产精品美女久久久久久久| 激情一区二区三区| 国内精品久久久久久久影视蜜臀| 伊人色综合久久天天五月婷| 国产精品v欧美精品v日韩| 国内精品视频久久| 午夜综合激情| 亚洲国内欧美| 久久综合九色| 一区二区亚洲欧洲国产日韩| 亚洲一区二区高清视频| 99热在这里有精品免费| 亚洲国产精品久久久久| 久久高清国产| 国产精品伦子伦免费视频| 亚洲精品国产精品国自产在线 | 国内精品国语自产拍在线观看| 欧美视频中文一区二区三区在线观看| 国产婷婷成人久久av免费高清| 在线观看欧美视频| 国内偷自视频区视频综合| 一二三区精品| 欧美好吊妞视频| 欧美体内谢she精2性欧美| 亚洲国产欧美在线人成| 国际精品欧美精品| 午夜在线电影亚洲一区| 日韩视频中午一区| 欧美在线观看网站| 狠狠色狠狠色综合日日tαg| 欧美一区二视频| 午夜激情综合网| 国产精品分类| 日韩一级免费| 亚洲精品少妇30p| 欧美日韩成人在线| 99re亚洲国产精品| 亚洲精品永久免费精品| 亚洲国产视频一区| 欧美激情在线观看| 美玉足脚交一区二区三区图片| 欧美成年人网| 欧美ed2k| 亚洲欧洲精品一区| 亚洲电影一级黄| 久久久国产午夜精品| 久久影院午夜片一区| 欧美一区激情| 韩国福利一区| 欧美3dxxxxhd| 欧美成人一区二区三区片免费 | 久久国产精品一区二区| 国内久久精品视频| 久久精品1区| 久久久xxx| 亚洲精品一区中文| 亚洲美女av在线播放| 欧美午夜理伦三级在线观看| 亚洲免费一在线| 免费欧美日韩国产三级电影| 亚洲最新在线| 亚洲自拍另类| 亚洲一区欧美激情| 好吊视频一区二区三区四区| 麻豆久久久9性大片| 欧美不卡福利| 欧美va天堂| 国产精品午夜春色av| 亚洲欧美国产77777| 欧美日韩成人| 另类亚洲自拍| 亚洲激情在线观看| 国产亚洲欧洲997久久综合| 亚洲午夜免费福利视频| 欧美精品999| 久久久一区二区| 久久久7777| 亚洲一区二区精品在线观看| 久久九九久久九九| 久久国产精品久久久久久电车| 久久综合色8888| 午夜久久久久久| 欧美精品福利| 激情久久影院| 亚洲少妇自拍| 亚洲三级性片| 欧美一级电影久久| 亚洲欧美三级伦理| 国产私拍一区| 中日韩视频在线观看| 欧美午夜大胆人体| 小辣椒精品导航| 欧美激情乱人伦| 久久视频一区| 国产精品久久久久久久app| 欧美国产精品专区| 国产片一区二区| 一本一本久久| 一区二区精品在线观看| 每日更新成人在线视频| 99国内精品久久| 久久精品国产第一区二区三区| 亚洲免费在线| 欧美三级午夜理伦三级中文幕| 亚洲欧洲综合另类在线| 亚洲免费视频一区二区| 在线看国产日韩| 在线视频日韩| 一区二区免费在线观看| 久久亚洲高清| 麻豆亚洲精品| 一区二区视频在线观看| 欧美在线免费一级片| 久久成人18免费网站| 国产精品高潮视频| 日韩亚洲综合在线| 亚洲三级网站| 亚洲精品小视频在线观看| 嫩草成人www欧美| 一本色道久久88综合亚洲精品ⅰ| 国产精品一级久久久| 一区二区三区欧美激情| 欧美成人网在线| 亚洲欧洲另类| 模特精品在线| 亚洲第一精品影视| 欧美国产在线电影| 欧美一区二区三区视频在线观看| 久久精品亚洲一区| 国产一区二区三区精品久久久| 午夜精品一区二区三区在线播放| 久久精品视频导航| 亚洲精品一二三区| 欧美怡红院视频一区二区三区| 欧美肥婆bbw|