您的位置:首页 > 其它

[editor]Source Insight编辑器的快捷键设置暨相关宏语言(Macro Language)的学习一

2017-01-07 15:34 495 查看
   今天壁纸突然变成了一幅图,图里有句话:“人的乐趣之一就是去完成那些别人认为你完成不了的事”。所以就有了这篇博文。如果没有这句话,此篇博文还要晚上几天才能发出来。感谢百度壁纸软件予我醍醐灌顶(微笑脸

)。

   最近在使用Source Insight编辑器来维护和编写C/C++代码,不得不说其的确好用强大。但对于中文的支持和美观性却不如人意,但用起来还是一如既往的爽。

   Source Insight编辑器中的快捷键是可以自定义的,这里的自定义是说:可以通过编写宏(Macro)来定义特定快捷键的功能。曾经基友对我说过:不要做工具党。他甚至都没想到这句话会影响到我现在任何事情都要亲历亲为(再次微笑脸

)。


   Source Insight编辑器缺少两个我需要的快捷键,那么我就自己写两个宏好了。

   首先摆出一个链接http://blog.csdn.net/ytmfdw/article/details/43487453   名为"Source Insight自定义快捷键"。正是这篇文章给了我一个大的方向----看帮助文档,给出链接以表尊重。(声明:代码文章皆是原创,没有对此链接博文进行抄袭



   下午花了三个小时对帮助文档(Source Insight Help Document)中的宏语言模块(Macro language)进行了特定的学习,基本了解到Source Insight内置宏语言是一门类C类脚本的语言。官方文档中写到:“The Source Insight macro language syntax is similar to C”又写到:“Source
Insight provides a C-like macro language”,这些都说明了其语法等方面都是类C的。


   本篇博文先着重讲两个功能的实现,关于其宏语言的语法,在下篇博文中将会系统的讲到。




   好了,下面进入到正题

[b]--------------------------------------------------------------------------[/b]

--------------------------------------------------------------------------

   功能一:快速删除多个空格

  1、问题描述:

  

#include<iostream>
using std::cout;
using std::endl;
int main(int argc,char** argv)
{
cout << "hello world" << endl;
int i = 1;
cout << i << endl;
return 0;
}
                   看到了吗?第7、8行代码没有缩进对齐。我是一个有代码洁癖的人,这种情况真的是不能忍。那能做的就是这样:(特地做的动态图





                  
看到之前处理这种情况是,按下Backspace键,进行多次回退,调整到我们需要的位置。第7行代码的调整,按了4下Backspace键,1下Tab键。

         下面是我写的宏的效果:



          
第7行调整位置,1次Ctrl+Backspace,一次Tab键。优化体现在了:我现在可以使用快捷键一次将光标左侧的字符一次清空。之前需要5个单位时间的工作量现在只需要2个单位时间就可以完成了。


         
2.代码解析

//Source Insight Macro Language 是大小写不敏感(not case sensitive)的且变量使用时不需提前声明的。
//这些在官方文档中提到过,下篇博文会对其语法(syntex of Macro Language)进行讲解。
macro SelfDel()
{
hwnd = GetCurrentWnd();                        //取得当前窗口句柄,获得当前活动窗口的句柄,用于确定要对哪个文件进行操作。
Ln = GetWndSel(hwnd);                          //取得当前选中位置信息返回一个record var变量相当于一个字典变量
raw = Ln.lnFirst;                              //光标所在行号,注意首行行号为0

hbuf = GetCurrentBuf();                        //取得当前文件内Buffer,可以理解为文件本身或者是文件在内存中的头指针。
strLine = GetBufLine(hbuf,raw);                //得到在raw行的字符串内容
if(strLine == Nil)                             //如果当前没有任何字符(注意这里说的是任意字符,包括不可见字符),那么安全退出
{
stop;                                  //如果if语句被执行,那么stop会将宏安全退出。类似于C中的return
}
strLineLength = strlen(strLine);               //取得字符串长度
PutBufLine(hbuf,raw,strmid(strLine,Ln.ichFirst,strLineLength));//将特定行的字符用处理过后的字符串替代,实现删除空白假象
stop;                                                          //程序最后了,其实加不加stop都一样
}


[b]--------------------------------------------------------------------------[/b]

--------------------------------------------------------------------------

   功能二:快捷键注释代码
  1、功能描述

   在其他的主流编辑器中,Ctrl+/是注释功能的快捷键,而在Source Insight中确实没有的,其Ctrl+/的功能是全局搜索的功能。维护裁剪代码非常的不方便,经过我的认真思考与借鉴,得到了一个这样的效果:

             

     
  我只需要将我想注释的代码块选中,按下Ctrl+B即可。同时在未选中任何代码块的情况下,Ctrl+B会只注释掉当前光标所在的一行。如果该行已经被注释,那么按下Ctrl+B的效果将会是取消注释。

  

  2.代码解析

macro strLineNotSpace(strline)//有参数的宏函数是不能作为命令在直接使用的,它是被其他宏来调用的
{
i = 0;
Length = strlen(strline);
while(i < Length)
{
integerAsciiFromChar = AsciiFromChar(strline[i])//得到每个字符的ASCII码值
if(integerAsciiFromChar != 9  && integerAsciiFromChar != 32)//返回第一个出现非空白字符的位置
return i;//这里的9代表Tab空白符,32表示space空白符
i++;
/*
不要忘了这个自增运算,我就是忘了一下,导致运行宏的时候整个Source Insight软件崩溃.
如果在软件启动的时候,这个宏自动运行了
那么这大概这就是一个比较简陋的宏病毒吧
*/
}
}

macro CommentCode()
{
hwnd = GetCurrentWnd();//取得当前活动窗口句柄?
hbuf = GetCurrentBuf();
lnFirst = GetWndSelLnFirst(hwnd);//得到选中区域首行索引
lnLast = GetWndSelLnLast(hwnd);//得到选中区域末行索引
LineCount = GetBufLineCount(hbuf)//得到整个文件Buffer总行数

i = lnFirst;//选中区域首行索引
while(i <= lnLast)
{
strline = GetBufLine(hbuf,i);//
strlineLength = strlen(strline);//取得字符串长度
if(strlineLength == 0)//对于空白行,我们执行continue跳过,不做任何操作
{
i++;
if(i >= LineCount)
stop;
SetBufIns(hbuf,i,1);
continue;
}
midIndex = strLineNotSpace(strline);
newstrline = cat(strmid(strline,0,midIndex),"//");
newstrline = cat(newstrline,strmid(strline,midIndex,strlineLength));

if(strlineLength > 2)//对待字符长度大于2的行,就要检测它是不是已经被注释了,如果是的话,就取消注释
{
if(strmid(strline,midIndex,midIndex+2) == "//")//取消注释
{
newstrline = cat(strmid(strline,0,midIndex),strmid(strline,midIndex+2,strlineLength));

}
}
PutBufLine(hbuf,i,newstrline);
i++;
if(i >= LineCount)
stop;
SetBufIns(hbuf,i,1);//将光标移到下一行,使得Ctrl+B可以连续执行
}

}

      总结:

   其实呢像这种宏语言没有必要去花费时间学习,只要能用就可以。可以通文档来找到自己需要的函数即可,多查本地文档而不是去百度。


   在Source Insight中,宏函数要放在一个*.em文件中,其后缀名称的含义我猜测应该是extension macro。在其中编写完毕之后点击菜单项Options->Key Assignments,将快捷键同无参数宏函数关联起来。

   还是那句话,Source Insight只是一个工具,其实没必要去做太多的工作。但笔者已经决定在Win平台上使用Source Insight,Linux平台上使用Vim了。所以适当的做一些订制化的工作是可以的。同时笔者很不喜欢直接拿别人的拓展程序直接用,直接从GitHub上复制别人的程序,我感觉轮子只要你自己造一遍,才能更好的驾驭它。

附录:本博文代码文件下载


http://download.csdn.net/detail/i_am_tom/9731866


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: