【问题标题】:Need suggestions for method to format c comment via a keystroke macro需要有关通过击键宏格式化 c 注释的方法的建议
【发布时间】:2011-09-17 20:13:33
【问题描述】:

为了可视化,假设“_”实际上是一个空白。

考虑以下

/*!
____This_is_a_comment_about_a_function
____and_its_purpose
____and_arguments
____and_things_of_that_ilk
*/

我想做的是选择那段文本,按下一个按钮,然后哇! 改成这种形式了。

/*!____________________________________
____This_is_a_comment_about_a_function_
____and_its_purpose____________________
____and_arguments______________________
____and_things_of_that_ilk_____________
_____________________________________*/

我为什么要这个?第二种形式可以缓解我在查看代码时的眼睛疲劳。对我来说,做点什么就够了。

到目前为止我尝试了什么?主要是在谷歌上搜索宏示例。没有任何迹象表明可能是富有成效的方向。试图理解宏 ide 有点费力。一些在这里搜索 SO

我的问题是什么?

你能指出我的链接吗?给我一个提示?猜一下?关于我需要研究什么来弄清楚如何做到这一点。

感谢您的关注。

邪恶。

【问题讨论】:

  • 您能否在您选择的编辑器中打开文件之前对其进行“预处理”?您可以创建类似indent 的内容并通过它传递源代码,以便将尾随空格添加到 cmets ...
  • @delnan。是的...阅读第一行@pmg。是的……我能做到。我正在寻找更便宜的解决方案。
  • Hmmm ... 在vim 中,您可以为选定的行运行过滤器:切换到“可视模式”,选择行,点击:!filter 和whammo! -- 刚刚用一个更简单的过滤器对其进行了测试 :)
  • 您是否寻找过使用宏获取和替换选定文本的宏示例,以及与 strpad 等效的宏?我认为这三件事可以结合起来,在每一行上循环来构造最终的字符串来替换原来的选择。
  • @jared 谢谢。我会调查的。弹出它作为答案,我会投赞成票。

标签: c visual-studio-2010 code-formatting visual-studio-macros


【解决方案1】:

您是否寻找过使用宏获取和替换选定文本的宏示例,以及与string padding 等效的宏?我认为这三件事可以结合起来,在每一行上循环来构造最终的字符串来替换原来的选择。

伪代码:

selText = getSelectedText();
selTextSplit = selText.split("\n");
selTextPadded = "";
for (i = 0; i < selTextSplit.length; i++) {
    selTextPadded += selTextSplit[i].padRight(80, ' ') + "\n";
}
replaceSelectedText(selTextPadded);

【讨论】:

  • 是的。我以前没有见过字符串填充。这看起来确实是一种可行的方法。谢谢。
  • @EvilTeach - 您需要考虑的是如何确定焊盘数量。如果它是固定的(如 80 列),那么您还必须检测当前行是否超过该值,并弄清楚如何处理具有该属性的行。推到下一行?抵消?加一行?别管它(让它过去)?只是需要考虑的事情。
  • 是的,第一次通过它以获得最大长度,可能会将其四舍五入到我的标签大小的倍数,然后应用它。
  • @EvilTeach - 我能问一下你为什么要向右填充 cmets 吗?
  • 是的,如果我可以将您推荐给“我为什么要这个?”之后的顶部文本。
【解决方案2】:

这就是我想出来的。 感谢 Jared 为我指明了一个富有成效的方向。

Sub FormatEvil()

Try
    DTE.UndoContext.Open("Evil Style C Comment Padder")

    Dim txtSel As TextSelection = DTE.ActiveDocument.Selection

    Dim currText As String = txtSel.Text

    If currText.Trim.StartsWith("/*") AndAlso currText.Trim.EndsWith("*/") Then

        Dim splitText() As String = Split(currText, vbCrLf)

        ' Trim all of the lines down
        For z = 0 To UBound(splitText) - 1
            splitText(z) = Trim(splitText(z))
        Next

        ' How long should the block be?
        Dim longestLine As Integer = 0
        For z = 0 To UBound(splitText) - 1
            If splitText(z).Length > longestLine Then
                longestLine = splitText(z).Length
            End If
        Next

        longestLine += 4

        ' build the value to replace the selection with.
        Dim selTextPadded As String = "/*    "
        selTextPadded = selTextPadded.PadRight(longestLine + 2) + vbCrLf

        For z = 1 To UBound(splitText) - 2
            splitText(z) = splitText(z).PadRight(longestLine - 2)
            selTextPadded += "    " + splitText(z).ToString() + vbCrLf
        Next

        splitText(UBound(splitText) - 1) = splitText(UBound(splitText) - 1).PadRight(longestLine - 2)
        selTextPadded += "    " + splitText(UBound(splitText) - 1).ToString() + vbCrLf

        Dim tmp As String = "*/"
        selTextPadded += tmp.PadLeft(longestLine + 2) + vbCrLf

        txtSel.Delete() 'This is to help keep formatting correct when multiline
        txtSel.Insert(selTextPadded, vsInsertFlags.vsInsertFlagsContainNewText)
    Else
        ' This is not a c comment
    End If
Finally
    DTE.UndoContext.Close()
End Try
End Sub

【讨论】:

  • 我学到了一点。那里并不奇怪。 object.split,仅适用于 1 个字符,这导致了 CR 上的拆分,在文本中留下了流氓 LF。用 split(object) 替换它没有这个问题。
  • 欢迎提出改进代码的建议。我对vb没有经验,但愿意学习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 2010-11-13
  • 2011-05-13
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多