Source Insight 是一个面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C/C++, C#和Java等程序的分析。能分析源代码并在工作的同时动态维护它自己的符号数据库,并自动显示有用的上下文信息。
最近使用 Source Insight 比较频繁,在编写代码的时候,一些常用重复操作可以用内置的快捷键来实现。但是一些不常用的操作就往往需要自己慢慢花时间实现。Source Insight 作为一个很好很强大的代码阅读与编辑工具,自然提供了自身的解决方案——宏语言。Source Insight 的宏语言很人性化地为用户提供了一整套对代码的编辑操作的内置操作,通过这些操作,用户能够定制出更加复杂更加适合自己的操作。
关于宏的用法,可以参考 Source Insight 3.5 的官方在线文档,而且还有贴心的pdf版可供下载。然而整个文档有差不多400页,根本不可能看完。
参考了网上的一些代码,然后自己试着编了一个宏:InserFileHeader。主要实现以下功能:
先看一眼效果吧:
在c文件中生成的效果:
/**
******************************************************************************
* @file bsp_can.c
* @author rhh@DMET-SKL
* @version V1.0
* @date 2015-8-30 20:05:24
* @brief This file provides all the bsp_can functions.
******************************************************************************
* @attention
*
* FILE FOR DMET-SKL ONLY
*
* Copyright (C), 2015-2025, 华中科技大学数字制造装备与技术国家重点实验室
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include"bsp_can.h"
/* Private typedef -----------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
在h文件中生成的效果:
/**
******************************************************************************
* @file bsp_can.h
* @author rhh@DMET-SKL
* @version V1.0
* @date 2015-8-30 20:10:13
* @brief This file contains all the functions prototypes for the BOARD
* bsp_can
******************************************************************************
* @attention
*
* FILE FOR DMET-SKL ONLY
*
* Copyright (C), 2012-2022, 华中科技大学数字制造装备与技术国家重点实验室
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_CAN_H
#define __BSP_CAN_H
/* Includes ------------------------------------------------------------------*/
#include "includes.h"
/* Exported typedef ----------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
#endif /* __BSP_CAN_H */
然后再看一眼代码:
macro InserFileHeader()
{
LnFirst = 0
hbuf = GetCurrentBuf()
fPath = GetBufName(hbuf)
LocalTime = GetSysTime(1)
Year = LocalTime.Year
Month = LocalTime.Month
Day = LocalTime.Day
Time = LocalTime.time
if (fPath != hNil)
{
fLen = strlen(fPath)
len = fLen
while(StrMid(fPath, len - 1, len) != "\\")
{
len = len - 1
}
fileName = StrMid(fPath, len, fLen - 2)
if(StrMid(fPath, fLen - 1, fLen)=="c")
{
InsBufLine(hbuf, LnFirst++, "/**")
InsBufLine(hbuf, LnFirst++, " ******************************************************************************")
InsBufLine(hbuf, LnFirst++, " * \@file@fileName@.c")
InsBufLine(hbuf, LnFirst++, " * \@author rhh\@DMET-SKL")
InsBufLine(hbuf, LnFirst++, " * \@version V1.0")
InsBufLine(hbuf, LnFirst++, " * \@date@Year@-@Month@-@Day@ @Time@")
InsBufLine(hbuf, LnFirst++, " * \@brief This file provides all the @fileName@ functions. ")
InsBufLine(hbuf, LnFirst++, " ******************************************************************************")
InsBufLine(hbuf, LnFirst++, " * \@attention")
InsBufLine(hbuf, LnFirst++, " *")
InsBufLine(hbuf, LnFirst++, " * FILE FOR DMET-SKL ONLY")
InsBufLine(hbuf, LnFirst++, " *")
InsBufLine(hbuf, LnFirst++, " * Copyright (C), 2015-2025, 华中科技大学数字制造装备与技术国家重点实验室")
InsBufLine(hbuf, LnFirst++, " ******************************************************************************")
InsBufLine(hbuf, LnFirst++, " */ ")
InsBufLine(hbuf, LnFirst++, "")
InsBufLine(hbuf, LnFirst++, "/* Includes ------------------------------------------------------------------*/")
InsBufLine(hbuf, LnFirst++, "")
InsBufLine(hbuf, LnFirst++, "#include\"@[email protected]\"")
InsBufLine(hbuf, LnFirst++, "")
InsBufLine(hbuf, LnFirst++, "/* Private typedef -----------------------------------------------------------*/")
InsBufLine(hbuf, LnFirst++, "/* Private macro -------------------------------------------------------------*/")
InsBufLine(hbuf, LnFirst++, "/* Private variables ---------------------------------------------------------*/")
InsBufLine(hbuf, LnFirst++, "/* Private function prototypes -----------------------------------------------*/")
InsBufLine(hbuf, LnFirst++, "/* Private functions ---------------------------------------------------------*/"
InsBufLine(hbuf, LnFirst++, "")
}
else if(StrMid(fPath, fLen - 1, fLen)=="h")
{
upperName = toupper(fileName)
InsBufLine(hbuf, LnFirst++, "/**")
InsBufLine(hbuf, LnFirst++, " ******************************************************************************")
InsBufLine(hbuf, LnFirst++, " * \@file@fileName@.h ")
InsBufLine(hbuf, LnFirst++, " * \@author rhh\@DMET-SKL")
InsBufLine(hbuf, LnFirst++, " * \@version V1.0")
InsBufLine(hbuf, LnFirst++, " * \@date@Year@-@Month@-@Day@ @Time@")
InsBufLine(hbuf, LnFirst++, " * \@brief This file contains all the functions prototypes for the BOARD ")
InsBufLine(hbuf, LnFirst++, " * @fileName@ ")
InsBufLine(hbuf, LnFirst++, " ******************************************************************************")
InsBufLine(hbuf, LnFirst++, " * \@attention")
InsBufLine(hbuf, LnFirst++, " *")
InsBufLine(hbuf, LnFirst++, " * FILE FOR DMET-SKL ONLY")
InsBufLine(hbuf, LnFirst++, " *")
InsBufLine(hbuf, LnFirst++, " * Copyright (C), 2012-2022, 华中科技大学数字制造装备与技术国家重点实验室")
InsBufLine(hbuf, LnFirst++, " ******************************************************************************")
InsBufLine(hbuf, LnFirst++, " */ ")
InsBufLine(hbuf, LnFirst++, "")
InsBufLine(hbuf, LnFirst++, "/* Define to prevent recursive inclusion -------------------------------------*/")
InsBufLine(hbuf, LnFirst++, "")
InsBufLine(hbuf, LnFirst++, "#ifndef __@upperName@_H")
InsBufLine(hbuf, LnFirst++, "#define __@upperName@_H")
InsBufLine(hbuf, LnFirst++, "")
InsBufLine(hbuf, LnFirst++, "/* Includes ------------------------------------------------------------------*/")
InsBufLine(hbuf, LnFirst++, "")
InsBufLine(hbuf, LnFirst++, "#include \"includes.h\"")
InsBufLine(hbuf, LnFirst++, "")
InsBufLine(hbuf, LnFirst++, "/* Exported typedef ----------------------------------------------------------*/")
InsBufLine(hbuf, LnFirst++, "/* Exported variables --------------------------------------------------------*/")
InsBufLine(hbuf, LnFirst++, "/* Exported macro ------------------------------------------------------------*/")
InsBufLine(hbuf, LnFirst++, "/* Exported functions ------------------------------------------------------- */")
InsBufLine(hbuf, LnFirst++, "")
InsBufLine(hbuf, LnFirst++, "#endif /* __@upperName@_H */")
InsBufLine(hbuf, LnFirst++, "")
}
}
}
快捷键绑定:使用宏无非就是为了自身方便,所以常常给自己定义的宏绑定快捷键。Options
→ Key Assignments
,按下图设置:
可以看到左栏里边有很多以 Macro: 开头的命令,这都是在 utils.em 文件中实现的宏。而 Keystrokes 中显示当前命令所绑定的快捷键。注意:一个命令可以绑定多个快捷键。
内置命令解释:
InsBufLine:插入行,指定行号以及插入的内容。
GetBufName:获取文件完整路径,包括文件名。
GetSysTime:获取系统时间,参数不为 0 时获取本机时间,否则获取 UTC 时间。
strlen:获取字符串长度。
StrMid:截取字符串,从指定序号开始到制定序号结束(返回的字符串不包括结束序号,而且字符串序号从 0 开始)。
其实看文档就没什么问题了。