Autohotkey:代码块注释和取消注释热键

时间:2013-11-15 19:55:20

标签: autohotkey

我正在尝试开发一个Autohotkey脚本来评论或取消注释代码块,而不管我使用的编辑器(它甚至可以是记事本)。

我想到的实现方式是我选择一些代码并按热键将其注释掉,或者我选择一个注释代码并按另一个热键以取消注释它与IDE的方式。

代码的语言在这里无关紧要。每种语言都有一些多行注释的语法,因此可以修改脚本以适用于任何语言。

我应该怎么做?

恐怕这些问题可能有重复。但是,我找不到任何。

3 个答案:

答案 0 :(得分:2)

这是一个简化的方法。

  1. 手动选择文字
  2. 按热键(在我的例子中,它是 ctrl + alt + c
  3. 脚本将复制选择
  4. 然后它会添加您的评论签名
  5. 然后它会将新字符串放在剪贴板上
  6. 然后它将粘贴,替换当前选择
  7. 您可能需要在某处添加sleepclipwait

    !^c::
        send ^c
        thisvar := clipboard
        thisvar := "<!--" . thisvar . "-->"
        clipboard := thisvar
        send ^v
    return
    

    这应该可以让你在某个地方开始。

    就像MCL所说,如果你想使用不同的评论签名,那么你将不得不编写一个精心设计的函数来解析复制的选择并确定它是什么语言。您的一个想法是查看是否可以从您正在使用的编辑器中获取代码文件的路径 - 然后您可以通过文件扩展名判断正在使用的代码类型。这大部分时间都可以工作 - 但是只有当代码文件包含一种代码时(例如C ++或ahk - html会因为包含多种类型而更加困难)。

答案 1 :(得分:0)

这是我取消注释的代码:

!^d::
    send ^c
    Sleep, 40
    StringReplace, clipboard, clipboard, -->, , All
    StringReplace, clipboard, clipboard, <!--, , All
    Sleep, 40
    send ^v
return

热键是ctrl + alt + d

答案 2 :(得分:0)

这是一个评论多行并取消注释的脚本。用于评论的字符可以针对&#34; commentChars&#34;进行修改。变量。
Ctrl + Alt + c 评论选择
Ctrl + Alt + x 取消注释选择

SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
commentChars := "//"
!^c::
    send ^c
    delimiter := "`n"
    thisvar := ""
    size := parsedTextContainerSize(clipboard,delimiter)
    Loop, parse, clipboard, `n, `r
    {
        ;MsgBox, index = %A_Index% . size = %size%
        if (A_Index < size)
        {
            thisvar := thisvar . commentChars . A_LoopField . "`n"
        }
        else
        {
            ;MsgBox, finally = %A_Index%
            thisvar := thisvar . commentChars . A_LoopField
        }
    }

    clipboard := thisvar
    send ^v
return

!^x::
    send ^c
    delimiter := "`n"
    thisvar := ""
    size := parsedTextContainerSize(clipboard,delimiter)
    Loop, parse, clipboard, `n, `r
    {
        line := ""
        firtTwoChars := ""
        pos := -1
        StringGetPos, pos, A_LoopField, %commentChars%
        if (pos = 0) 
        {
            ;StringReplace, newString, originalString, –, %A_Space%, 1
            StringReplace, line, A_LoopField, %commentChars%, ,
            ;MsgBox, line = %line%
        }
        else
        {
            line := A_LoopField
        }

        ;MsgBox, index = %A_Index% . size = %size%
        if (A_Index < size)
        {
            thisvar := thisvar . line . "`n"
        }
        else
        {
            ;MsgBox, finally = %A_Index%
            thisvar := thisvar . line
        }
    }

    clipboard := thisvar
    send ^v
return


parsedTextContainerSize(text,delimiter)
{
  count = 0
  pos = 0
  Loop,
  {
    StringGetPos, pos, text, %delimiter%,, %pos%    
    If (Errorlevel<>0)
      break
    count += 1
    pos +=1
  }    
  return count + 1
}