Sunwayking

导航

[原创]让 Visual Studio 也能支持 CUDA 代码折叠和打印服务

本文为Sunwayking原创,转载请注明出处和作者!

光把CUDA SDK中的usertype.dat文件复制到IDE目录下,只能让VS支持CUDA的关键字高亮显示;而VS好用的代码折叠却不能应用到CU文件上,真是让人气愤.于是我就翻翻注册表,发现了可以让VS支持CU文件代码折叠的方法:

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\[XXX]\Languages\Language Services\C/C++

下,向"NCB Default C/C++ Extensions"项里追加.cu;即可,譬如".cpp;.cxx;.c;.cc;.h;.hh;.hxx;.hpp;.inl;.tlh;.cu;"

注释:[XXX]是你的VS版本号.

如此一来,重启VS即可开到CU文件也享用到代码折叠服务!

再来说一下打印服务的问题,原本VS里面代开CU文件,可以看到打印按钮和菜单项是Disabled的,这可急煞人了,大家知道VS可以提供代码高亮和现实行号功能,这样打印出来的代码非常清晰工整,但是现在VS死活不让我们打印CU文件,不知道MS心里的什么.

那么如何解决呢,其实VS的打印功能的启用/禁用是通过宏来实现的,我们打开宏管理器,编辑VSEditor模块里的IsPrintableFile函数,向其中添加.cu的支持,修改后的代码如下:

    Function IsPrintableFile(ByVal projItem As EnvDTE.ProjectItem) As Boolean
        Dim fileName As String
        Dim extensions As New System.Collections.Specialized.StringCollection
        ' 如果添加到项目的文件属于可以打印的类型,
        ' 则将该文件类型的扩展名添加到以下列表:
        Dim exts As String() = {".cpp", ".c", ".h", ".cu", ".idl", ".def", ".rgs", ".rc", ".cs", ".vb", ".xml", ".txt", ".jsl"}

        extensions.AddRange(exts)
        fileName = projItem.FileNames(1)
        Return extensions.Contains(System.IO.Path.GetExtension(fileName).ToLower())
    End Function

然后重新打开CU文件,你就会发现VS已经让你打印它了.

这里说明一下,还有几个宏函数没有提供对CUDA的支持,您可以参考下面的代码一并给他改了:

Utilities模块:

    ''
    '' 此模块和其他模块的 Helper 函数。
    ''
    Function LineOrientedCommentStart(Optional ByVal document As Document = Nothing) As String
        Dim extension As String

        If (document Is Nothing) Then
            document = DTE.ActiveDocument
        End If

        extension = document.Name
        If (extension.EndsWith(".cs") Or extension.EndsWith(".cpp") Or extension.EndsWith(".cu") Or extension.EndsWith(".h") Or extension.EndsWith(".idl") Or extension.EndsWith(".jsl")) Then
            Return "//"
        ElseIf (extension.EndsWith(".vb")) Then
            Return "'"
        Else
            Throw New Exception("Unrecognized file type. You can add this file type by modifying the function Utilities.LineOrientedCommentStart to include the extension of this file.")
        End If
    End Function

DevStudio6Editor模块:

    Function FileType(ByVal doc As EnvDTE.Document) As Integer
        ' 如果要确定源文件的类型,此例程有多种
        '   用途。
        ' 返回值: 0 文件类型未知
        '               1 与 C 相关的文件,包括 .c、.cpp、.cxx、.h、.hpp 和 .hxx
        '               2 与 Java 相关的文件,包括 .jav 和 .java
        '               3 ODL 样式的文件,包括 .odl 和 .idl
        '               4 资源文件,包括 .rc 和 .rc2
        '               5 HTML 样式的文件,包括 .html 和 .htm
        '               6 VBS 样式的文件: .dsm
        '               7 Def 样式的文件: .def
        ' 用途: 向此函数传递要获取其信息的文档。

        Dim pos As Integer
        Dim ext As String
        ext = doc.Name
        FileType = 0

        pos = InStr(ext, ".")
        If pos > 0 Then
            Do While pos <> 1
                ext = Mid(ext, pos, Len(ext) - pos + 1)
                pos = InStr(ext, ".")
            Loop
            ext = LCase(ext)
        End If
        If ext = ".rc" Or ext = ".rc2" Then
            FileType = 4

        ElseIf doc.Language = EnvDTE.Constants.dsCPP Then
            FileType = 1
        ElseIf ext = ".cu" Then
            FileType = 1

        ElseIf doc.Language = EnvDTE.Constants.dsJava Then
            FileType = 2
        ElseIf doc.Language = EnvDTE.Constants.dsIDL Then
            FileType = 3
        ElseIf doc.Language = EnvDTE.Constants.dsHTML_IE3 Then
            FileType = 5
        ElseIf ext = ".xml" Then
            FileType = 5
        ElseIf doc.Language = EnvDTE.Constants.dsHTML_RFC1866 Then
            FileType = 5
        ElseIf doc.Language = EnvDTE.Constants.dsVBSMacro Then '
            FileType = 6
        ElseIf ext = ".def" Then
            FileType = 7
        Else
            FileType = 0
        End If
    End Function

 

最后说明一点,以上所有操作均是建立在您已经完整的对VS添加了CUDA支持的情况上,如果您的VS无法正常建立和编译CUDA工程的话,那么请先搜索如何对VS添加了CUDA支持的教程并按部就班的设置好您的VS.如果您不这样做,很可能导致我这篇修改教程里的部分设置不能很好的发挥作用.

posted on 2009-10-21 12:34  Sunwayking  阅读(623)  评论(0编辑  收藏  举报