Visual Studio의 Macro by object

리눅스 개발자들은 리눅스 자체가 최고의 C/C++ 개발 IDE라고 주장한다. 동감한다. 반면, 윈도우에서는 사실 Visual Studio, Borland 외에는 거의 사실상 C/C++ IDE가 없다고 볼 수 있다. 리눅스 개발자들이 오픈 소스의 위력과 커맨드 라인 기반으로 입맛대로 IDE를 고칠 수 있다고 자랑한다면, Visual Studio 사용자들은 Visual Studio Macro로 그렇게 할 수 있다라고 말하면 될 것이다. 그만큼 IDE를 자신이 원하는대로 기능을 추가할 수 있다. 물론 더 고차원적인 플러그 애드인까지 만들 수 있으나, 간단한 매크로 사용만으로도 꽤 편하게 작업을 할 수 있다. Visual Studio .NET 부터 획기적으로 바뀐 매크로에 대해서 간략하게 알아보자.


이건 Visual Studio 2005의 편집 에디터에서 뜨는 컨텍스트 메뉴이다.

여기에보면 "Go To Header File"이라는 메뉴가 있다. VS 2005부터 추가된 참으로 반가운 메뉴다. (그런데, "Go To cpp File"과 같은 메뉴가 없다!! 이런...) 예전 Visual C++ 6 부터 써왔던 Visual Assist에 .h 파일과 대응되는 .cpp 파일을 찾아주는 메뉴가 있었다. .h 파일이 존재하는 C/C++ 프로그래머로서는 상당히 편한 메뉴가 아닐 수 없었다. 대부분 파일 이동이 이 두 사이의 변환이 많기 때문이다.

Visual Assist가 VC6에서는 거의 필수품이었지만 요즘에는 더 이상 사용하지 않는다. 물론 최근 기능을 봐도 막강하고 깔고 싶었으나 VC6 시절 만큼은 필요없는 것 같다. 그러나 딱 하나 아쉬운 기능이 바로 .h <-> .cpp 파일 전환 기능이었다. 그러나 Visual Stucio Macro로 대충 이 기능을 만들 수가 있다. 여전히 VS 2005에서 .h 파일로 가는 기능은 있지만 그 반대가 없어서 여전히 이 매크로를 매일 쓰고 있다.




Visual Studio Macro는 한마디로 VS IDE를 하나로 객체로 접근하여 마음대로 프로그래밍을 할 수 있다. 지금 열려져 있는 창을 얻어와서 코드를 추가할 수 있고, 특정 명령을 매크로 상에서 수행할 수도 있다. 각종 configuration 및 옵션도 매크로에서 수정이 가능하다. 아주 간단한 예부터 시작하자. 내가 지금 편집하고 있는 파일의 절대 경로를 보고 싶은 경우 이렇게 하면 된다.
Sub ShowFullPath()
Dim docActive As Document
docActive = DTE.ActiveDocument
MsgBox(docActive.FullName)
End Sub
이렇게 DTE라는 Visual Studio를 자동화한 객체로부터 현재 활성화 중인 창을 얻고 그 창의 경로를 보여주는 것이다. 매우 직관적인 예라 금방 이해가 된다. 아쉽게도 VS Macro는 VB Script 형태로 작성해야하는 것 같다. 그 외 간단한 예제는 VS를 깔면 있는 Sample Macro에 다수 찾을 수 있다. 이걸 보고 공부하면 충분하다.

두 번째로, 탭을 \t로 할 것인지 아니면 공백으로 할 것인지를 바꾸는 매크로다. 일일히 옵션에가서 작업하려면 귀찮기 때문에 이런 매크로가 있으면 편할 것이다.
Sub TurnOnInsertTabs()
DTE.Properties("TextEditor", "C/C++").Item("InsertTabs").Value = True

Dim edit As EnvDTE.Properties = DTE.Properties("TextEditor", "C/C++")
Dim prop As EnvDTE.Property
Dim msg As String

prop = edit.Item("InsertTabs")
msg = ("PROP NAME: " & prop.Name & " VALUE: " & prop.Value) & vbCr
MsgBox(msg)
End Sub
역시 간단하다. DTE의 속성 중에 InsertTab이라는 녀석을 바꾸어서 바꾸면 된다.

마지막으로 .h 파일과 .cpp 파일을 번갈아가며 열어주는 매크로를 보자. 요건 내가 직접 삽질하며 만든 것이다. 이 녀석을 만든지도 3~4년은 된 것 같다; VS .NET 첨 나왔을 때 부터 만들어 쓰던 녀석;;
Sub OpenMatchingDocument()
'현재 열려 있는 문서를 얻자.
Dim docActive As Document
docActive = DTE.ActiveDocument

'오픈해야할 파일명을 구하자
Dim strMatching As String
Dim strMatching2 As String
strMatching = docActive.Name.ToLower()

If (strMatching.EndsWith(".h")) Then
strMatching = strMatching.Remove(strMatching.Length - 2, 2)
strMatching = strMatching & ".cpp"
strMatching2 = docActive.Name.ToLower()
strMatching2 = strMatching2.Remove(strMatching2.Length - 2, 2)
strMatching2 = strMatching2 & ".c"
ElseIf (strMatching.EndsWith(".cpp")) Then
strMatching = strMatching.Remove(strMatching.Length - 4, 4)
strMatching = strMatching & ".h"
ElseIf (strMatching.EndsWith(".c")) Then
strMatching = strMatching.Remove(strMatching.Length - 2, 2)
strMatching = strMatching & ".h"
Else
Exit Sub
End If

Dim itemFound As ProjectItem
Dim itemFound2 As ProjectItem
itemFound = DTE.Solution.FindProjectItem(strMatching)
itemFound2 = DTE.Solution.FindProjectItem(strMatching2)

If (itemFound Is Nothing) Then
If (itemFound2 Is Nothing) Then
DTE.ItemOperations.OpenFile(docActive.Path + strMatching)
Else
If (itemFound2.Document Is Nothing) Then
itemFound2.Open()
Else
itemFound2.Document.Activate()
End If
End If

Else
If (itemFound.Document Is Nothing) Then
itemFound.Open()
Else
itemFound.Document.Activate()
End If
End If
End Sub
현재 창의 파일명으로부터 적절한 파일명을 구한 다음 이걸 솔루션에서 찾아주는거다. 처음에는 그냥 파일을 오픈하는 명령을 주었는데, 그럴 경우 .h 파일과 .cpp 파일이 다른 폴더에 있는 경우는 찾지 못한다. 그래서 솔루션에 등록되어있는 것을 먼저 찾는다. 그런 뒤 없으면 강제로 파일 이름으로 열기를 시도한다.


그런데, VS 2005 매크로에서 아주 괴상한 현상이 벌어졌다. 매크로를 실행시킬 때 마다 '뽁'하는 소리와 함께 트레이에 풍선 도움말이 뜨지 않던가!! 이 매크로를 아주 자주 쓰는 나로서는 정말로 짜증나지 않을 수가 없었다. 한참 동안 웹을 찾다 헤마다 겨우 해결책을 찾았다.[2] HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0 레지스트리에 DontShowMacrosBalloon라는 DWORD 값을 하나 만들고 6보다 큰 값을 주면 이런 풍선 도움말을 막을 수 있었다 -_-; 아 황당~


VS Macro의 단점은 최초 실행시 로딩에 따른 시간이 걸린다는 점이다. 그렇지만 그 보다 훨씬 큰 이득을 VS Macro에서 얻을 수 있을 것이다.

내가 최근 몇 년간 회사에서 한 일 중에 VS와 같은 개발 IDE를 만드는 것이 있었는데, VS Macro를 보면서 많은 충격(?)과 영감을 얻었다. IDE가 단순한 껍데기가 아닌 완벽히 커스터마이징이 가능한 프로그래밍 객체로서 만들었기 때문에 나에게는 참으로 많은 것을 일깨워주었다.


레퍼런스:
[1] MSDN: Automation and Extensibility for Visual Studio
[2] http://blogs.msdn.com/craigskibo/archive/2004/06/29/169190.aspx

핑백

  • art.oriented : VC++ 6.0을 쓰지 말아야하는 이유 2008-03-06 04:55:04 #

    ... 매크로가 매우 강력해졌다. IDE 하나가 DTE라는 객체로 접근이 되고 모든 IDE 객체 및 요소가 접근이 되고 매크로화 할 수 있다. 대표적으로 예를 하나 적어보면 .cpp와 .h를 연결해주는 매크로도 쉽게 만들 수 있다. 6. 더 훌륭해진 컴파일러컴파일러만 놓고봐도 VS 2005 이상을 써야할 이유가 충분하다. MS compiler extensio ... more

  • Death : Rebirth ... : VC++ 6.0을 쓰지 말아야하는 이유 2008-03-06 09:41:46 #

    ... 매크로가 매우 강력해졌다. IDE 하나가 DTE라는 객체로 접근이 되고 모든 IDE 객체 및 요소가 접근이 되고 매크로화 할 수 있다. 대표적으로 예를 하나 적어보면 .cpp와 .h를 연결해주는 매크로도 쉽게 만들 수 있다. 6. 더 훌륭해진 컴파일러컴파일러만 놓고봐도 VS 2005 이상을 써야할 이유가 충분하다. MS compiler extensio ... more

  • jelly's 노트생각 : VC++ 6.0을 쓰지 말아야하는 이유 2008-07-24 13:44:51 #

    ... 부터 매크로가 매우 강력해졌다.IDE 하나가 DTE라는 객체로 접근이 되고 모든 IDE 객체 및 요소가 접근이 되고 매크로화 할 수 있다. 대표적으로 예를하나 적어보면 .cpp와 .h를 연결해주는 매크로도 쉽게 만들 수 있다. 6. 더 훌륭해진 컴파일러컴파일러만 놓고봐도 VS 2005 이상을 써야할 이유가 충분하다. MS compiler extensio ... more

  • Dreaming Of Platform Independent Developer : VC++ 6.0을 쓰지 말아야한다??? 2009-08-18 15:26:34 #

    ... .cpp와 .h를 연결해주는 매크로</a><a title="다음 링크를 새 창으로 엽니다. : '.cpp와 .h를 연결해주는 매크로'" style="PADDING-LEFT: 15px; BACKGROUND: url(/plugins/NewWindowLink/newwindow.gif) no-repeat 0px 50%; BORDER-TOP-STYLE: none; MARGIN-RIGHT: -0.5em; BORDER-RIGHT-STYLE: none; BORDER- ... more

덧글

댓글 입력 영역