📄 cmacro.cpp
字号:
cmemWork2.Replace_j( "\\", "\\\\" );
cmemWork2.Replace_j( "\'", "\\\'" );
wsprintf( szLine, "S_%s(\'%s\', \'%s\', %d);\t// %s\r\n", szFuncName, cmemWork.GetPtr(), cmemWork2.GetPtr(), m_pParamTop->m_pNext->m_pNext->m_pData ? atoi(m_pParamTop->m_pNext->m_pNext->m_pData) : 0, szFuncNameJapanese );
_lwrite( hFile, szLine, strlen( szLine ) );
}
break;
case F_GREP:
pText = m_pParamTop->m_pData;
nTextLen = strlen(pText);
cmemWork.SetData( pText, nTextLen );
cmemWork.Replace_j( "\\", "\\\\" );
cmemWork.Replace_j( "\'", "\\\'" );
{
CMemory cmemWork2(m_pParamTop->m_pNext->m_pData, strlen(m_pParamTop->m_pNext->m_pData));
cmemWork2.Replace_j( "\\", "\\\\" );
cmemWork2.Replace_j( "\'", "\\\'" );
CMemory cmemWork3(m_pParamTop->m_pNext->m_pNext->m_pData, strlen(m_pParamTop->m_pNext->m_pNext->m_pData));
cmemWork3.Replace_j( "\\", "\\\\" );
cmemWork3.Replace_j( "\'", "\\\'" );
wsprintf( szLine, "S_%s(\'%s\', \'%s\', \'%s\', %d);\t// %s\r\n", szFuncName, cmemWork.GetPtr(), cmemWork2.GetPtr(), cmemWork3.GetPtr(), m_pParamTop->m_pNext->m_pNext->m_pNext->m_pData ? atoi(m_pParamTop->m_pNext->m_pNext->m_pNext->m_pData) : 0, szFuncNameJapanese );
_lwrite( hFile, szLine, strlen( szLine ) );
}
break;
default:
if( 0 == m_pParamTop ){
wsprintf( szLine, "S_%s();\t// %s\r\n", szFuncName, szFuncNameJapanese );
}else{
wsprintf( szLine, "S_%s(%d);\t// %s\r\n", szFuncName, m_pParamTop->m_pData ? atoi(m_pParamTop->m_pData) : 0, szFuncNameJapanese );
}
_lwrite( hFile, szLine, strlen( szLine ) );
break;
}
return;
#if 0
}
}
#endif
}
wsprintf( szLine, "CMacro::GetFuncInfoByID()に、バグがあるのでエラーが出ましたぁぁぁぁぁぁあああ\r\n" );
_lwrite( hFile, szLine, strlen( szLine ) );
}
/*! MacroコマンドをCEditView::HandleCommandに引き渡す。
引数がないマクロを除き,マクロとHandleCommandでの対応をここで定義する必要がある.
@param pcEditView [in] 操作対象EditView
@param Index [in] 機能 ID
@param Argument [in] 引数
@param ArgSize [in] 引数の数
*/
void CMacro::HandleCommand( CEditView* pcEditView, const int Index, const char* Argument[], const int ArgSize )
{
const char EXEC_ERROR_TITLE[] = "Macro実行エラー";
switch (Index)
{
case F_CHAR: // 文字入力。数値は文字コード
case F_IME_CHAR: // 日本語入力
case F_CHGMOD_EOL: // 入力改行コード指定。enumEOLTypeの数値を指定。2003.06.23 Moca
// Jun. 16, 2002 genta
if( Argument[0] == NULL ){
::MYMESSAGEBOX( NULL, MB_OK | MB_ICONSTOP | MB_TOPMOST, EXEC_ERROR_TITLE,
_T( "挿入すべき文字コードが指定されていません." ));
break;
}
/* NO BREAK */
case F_GOLINETOP: // 行頭に移動。数値は、0x0(デフォルト)、0x1(空白を無視して先頭に移動)、0x2(未定義)、0x4(選択して移動)、0x8(改行単位で先頭に移動:未実装)
// 一つ目の引数が数値。
pcEditView->HandleCommand( Index, FALSE, (Argument[0] != NULL ? atoi(Argument[0]) : 0 ), 0, 0, 0 );
break;
case F_INSTEXT: // テキスト挿入
case F_ADDTAIL: // この操作はキーボード操作では存在しないので保存することができない?
case F_SET_QUOTESTRING: // Jan. 29, 2005 genta 追加 テキスト引数1つを取るマクロはここに統合していこう.
// 一つ目の引数が文字列。
// ただし2つ目の引数は文字数。
if( Argument[0] == NULL ){
::MYMESSAGEBOX( NULL, MB_OK | MB_ICONSTOP | MB_TOPMOST, EXEC_ERROR_TITLE,
_T( "引数(文字列)が指定されていません." ));
break;
}
{
int len = strlen(Argument[0]);
pcEditView->HandleCommand( Index, FALSE, (LPARAM)Argument[0], len, 0, 0 ); // 標準
}
break;
/* 一つ目、二つ目とも引数は数値 */
case F_JUMP: // 指定行へジャンプ(ただしPL/SQLコンパイルエラー行へのジャンプは未対応)
// Argument[0]へジャンプ。オプションはArgument[1]に。
// ******** 以下「行番号の単位」 ********
// 0x00 折り返し単位の行番号
// 0x01 改行単位の行番号
// **************************************
// 0x02 PL/SQLコンパイルエラー行を処理する
// 未定義 テキストの□行目をブロックの1行目とする
// 未定義 検出されたPL/SQLパッケージのブロックから選択
if( Argument[0] == NULL ){
::MYMESSAGEBOX( NULL, MB_OK | MB_ICONSTOP | MB_TOPMOST, EXEC_ERROR_TITLE,
_T( "ジャンプ先行番号が指定されていません." ));
break;
}
{
pcEditView->m_pcEditDoc->m_cDlgJump.m_nLineNum = atoi(Argument[0]); //ジャンプ先
LPARAM lFlag = Argument[1] != NULL ? atoi(Argument[1]) : 1; // デフォルト1
pcEditView->m_pShareData->m_bLineNumIsCRLF = lFlag & 0x01 ? 1 : 0;
pcEditView->m_pcEditDoc->m_cDlgJump.m_bPLSQL = lFlag & 0x02 ? 1 : 0;
pcEditView->HandleCommand( Index, FALSE, 0, 0, 0, 0 ); // 標準
}
break;
/* 一つ目の引数は文字列、二つ目の引数は数値 */
case F_BOOKMARK_PATTERN: //2002.02.08 hor
if( Argument[0] == NULL ){
::MYMESSAGEBOX( NULL, MB_OK | MB_ICONSTOP | MB_TOPMOST, EXEC_ERROR_TITLE,
_T( "マーク行のパターンが指定されていません." ));
break;
}
/* NO BREAK */
case F_SEARCH_NEXT:
case F_SEARCH_PREV:
// Argument[0]を検索。オプションはArgument[1]に。
// Argument[1]:
// 0x01 単語単位で探す
// 0x02 英大文字と小文字を区別する
// 0x04 正規表現
// 0x08 見つからないときにメッセージを表示
// 0x10 検索ダイアログを自動的に閉じる
// 0x20 先頭(末尾)から再検索する
// 各値をShareDataに設定してコマンドを発行し、ShareDataの値を元に戻す。
{
if( 0 < lstrlen( Argument[0] ) ){
/* 正規表現 */
if( pcEditView->m_pShareData->m_Common.m_bRegularExp && !CheckRegexpSyntax( Argument[0], NULL, true ) ){
break;
}
/* 検索文字列 */
CShareData::getInstance()->AddToSearchKeyArr( (const char*)Argument[0] );
}
// 設定値バックアップ
// マクロパラメータ→設定値変換
LPARAM lFlag = Argument[1] != NULL ? atoi(Argument[1]) : 0;
pcEditView->m_pShareData->m_Common.m_bWordOnly = lFlag & 0x01 ? 1 : 0;
pcEditView->m_pShareData->m_Common.m_bLoHiCase = lFlag & 0x02 ? 1 : 0;
pcEditView->m_pShareData->m_Common.m_bRegularExp = lFlag & 0x04 ? 1 : 0;
pcEditView->m_pShareData->m_Common.m_bNOTIFYNOTFOUND = lFlag & 0x08 ? 1 : 0;
pcEditView->m_pShareData->m_Common.m_bAutoCloseDlgFind = lFlag & 0x10 ? 1 : 0;
pcEditView->m_pShareData->m_Common.m_bSearchAll = lFlag & 0x20 ? 1 : 0;
// コマンド発行
// pcEditView->HandleCommand( Index, FALSE, (LPARAM)Argument[0], 0, 0, 0);
pcEditView->HandleCommand( Index, FALSE, 0, 0, 0, 0);
}
break;
case F_EXECCOMMAND:
// Argument[0]を実行。オプションはArgument[1]に。
// Argument[1]:
// 次の数値の和。
// 0x01 標準出力を得る
if( Argument[0] == NULL ){
::MYMESSAGEBOX( NULL, MB_OK | MB_ICONSTOP | MB_TOPMOST, EXEC_ERROR_TITLE,
_T( "外部コマンドが指定されていません." ));
break;
}
{
LPARAM lFlag = Argument[1] != NULL ? atoi(Argument[1]) : 0;
pcEditView->m_pShareData->m_bGetStdout = lFlag & 0x01 ? 1 : 0;
// pcEditView->HandleCommand( Index, FALSE, (LPARAM)Argument[0], (LPARAM)atoi(Argument[1]), 0, 0);
pcEditView->HandleCommand( Index, FALSE, (LPARAM)Argument[0], 0, 0, 0);
}
break;
/* はじめの2つの引数は文字列。3つ目は数値 */
case F_REPLACE:
case F_REPLACE_ALL:
// Argument[0]を、Argument[1]に置換。オプションはArgument[2]に(入れる予定)
// Argument[2]:
// 次の数値の和。
// 0x001 単語単位で探す
// 0x002 英大文字と小文字を区別する
// 0x004 正規表現
// 0x008 見つからないときにメッセージを表示
// 0x010 検索ダイアログを自動的に閉じる
// 0x020 先頭(末尾)から再検索する
// 0x040 クリップボードから貼り付ける
// ******** 以下「置換範囲」 ********
// 0x000 ファイル全体
// 0x080 選択範囲
// **********************************
// ******** 以下「置換対象」 ********
// 0x000 見つかった文字列と置換
// 0x100 見つかった文字列の前に挿入
// 0x200 見つかった文字列の後に追加
// **********************************
// 各値をShareDataに設定してコマンドを発行し、ShareDataの値を元に戻す。
if( Argument[0] == NULL ){
::MYMESSAGEBOX( NULL, MB_OK | MB_ICONSTOP | MB_TOPMOST, EXEC_ERROR_TITLE,
_T( "置換元パターンが指定されていません." ));
break;
}
if( Argument[1] == NULL ){
::MYMESSAGEBOX( NULL, MB_OK | MB_ICONSTOP | MB_TOPMOST, EXEC_ERROR_TITLE,
_T( "置換先パターンが指定されていません." ));
break;
}
{
// if( 0 < lstrlen( Argument[0] ) ){
/* 正規表現 */
if( pcEditView->m_pShareData->m_Common.m_bRegularExp && !CheckRegexpSyntax( Argument[0], NULL, true ) ){
break;
}
/* 検索文字列 */
CShareData::getInstance()->AddToSearchKeyArr( (const char*)Argument[0] );
// }
// if( 0 < lstrlen( Argument[1] ) ){
/* 検索文字列 */
CShareData::getInstance()->AddToReplaceKeyArr( (const char*)Argument[1] );
// }
LPARAM lFlag = Argument[2] != NULL ? atoi(Argument[2]) : 0;
pcEditView->m_pShareData->m_Common.m_bWordOnly = lFlag & 0x01 ? 1 : 0;
pcEditView->m_pShareData->m_Common.m_bLoHiCase = lFlag & 0x02 ? 1 : 0;
pcEditView->m_pShareData->m_Common.m_bRegularExp = lFlag & 0x04 ? 1 : 0;
pcEditView->m_pShareData->m_Common.m_bNOTIFYNOTFOUND = lFlag & 0x08 ? 1 : 0;
pcEditView->m_pShareData->m_Common.m_bAutoCloseDlgFind = lFlag & 0x10 ? 1 : 0;
pcEditView->m_pShareData->m_Common.m_bSearchAll = lFlag & 0x20 ? 1 : 0;
pcEditView->m_pcEditDoc->m_cDlgReplace.m_nPaste = lFlag & 0x40 ? 1 : 0; // CShareDataに入れなくていいの?
// pcEditView->m_pShareData->m_Common.m_bSelectedArea = 0; // lFlag & 0x80 ? 1 : 0;
if (Index == F_REPLACE) {
// 置換する時は選べない
pcEditView->m_pShareData->m_Common.m_bSelectedArea = 0;
}
else if (Index == F_REPLACE_ALL) {
// 全置換の時は選べる?
pcEditView->m_pShareData->m_Common.m_bSelectedArea = lFlag & 0x80 ? 1 : 0;
}
pcEditView->m_pcEditDoc->m_cDlgReplace.m_nReplaceTarget = lFlag >> 8; // 8bitシフト(0x100で割り算)
// コマンド発行
pcEditView->HandleCommand( Index, FALSE, 0, 0, 0, 0);
}
break;
case F_GREP:
// Argument[0] 検索文字列
// Argument[1] 検索対象にするファイル名
// Argument[2] 検索対象にするフォルダ名
// Argument[3]:
// 次の数値の和。
// 0x01 サブフォルダからも検索する
// 0x02 この編集中のテキストから検索する(未実装)
// 0x04 英大文字と英小文字を区別する
// 0x08 正規表現
// 0x10 文字コード自動判別
// ******** 以下「結果出力」 ********
// 0x00 該当行
// 0x20 該当部分
// **********************************
// ******** 以下「出力形式」 ********
// 0x00 ノーマル
// 0x40 ファイル毎
// **********************************
// 0x0100 ~ 0xff00 文字コードセット番号 * 0x100
if( Argument[0] == NULL ){
::MYMESSAGEBOX( NULL, MB_OK | MB_ICONSTOP | MB_TOPMOST, EXEC_ERROR_TITLE,
_T( "GREPパターンが指定されていません." ));
break;
}
if( Argument[1] == NULL ){
::MYMESSAGEBOX( NULL, MB_OK | MB_ICONSTOP | MB_TOPMOST, EXEC_ERROR_TITLE,
_T( "ファイル種別が指定されていません." ));
break;
}
if( Argument[2] == NULL ){
::MYMESSAGEBOX( NULL, MB_OK | MB_ICONSTOP | MB_TOPMOST, EXEC_ERROR_TITLE,
_T( "検索先フォルダが指定されていません." ));
break;
}
{
// 常に外部ウィンドウに。
/*======= Grepの実行 =============*/
/* Grep結果ウィンドウの表示 */
char pCmdLine[1024];
char pOpt[64];
// int nDataLen;
int nCharSet;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -