블루앤라이브 님의 Notepad2 4.2.25 패치 중 Notepad2-mod에서 차용된 것이 있으니,
Notepad2 4.2.25 패치 준비#4: Mark Occurrences 기능 추가
링크된 블로그 글에도 있다시피, 다음과 같이 선택된 부분과 일치하는 단어를 강조해 주는 기능이다.
(Notepad2 4,2,25 original w/ Scintilla 2.25 + 'Mark Occurrences' original)
이 기능을 조금 바꾸어, 아래와 같이 대소문자에 무관하게 동작할 수 있도록 했다.
어셈블리어 소스 코드라든지, 같은 단어가 대소문자를 달리해 나타나는 보통의 글 등에서 쓸 수 있다. 물론 메뉴에서 적용 여부를 선택 가능하며, 기본값은 대소문자 구분이다.
참고로, 대부분의 언어에서 식별자는 대소문자를 구분하기 때문에, 이를 빼 버리는 건 미친 짓이다.
블루앤라이브 님과 같은 순서로 설명하며, 기존 패치와 달라진 줄을 강조했다.
1. resource.h
* 적당히 수정: 사용되지 않는 번호.
2. Notepad2.rc
3. Edit.h
4. Edit.c
5. Notepad2.c
void MsgInitMenu(HWND hwnd,WPARAM wParam,LPARAM lParam) 내의 다음 두 줄 사이에,
LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) 내의 case IDM_VIEW_MARGIN: ~ break;과 case IDM_VIEW_SHOWWHITESPACE: ~ break; 사이에 다음과 같은 내용을 추가한다.
LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) 내에서 다음 내용을 찾아서,
void LoadSettings() 내에서 다음 내용을 찾아서,
마지막으로 void SaveSettings() 내의 다음 두 줄 사이에,
시험적으로 구상한 패치 소스 패치(!)였지만 놀랍게도 성공적으로 작동했다.(?)
나도 이제 소스 패치 변태야 엉엉 ㅠㅠ 하라는 과제는 안 하고
앞으로 몇 가지 패치를 더 만들어 낼지도 모르겠습니다. :)
다음 글. 한글은 전영역에서 찾는다든지 하는 옵션이 추가되어 있는데 정신 건강에 좋지는 않습니다.
Notepad2 4.2.25 패치 준비#4: Mark Occurrences 기능 추가
링크된 블로그 글에도 있다시피, 다음과 같이 선택된 부분과 일치하는 단어를 강조해 주는 기능이다.
(Notepad2 4,2,25 original w/ Scintilla 2.25 + 'Mark Occurrences' original)
이 기능을 조금 바꾸어, 아래와 같이 대소문자에 무관하게 동작할 수 있도록 했다.
어셈블리어 소스 코드라든지, 같은 단어가 대소문자를 달리해 나타나는 보통의 글 등에서 쓸 수 있다. 물론 메뉴에서 적용 여부를 선택 가능하며, 기본값은 대소문자 구분이다.
참고로, 대부분의 언어에서 식별자는 대소문자를 구분하기 때문에, 이를 빼 버리는 건 미친 짓이다.
블루앤라이브 님과 같은 순서로 설명하며, 기존 패치와 달라진 줄을 강조했다.
1. resource.h
적당한 위치에 아래와 같은 내용을 추가한다. 40445~40449가 사용 중이면 적당히 수정한다.
#define IDM_VIEW_MARKOCCURRENCES_CASE 40445 #define IDM_VIEW_MARKOCCURRENCES_RED 40446 #define IDM_VIEW_MARKOCCURRENCES_GREEN 40447 #define IDM_VIEW_MARKOCCURRENCES_BLUE 40448 #define IDM_VIEW_MARKOCCURRENCES_OFF 40449* 적당한 위치: 번호 순으로 정렬되어 있으므로 번호 순서에 맞게 넣어야 위험하지 않다.
* 적당히 수정: 사용되지 않는 번호.
2. Notepad2.rc
다음과 같은 내용을 찾아
MENUITEM "Selection &Margin\tCtrl+Shift+M", IDM_VIEW_MARGIN바로 아래에 다음 내용을 추가한다.
POPUP "Mar&k Occurrences" BEGIN MENUITEM "Matc&h case", IDM_VIEW_MARKOCCURRENCES_CASE MENUITEM SEPARATOR MENUITEM "&Red", IDM_VIEW_MARKOCCURRENCES_RED MENUITEM "&Green", IDM_VIEW_MARKOCCURRENCES_GREEN MENUITEM "&Blue", IDM_VIEW_MARKOCCURRENCES_BLUE MENUITEM "&Off", IDM_VIEW_MARKOCCURRENCES_OFF END
3. Edit.h
다음과 같은 내용을 적당한 위치에 추가한다.
void EditMarkAll(HWND,int,BOOL);
4. Edit.c
다음과 같은 내용을 적당한 위치에 추가한다.
//============================================================================= // // EditMarkAll() // Mark all occurrences of the text currently selected (by Aleksandar Lekov / slightly modified by Un-i-que) // void EditMarkAll(HWND hwnd, int iMarkOccurrences, BOOL bMarkOccurrencesCaseSensitive) { struct TextToFind ttf; int iPos; char *pszText; int iTextLen; int iSelStart; int iSelEnd; int iSelCount; int iMatchesCount; // feature is off if (!iMarkOccurrences) { return; } iTextLen = (int)SendMessage(hwnd,SCI_GETLENGTH,0,0); // get current selection iSelStart = (int)SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0); iSelEnd = (int)SendMessage(hwnd,SCI_GETSELECTIONEND,0,0); iSelCount = iSelEnd - iSelStart; // clear existing indicator SendMessage(hwnd, SCI_SETINDICATORCURRENT, 1, 0); SendMessage(hwnd, SCI_INDICATORCLEARRANGE, 0, iTextLen); // if nothing selected or multiple lines are selected exit if (iSelCount == 0 || (int)SendMessage(hwnd, SCI_LINEFROMPOSITION, iSelStart, 0) != (int)SendMessage(hwnd, SCI_LINEFROMPOSITION, iSelEnd, 0)) { return; } pszText = LocalAlloc(LPTR,iSelCount + 1); (int)SendMessage(hwnd,SCI_GETSELTEXT,0,(LPARAM)pszText); ZeroMemory(&ttf,sizeof(ttf)); ttf.chrg.cpMin = 0; ttf.chrg.cpMax = iTextLen; ttf.lpstrText = pszText; // set style, green should be greener not to confuse with bookmarks' style SendMessage(hwnd, SCI_INDICSETALPHA, 1, iMarkOccurrences == 2 ? 100 : 30); SendMessage(hwnd, SCI_INDICSETFORE, 1, 0xff << ((iMarkOccurrences - 1) << 3)); SendMessage(hwnd, SCI_INDICSETSTYLE, 1, INDIC_ROUNDBOX); iMatchesCount = 0; while ((iPos = (int)SendMessage(hwnd, SCI_FINDTEXT, (bMarkOccurrencesCaseSensitive ? (SCFIND_MATCHCASE | SCFIND_WHOLEWORD) : SCFIND_WHOLEWORD), (LPARAM)&ttf)) != -1 && ++iMatchesCount < 1000) { // mark this match SendMessage(hwnd, SCI_INDICATORFILLRANGE, iPos, iSelCount); ttf.chrg.cpMin = ttf.chrgText.cpMin + iSelCount; if (ttf.chrg.cpMin == ttf.chrg.cpMax) break; } LocalFree(pszText); return; }* Scintilla에 넘기는 인자가 bMarkOccurrencesCaseSensitive에 따라 바뀐다.
5. Notepad2.c
소스의 앞부분, 다른 전역변수들과 함께 다음 두 변수 선언을 추가한다.
int iMarkOccurrences; BOOL bMarkOccurrencesCaseSensitive;
CheckCmd(hmenu,IDM_VIEW_MARGIN,bShowSelectionMargin); CheckCmd(hmenu,IDM_VIEW_SHOWWHITESPACE,bViewWhiteSpace);다음과 같은 내용을 추가한다.
CheckCmd(hmenu,IDM_VIEW_MARKOCCURRENCES_CASE,bMarkOccurrencesCaseSensitive); switch (iMarkOccurrences) { case 0: i = IDM_VIEW_MARKOCCURRENCES_OFF;break; case 1: i = IDM_VIEW_MARKOCCURRENCES_RED;break; case 2: i = IDM_VIEW_MARKOCCURRENCES_GREEN;break; case 3: i = IDM_VIEW_MARKOCCURRENCES_BLUE;break; } CheckMenuRadioItem(hmenu,IDM_VIEW_MARKOCCURRENCES_RED,IDM_VIEW_MARKOCCURRENCES_OFF,i,MF_BYCOMMAND);
case IDM_VIEW_MARKOCCURRENCES_CASE: bMarkOccurrencesCaseSensitive = (bMarkOccurrencesCaseSensitive) ? FALSE : TRUE; // clear all marks and remark with changed case sensitivity SendMessage(hwndEdit, SCI_SETINDICATORCURRENT, 1, 0); SendMessage(hwndEdit, SCI_INDICATORCLEARRANGE, 0, (int)SendMessage(hwndEdit,SCI_GETLENGTH,0,0)); EditMarkAll(hwndEdit, iMarkOccurrences, bMarkOccurrencesCaseSensitive); break; case IDM_VIEW_MARKOCCURRENCES_OFF: iMarkOccurrences = 0; // clear all marks SendMessage(hwndEdit, SCI_SETINDICATORCURRENT, 1, 0); SendMessage(hwndEdit, SCI_INDICATORCLEARRANGE, 0, (int)SendMessage(hwndEdit,SCI_GETLENGTH,0,0)); break; case IDM_VIEW_MARKOCCURRENCES_RED: iMarkOccurrences = 1; EditMarkAll(hwndEdit, iMarkOccurrences, bMarkOccurrencesCaseSensitive); break; case IDM_VIEW_MARKOCCURRENCES_GREEN: iMarkOccurrences = 2; EditMarkAll(hwndEdit, iMarkOccurrences, bMarkOccurrencesCaseSensitive); break; case IDM_VIEW_MARKOCCURRENCES_BLUE: iMarkOccurrences = 3; EditMarkAll(hwndEdit, iMarkOccurrences, bMarkOccurrencesCaseSensitive); break;
// Brace Match if (bMatchBraces)이 바로 위에 다음과 같은 내용을 추가한다.
// mark occurrences of text currently selected EditMarkAll(hwndEdit, iMarkOccurrences, bMarkOccurrencesCaseSensitive);
bViewWhiteSpace = IniSectionGetInt(pIniSection,L"ViewWhiteSpace",0);이 바로 위에 다음과 같은 내용을 추가한다.
bMarkOccurrencesCaseSensitive = IniSectionGetInt(pIniSection,L"MarkOccurrencesCaseSensitively",1); if (bMarkOccurrencesCaseSensitive) bMarkOccurrencesCaseSensitive = 1; iMarkOccurrences = IniSectionGetInt(pIniSection,L"MarkOccurrences",3);
IniSectionSetInt(pIniSection,L"ShowLineNumbers",bShowLineNumbers); IniSectionSetInt(pIniSection,L"ViewWhiteSpace",bViewWhiteSpace);다음 두 줄을 추가한다.
IniSectionSetInt(pIniSection,L"MarkOccurrencesCaseSensitively",bMarkOccurrencesCaseSensitive); IniSectionSetInt(pIniSection,L"MarkOccurrences",iMarkOccurrences);
시험적으로 구상한 패치 소스 패치(!)였지만 놀랍게도 성공적으로 작동했다.(?)
앞으로 몇 가지 패치를 더 만들어 낼지도 모르겠습니다. :)
'Sablog Models > 자작자작' 카테고리의 다른 글
Notepad2 패치에 발을 담그다 - (2) Mark Occurrences, anywhere for non-ASCII (0) | 2011.06.12 |
---|---|
환타 오목 게임 재구성: 최종본. (2) | 2009.11.12 |
환타 오목 게임 재구성. (5) (0) | 2009.11.12 |
C 언어로 .cdic 파일을 xml로 만드는 프로그램 만드는 중. (0) | 2009.09.21 |
환타 오목 게임 재구성. (4) (0) | 2009.09.17 |