Source Insight 3.5 宏的用法

Source Insight 3.5 宏的用法

Source Insight 是一个面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C/C++, C#和Java等程序的分析。能分析源代码并在工作的同时动态维护它自己的符号数据库,并自动显示有用的上下文信息。

Source Insight 3.5 宏的用法_第1张图片

最近使用 Source Insight 比较频繁,在编写代码的时候,一些常用重复操作可以用内置的快捷键来实现。但是一些不常用的操作就往往需要自己慢慢花时间实现。Source Insight 作为一个很好很强大的代码阅读与编辑工具,自然提供了自身的解决方案——宏语言。Source Insight 的宏语言很人性化地为用户提供了一整套对代码的编辑操作的内置操作,通过这些操作,用户能够定制出更加复杂更加适合自己的操作。

关于宏的用法,可以参考 Source Insight 3.5 的官方在线文档,而且还有贴心的pdf版可供下载。然而整个文档有差不多400页,根本不可能看完。

参考了网上的一些代码,然后自己试着编了一个宏:InserFileHeader。主要实现以下功能:

  1. 自动在文件的第一行开始插入该文件的描述,并生成代码模板
  2. 自动识别文件名,并添加到文件描述中
  3. 自动加入创建时间,格式为Year-Month-Day HH-MM-SS
  4. 自动根据文件类型创建不同的文件描述(目前仅支持c文件和h文件)

先看一眼效果吧:


效果

在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++, "")
            }
        }

    }

解释

  1. Base 工程: Base 工程是 Source Insight 自带的工程,存放目录一般为:C:\Users\XXX\Documents\Source Insight\Projects\Base。XXX 是电脑的用户名。Base 工程下的utils.em文件里面存放用户自定义的宏代码。比如我自定义的InsertFileHeader。
  2. 快捷键绑定:使用宏无非就是为了自身方便,所以常常给自己定义的宏绑定快捷键。OptionsKey Assignments,按下图设置:

    Source Insight 3.5 宏的用法_第2张图片

    可以看到左栏里边有很多以 Macro: 开头的命令,这都是在 utils.em 文件中实现的宏。而 Keystrokes 中显示当前命令所绑定的快捷键。注意:一个命令可以绑定多个快捷键。

  3. 内置命令解释

    InsBufLine:插入行,指定行号以及插入的内容。
    GetBufName:获取文件完整路径,包括文件名。
    GetSysTime:获取系统时间,参数不为 0 时获取本机时间,否则获取 UTC 时间。
    strlen:获取字符串长度。
    StrMid:截取字符串,从指定序号开始到制定序号结束(返回的字符串不包括结束序号,而且字符串序号从 0 开始)。

其实看文档就没什么问题了。

你可能感兴趣的:(编程技巧)