2013-11-15 113 views
1

我想開發一個AutoHotkey腳本來評論或取消註釋代碼塊,而不管我使用的編輯器(它甚至可以是記事本)。Autohotkey:代碼塊註釋和取消註釋熱鍵

我想到的一種實現方式是選擇一段代碼,然後按熱鍵將其註釋掉,或者選擇一個註釋代碼並按另一個熱鍵來取消它與IDE一樣的註釋。

代碼語言在這裏並不重要。每種語言都有一些用於多行註釋的語法,因此可以修改腳本以適用於任何語言。

我應該怎麼辦?

恐怕這個問題可能有重複。但是,我找不到任何。

+0

的基本過程是:1.獲取突出顯示的文本(很可能通過剪貼板)2。解析代碼並在必要時評論/取消註釋3.如果發生更改,請將代碼發回到源窗口。非常重要的部分是解析。最好的情況是您有相應語言的完整代碼分析器。否則,如果你想要複雜的東西,你必須實現一套廣泛的解析規則。例如,用於處理嵌套註釋,忽略字符串,檢測句法上不正確的註釋等。 – MCL

+0

MCL - 您應該將其作爲答案發布,而不是評論。我會+1你的答案。 – bgmCoder

回答

2

這是一個簡化的方法給你。

  1. 手動選擇文本
  2. 推熱鍵(在我的例子,它是CTRL + ALT + C
  3. 腳本將複製選定
  4. 則反而會加重您的評論簽名
  5. 然後它會將新字符串放在剪貼板上
  6. 然後它將粘貼回來,替換當前選擇

您可能需要在某處添加sleepclipwait

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

這應該給你一個啓動的地方。

就像MCL說的,如果你想使用不同的評論簽名,那麼你將不得不編寫一個複雜的函數來解析複製的選擇並確定它是什麼語言。你的一個想法是看你是否可以從你正在編輯的編輯器中獲取代碼文件的路徑 - 然後你可以通過文件擴展名來判斷正在使用哪種代碼。這在大多數情況下都會起作用 - 但只有當代碼文件包含單一類型的代碼時(例如C++或ahk,由於它包含幾種類型,html會更困難)。

+0

謝謝....我已經準備好使用不同的熱鍵來評論不同語言的代碼 – tumchaaditya

+0

您也可以使用彈出菜單進行選擇 - 以防您不想記住多個熱鍵。彈出式菜單會將焦點返回到原始應用程序。 – bgmCoder

+0

感謝您的想法.. – tumchaaditya

0

這是我的代碼取消註釋:

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

熱鍵爲Ctrl + Alt + d

+0

感謝很多人提供這個等待/睡眠代碼,我的是非常類似於@ bgm_coder給出的,但過去並不總是完美的工作,睡眠/等待解決了這個問題。 – user3065757

0

這是一個腳本註釋多行,並取消他們。用於評論的字符可以針對「commentChars」變量進行修改。
按Ctrl + Alt鍵+Ç評論選擇
按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 
}