ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Source insight with indentation tool(Astyle)
    카테고리 없음 2008. 5. 16. 20:28



    회사에서 사용되는 코드는 참 더러운(?) 경우가 종종 있다. (아주아주 순화된 표현임!)

    tab과 space를 혼용해서 indent를 맞추는 경우는 다반사이고, 일관된 코딩 style을 적용한게 아니라서

    {} 기호가 한 눈에 들어오지 않아서 헷갈리는 경우는 에삿일이다.

    하지만 그 보다 더 미치게 만드는 건 indent 자체를 맞추지 않아서

    이 코드가 if문에 걸리는 건지 for문에 걸리는 건지 헷갈리게 만드는 경우다.

    (이런 코드를 보면 으악~하고 소리를 지르고 싶을 정도다.)

    그래서 생각해낸게 indent를 맞춰주는 툴을 쓰는 것!


    일단 찾아본 툴은 많지만 (indent, astyle, great code 등등)

    이것저것 설정하다보니 astyle쪽에 내가 원하는 옵션에 가장 부합하는 것같다.


    아래는 내가 사용하는 astyle 옵션

    --indent=spaces=4
    --indent-classes
    --indent-namespaces
    --indent-preprocessor
    --one-line=keep-blocks
    --one-line=keep-statements
    --brackets=break
    --min-conditional-indent=0
    --pad=oper
    --unpad=paren

    (tap 사이즈를 어떻게 정해야할지 고민이 있었지만, 결국 가장 많이 사용하는 4로 설정)


    이렇게 만들어놓고 나서 우리팀 사람들이 사용하기 편하게 만들어야겠다는 생각이 불끈불끈.

    그래서 NSIS로 간편히 설치할 수 있게 만들고 (option은 내가 설정한 옵션으로.ㅎㅎ)

    Source insight에서도 사용할 수 있게 utisl.em에 자동으로 macro를 추가하도록 설정하였다.

    (단지 그 뒤에 키설정을 수동으로 해주어야하는게 난관이라면 난관이다.)


    아래는 NSIS 파일 내용


    ; Script generated by the HM NIS Edit Script Wizard.

    ; HM NIS Edit Wizard helper defines
    !define PRODUCT_NAME "소스코드정리하기"
    !define PRODUCT_VERSION "1.0"
    !define PRODUCT_PUBLISHER "장경돈"
    !define PRODUCT_WEB_SITE "code4rain.tistory.com"
    !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
    !define PRODUCT_UNINST_ROOT_KEY "HKLM"
    !define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"

    ; MUI 1.67 compatible ------
    !include "MUI.nsh"

    ; MUI Settings
    !define MUI_ABORTWARNING
    !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
    !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

    ; Welcome page
    !insertmacro MUI_PAGE_WELCOME

    ; Start menu page
    var ICONS_GROUP
    !define MUI_STARTMENUPAGE_NODISABLE
    !define MUI_STARTMENUPAGE_DEFAULTFOLDER "소스코드정리하기"
    !define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
    !define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
    !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}"
    !insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
    ; Instfiles page
    !insertmacro MUI_PAGE_INSTFILES
    ; Finish page
    !insertmacro MUI_PAGE_FINISH

    ; Uninstaller pages
    !insertmacro MUI_UNPAGE_INSTFILES

    ; Language files
    !insertmacro MUI_LANGUAGE "Korean"

    ; MUI end ------

    Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
    OutFile "Setup.exe"
    InstallDir "c:\indent"
    InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
    ShowInstDetails show
    ShowUnInstDetails show

    Section "MainSection" SEC01
      SetOutPath "$INSTDIR"
      SetOverwrite ifnewer
      File "call_Artistic_Style.bat"
      SetOutPath "$INSTDIR\indenters"
      File "indenters\astyle.html"
      File "indenters\astyle.exe"
      File "indenters\.astylerc"
    ; add Macro
    ClearErrors
    FileOpen $0 "$DOCUMENTS\Source Insight\Projects\Base\utils.em" a
    IfErrors done
    FileSeek $0 0 END
    FileWrite $0 "macro indet_tab() $\n \
    { $\n \
        hbuf = GetCurrentBuf() $\n \
        sFile = GetBufName (hbuf); $\n \
        { $\n \
            exitcode = RunCmdLine($\"cmd /c c:\\indent\\call_Artistic_Style.bat \$\"@sFile@\$\"; cmd /c exit$\",$\".$\",false) $\n \
        } $\n \
    } "
    FileClose $0
    done:

    ; Shortcuts
      !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
      CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
      !insertmacro MUI_STARTMENU_WRITE_END
    SectionEnd

    Section -AdditionalIcons
      SetOutPath $INSTDIR
      !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
      CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk" "$INSTDIR\uninst.exe"
      !insertmacro MUI_STARTMENU_WRITE_END
    SectionEnd

    Section -Post
      WriteUninstaller "$INSTDIR\uninst.exe"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\UniversalIndentGUI.exe"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
      WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
    SectionEnd

    Function un.onUninstSuccess
      HideWindow
      MessageBox MB_ICONINFORMATION|MB_OK "$(^Name)는(은) 완전히 제거되었습니다."
    FunctionEnd

    Function un.onInit
      MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(^Name)을(를) 제거하시겠습니까?" IDYES +2
      Abort
    FunctionEnd

    Section Uninstall
      !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
      Delete "$INSTDIR\indenters\.astylerc"
      Delete "$INSTDIR\indenters\astyle.exe"
      Delete "$INSTDIR\indenters\astyle.html"
      Delete "$INSTDIR\call_Artistic_Style.bat"

      Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk"
      Delete "$DESKTOP\source insight-indent addon.lnk"
      Delete "$SMPROGRAMS\$ICONS_GROUP\source insight-indent addon.lnk"

      RMDir "$SMPROGRAMS\$ICONS_GROUP"
      RMDir "$INSTDIR\indenters"
      RMDir "$INSTDIR"

      DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
      SetAutoClose true
    SectionEnd


    아래파일은 위 NSIS를 컴파일해서 나온 실행파일이다.




    해당 파일을 실행하면 C:\indent에 파일을 복사하고 source insight의 base폴더에 위치한 utils.em 파일에 macro를 복사한다.

    source insight에서 해당 macro를 단축키로 지정하면 현재 보고 있는 파일의 indent를 한큐에(!) 수정할 수 있다.


    PS. 동기녀석 PC에서 테스트해본 결과 Key Assign에서 약간 버벅거리는 것을 빼고는 (macro가 제대로 안타나는 경우가 있음 - 이 때는 utils.em을 강제로 project에 add하고 다시 sync를 맞추면 됨, 더쉬운 방법이 있을 터인데..) 문제 없이 동작하고 있다.ㅎㅎ

Designed by Tistory.