home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2000 August
/
VPR0008B.BIN
/
APUPDATE
/
VC
/
TXC206
/
txc206.lzh
/
_EMACSWZ.C
next >
Wrap
C/C++ Source or Header
|
1999-03-03
|
23KB
|
944 lines
/*
_EMACSWZ.C
emacs like key assign
98年11月 1日 日曜 start
EMACS like keybind 実装にあたり、
中村 学 (Nakamura Manabu)さんのEMACSWZと、
UK-TaniyamaさんのEMACSWZを参考にさせて頂きました。
ありがとうございます。
キーボードマクロには、WZ基本コマンドしか記録されません。
EMACSWZによる拡張コマンドは記録されません。
Emacsキー定義にこのマクロプログラムを使用するには、「TX-Cの設定」で
イベントマクロに_emacswzを追加してください。
*/
#ifdef __TXC__
#include "_wz.h"
#include "_idmcmd.h"
#include <windows.h>
#else
#include "wz.h"
#endif
#if defined(__TXC__) || !WINDOWSCE
#define EMACSCMD // コマンド関数であることを表わす
struct tag_EMACSWZ_CONTEXT {
mchar szIsearch[CCHWORD];
mchar szIsearch0[CCHWORD];
SEARCHMODE Isearchmode;
BOOL fIsearching;
BOOL fIsearchWrapped;
BOOL fIsearchLastFail;
IFILE adrIsearch;
IFILE adrIsearch0;
int chPrefix; // {Esc} | Ctrl+X
// static BOOL _fStatBasePrinting = FALSE;
// static mchar _chPrefix = 0;
// static BOOL _fImeOpen = FALSE;//3.00A4 970509
} EMACSWZ_CONTEXT;
static int _idmFirst;
static int _idmLast;
static int _idm_kill_line;
static int _idm_isearch_backward;
static int _idm_isearch_forward;
static int _idm_isearch_forward_regexp;
//
static int _idm_prefix_ctrlx;
static int _idm_prefix_escape;
//##incremental-search
static void isearch_statprint(TX* text,BOOL find,SEARCHMODE searchmode)
{
mchar sz[CCHTXSTR] = {0};
if (!find) strcat(sz,"Failing ");
if (text->emacswz->fIsearchWrapped) strcat(sz,"Wrapped ");
if (searchmode & SEARCH_REWZ) strcat(sz,"Regexp ");
strcat(sz,"I-search");
if (searchmode & SEARCH_PREV) strcat(sz," backward");
strcat(sz,": ");
sstrcat(sz,text->emacswz->szIsearch);
txStatusbarPrintf(text,sz);
}
static BOOL isearchIsContinueIdm(int idm)
{
//WZ4.00Ab 990124 new
if (idm == _idm_isearch_backward) return TRUE;
if (idm == _idm_isearch_forward) return TRUE;
if (idm == _idm_isearch_forward_regexp) return TRUE;
return FALSE;
}
static BOOL isearchIsContinue(TX* text)
{
return isearchIsContinueIdm(text->idmLast);
}
static void isearch_next(TX* text,SEARCHMODE searchmode)
{
SEARCHMODE mode = SEARCH_FORWARD|SEARCH_NOSENSECASE|searchmode;
if (text->emacswz->szIsearch[0]) {
BOOL ret = FALSE;
IFILE adr = txGetAddress(text);
IFILE adrCurscreen = txGetAddressCurscreen(text);
int ly = text->ly;
txSetUndisp(text);
if (text->emacswz->fIsearchLastFail) {
text->emacswz->fIsearchLastFail = FALSE;
if (mode & SEARCH_PREV) {
txJumpFileEnd(text);
} else {
txJumpFileTop(text);
}
text->emacswz->fIsearchWrapped = TRUE;
}
ret = txSearchEx(text,text->emacswz->szIsearch,mode);
if (!ret) {
text->emacswz->fIsearchLastFail = TRUE;
}
if (ret) {
text->emacswz->adrIsearch = txGetAddress(text);
if ((mode & SEARCH_PREV) && !(mode & SEARCH_CUR)) {
// 連続実行時でBackward時は実行しない
} else {
txRightBytes(text,ret-1);
}
txSetLy(text,ly);
} else {
txJumpAddress(text,adr);
txSetLyCurscreen(text,adrCurscreen);
}
txSetDisp(text);
isearch_statprint(text,ret,mode);
strcpy(text->emacswz->szIsearch0,text->emacswz->szIsearch);
} else {
isearch_statprint(text,TRUE,searchmode);
}
}
static void isearch(TX* text,SEARCHMODE searchmode)
{
if (isearchIsContinue(text)) {
// 連続実行
if (!text->emacswz->fIsearching) {
text->emacswz->fIsearching = TRUE;
}
if (!text->emacswz->szIsearch[0]) strcpy(text->emacswz->szIsearch,text->emacswz->szIsearch0);
isearch_next(text,searchmode|text->emacswz->Isearchmode);
} else {
// if (!text->emacswz->fIsearching) {
text->emacswz->fIsearching = TRUE;
text->emacswz->szIsearch[0] = 0;
text->emacswz->fIsearchWrapped = FALSE;
text->emacswz->adrIsearch0 = text->emacswz->adrIsearch = txGetAddress(text);
text->emacswz->fIsearchLastFail = FALSE;
text->emacswz->Isearchmode = searchmode & SEARCH_REWZ;
// }
isearch_next(text,searchmode|SEARCH_CUR);
}
}
static void EMACSCMD isearch_backward(TX* text)
{
// インクリメンタルサーチ(上方向)
isearch(text,SEARCH_PREV);
}
static void EMACSCMD isearch_forward(TX* text)
{
// インクリメンタルサーチ(下方向)
isearch(text,0);
}
static void EMACSCMD isearch_forward_regexp(TX* text)
{
isearch(text,SEARCH_REWZ);
}
static void EMACSCMD isearch_quit(TX* text)
{
//WZ4.00Ab 990124 new
if (text->emacswz->fIsearching) {
text->emacswz->fIsearching = FALSE;
txStatusbarPrintf(text,NULL);
}
}
//##emacs base function
static void EMACSCMD kill_region(TX* text)
{
txSetUndisp(text);
txJumpMarkCur(text);
txSelectEx(text,CLIP_CHAR);
txJumpMarkCur(text);
txIdmExec(text,IDM_CUT);
txSetDisp(text);
statprintf("Region cuted");
}
static void EMACSCMD copy_region_as_kill(TX* text)
{
txSetUndisp(text);
txJumpMarkCur(text);
txSelectEx(text,CLIP_CHAR);
txJumpMarkCur(text);
txIdmExec(text,IDM_COPY); //WZ4.00A 981230 Emacsライクキー定義で、Esc-Wにカットが割り当てられていたが、コピーに変更した。
txSetDisp(text);
statprintf("Region copyed");
}
static void EMACSCMD fill_paragraph(TX* text)
{
txIdmExec(text,IDM_FORM);
}
static void EMACSCMD goto_line(TX* text)
{
txIdmExec(text,IDM_UIJUMP);
}
static void EMACSCMD transpose_words(TX* text)
{
mchar src[CCHTXSTR];
mchar dst[CCHTXSTR];
txSetUndisp(text);
//
txJumpWordTopMi(text);
txSelectEx(text,CLIP_CHAR);
txJumpWordEndMi(text);
if (txGetChar(text) == ' ') {
txJumpWordEndMi(text);
}
txGetWordEx(text,src,cchof(src));
txSelectDelete(text);
//
txSelectEx(text,CLIP_CHAR);
txLeftWordMi(text);
if (txGetChar(text) == ' ') {
txLeftWordMi(text);
}
txGetWordEx(text,dst,cchof(dst));
txSelectDelete(text);
//
txInsert(text,src);
txInsert(text,dst);
//
txSetDisp(text);
}
static void EMACSCMD back_to_indentation(TX* text)
{
txSetUndisp(text);
txJumpParaTop(text);
while(1) {
TXCHAR ch = txReadChar(text);
if (ch != '\t' && ch != ' ') break;
if (txIsCurEof(text)) break;
}
txLeft(text);
txSetDisp(text);
}
static void EMACSCMD kill_word(TX* text)
{
txDeleteWord(text);
}
static void EMACSCMD backward_word(TX* text)
{
txLeftWordMi(text);
}
static void EMACSCMD forward_word(TX* text)
{
txRightWordMi(text);
}
static void capitalize(TX* text,BOOL fWord,BOOL fTolower)
{
if (txIsCurReturn(text)) {
//WZ3.90I 981102 改行でのcapitalizeを改良。
txRight(text);
} else {
txSetUndisp(text);
{
mchar buff[CCHTXSTR];
if (!text->fClip) {
txSelect(text);
if (fWord) {
txJumpWordEndMi(text);
} else {
txRight(text);
}
}
txGetWordEx(text,buff,cchof(buff));
if (fTolower) {
strlwr(buff);
} else {
strupr(buff);
}
txSelectDelete(text);
txInsert(text,buff);
txJumpWordEndMi(text);
}
txSetDisp(text);
}
}
static void EMACSCMD capitalize_word(TX* text)
{
capitalize(text,FALSE,FALSE);
}
static void EMACSCMD downcase_word(TX* text)
{
capitalize(text,TRUE,TRUE);
}
static void EMACSCMD upcase_word(TX* text)
{
capitalize(text,TRUE,FALSE);
}
static void EMACSCMD beginning_of_buffer(TX* text)
{
txMarkCur(text);
txJumpFileTop(text);
statprintf("Mark set");
}
static void EMACSCMD end_of_buffer(TX* text)
{
txMarkCur(text);
txJumpFileEnd(text);
statprintf("Mark set");
}
static void EMACSCMD query_replase(TX* text)
{
txIdmExec(text,IDM_UIREPLACEQUERY);
}
static void EMACSCMD backward_paragraph(TX* text)
{
txJumpParaTop(text);
}
static void EMACSCMD forward_paragraph(TX* text)
{
txJumpParaEnd(text);
}
static void EMACSCMD beginning_of_defun(TX* text)
{
txSearchEx(text,"^[{]",SEARCH_REWZ|SEARCH_PREV);
}
static void EMACSCMD end_of_defun(TX* text)
{
txSearchEx(text,"^[}]",SEARCH_REWZ|SEARCH_PREV);
}
static void EMACSCMD backward_sexp(TX* text)
{
txSetUndisp(text);
//WZ3.90I 981102 WZ4.0の正規表現に対応
txSearchEx(text,"\\x5D|\\x7D|\\x29",SEARCH_REWZ|SEARCH_PREV); // ]})
txJumpBrace(text);
txSetDisp(text);
}
static void EMACSCMD forward_sexp(TX* text)
{
txSetUndisp(text);
//WZ3.90I 981102 WZ4.0の正規表現に対応
txSearchEx(text,"\\x5B|\\x7B|\\x28",SEARCH_REWZ|SEARCH_CUR); // [{(
txJumpBrace(text);
txRight(text);
txSetDisp(text);
}
static void EMACSCMD call_last_kbd_macro(TX* text)
{
#if 1 // ^x^eの動作が変だった。
PostMessage(text->hwndtext,WM_TXEMACS_TXCMD,IDM_KEYMACROPLAY,0);
#else
txIdmExec(text,IDM_KEYMACROPLAY);
#endif
}
static void _start_kbd_macro(TX* text)
{
if (sh->fMacroRec) txIdmExec(text,IDM_KEYMACRORECORD); // 既に記録中の場合は抜ける。
txIdmExec(text,IDM_KEYMACRORECORD);
statprintf("Defining kbd macro...");
}
static void EMACSCMD start_kbd_macro(TX* text)
{
PostMessage(text->hwndtext,WM_TXEMACS_TXCMD,IDM_KEYMACRORECORD,0);
}
static void _end_kbd_macro(TX* text)
{
if (sh->fMacroRec) {
txIdmExec(text,IDM_KEYMACRORECORD);
statprintf("Keyboard macro defined");
}
}
static void EMACSCMD end_kbd_macro(TX* text)
{
PostMessage(text->hwndtext,WM_TXEMACS_TXCMD,IDM_KEYMACRORECORD,TRUE);
}
static void EMACSCMD advertised_undo(TX* text)
{
txUndo(text);
statprintf("Undo!");
}
static void EMACSCMD kill_buffer(TX* text)
{
txuiClose(text);
}
static void EMACSCMD insert_file(TX* text)
{
txuiInsertFile(text);
}
static void EMACSCMD other_window(TX* text)
{
txSwitchWindow(text);
}
static void EMACSCMD mark_whole_buffer(TX* text)
{
txSetUndisp(text);
txJumpFileEnd(text);
txMarkCur(text);
txJumpFileTop(text);
txSetDisp(text);
}
static void EMACSCMD set_fill_column(TX* text)
{
txIdmExec(text,IDM_UIFORMPROPERTY);
}
static void EMACSCMD dired(TX* text)
{
txIdmExec(text,IDM_FILER);
}
static void EMACSCMD delete_other_windows(TX* text)
{
txIdmExec(text,IDM_SWITCHSPLIT); // とりあえず
}
static void EMACSCMD split_window_vertically(TX* text)
{
txIdmExec(text,IDM_SWITCHSPLIT); // とりあえず
}
static void EMACSCMD suspend_emacs(TX* text)
{
// DOS PROMPT
#if !WINDOWSCE
if (_platform == WINDOWSNT) {
shellOpenW(L"cmd.exe");
} else {
shellOpenW(L"dosprmpt.pif");
}
#endif
}
static void EMACSCMD save_buffers_kill_emacs(TX* text)
{
txuiCloseAllEvery(text);
}
static void EMACSCMD toggle_read_only(TX* text)
{
txIdmExec(text,IDM_SWITCHREADMODE);
}
static void EMACSCMD save_buffer(TX* text)
{
if (!text->fEdit) {
statprintf("(No changes need to be saved)");
} else {
if (txuiSave(text)) {
statprintf("Wrote %s",text->szfilename);
}
}
}
static void EMACSCMD write_file(TX* text)
{
txuiSaveTo(text);
}
static void EMACSCMD exchange_point_and_mark(TX* text)
{
txJumpMarkCur(text);
txSetLyCenter(text);
}
static void EMACSCMD list_buffers(TX* text)
{
txIdmExec(text,IDM_UIWINDOWLIST);
}
static void EMACSCMD kill_line(TX* text)
{
// カーソル位置から行末までを削除します。
// カーソル位置が改行なら、改行を削除します。
// 削除した文字列をクリップボードにコピーします。
// 連続実行するとクリップボードに追加します。
TX* textWork = NULL;
txSetUndisp(text);
{
//information("%d %d",text->idmLast,_idm_kill_line);
if (text->idmLast == _idm_kill_line) {
// ^K連続実行でクリップボードに出力
textWork = textopen(NULL);
txIdmExec(textWork,IDM_PASTE);
}
txSelectEx(text,CLIP_CHAR);
if (txIsCurReturn(text)) {
txRight(text);
} else {
txJumpParaEnd(text);
}
if (textWork) {
txJumpFileEnd(textWork);
txInsertTextSelect(textWork,text);
txSelectDelete(text);
txSelectEx(textWork,CLIP_ALL);
txIdmExec(textWork,IDM_COPY);
textclose(textWork);
} else {
txIdmExec(text,IDM_CUT);
}
}
txSetDisp(text);
}
static void EMACSCMD c_indent_command(TX* text)
{
txIdmExec(text,IDM_TAB);
}
static void EMACSCMD recenter(TX* text)
{
// カーソルを画面中央にセットし、画面表示をリフレッシュ
txSetUndisp(text);
txSetLyCenter(text);
txSetDisp(text);
}
static void EMACSCMD quoted_insert(TX* text)
{
// なにもしない
}
static void EMACSCMD keyboard_quit(TX* text)
{
// インクリメンタルサーチ等の取り消し
isearch_quit(text);
if (isearchIsContinue(text)) {
txJumpAddress(text,text->emacswz->adrIsearch0);
}
statprintf("Quit");
}
static void EMACSCMD transpose_chars(TX* text)
{
// カーソル位置と左の文字を入れ替え
if (txIsCurReturn(text)) return;
txSetUndisp(text);
txSelectQuit(text);
{
TXCHAR ch = txGetChar(text);
txDeleteChar(text);
txLeft(text);
txInsertChar(text,ch);
txRight(text);
}
txSetDisp(text);
}
static void EMACSCMD toggle_ime_mode(TX* text)
{
wndImeSetOpen(text->hwndtext,!wndImeGetOpen(text->hwndtext));
}
static void EMACSCMD scroll_down(TX* text)
{
txIdmExec(text,IDM_PAGEUP);
}
static void EMACSCMD delete_backward_char(TX* text)
{
txIdmExec(text,IDM_DELETEPREV);
}
static void EMACSCMD set_mark_command(TX* text)
{
statprintf("Mark set");
txMarkCur(text);
}
static void EMACSCMD find_file(TX* text)
{
txIdmExec(text,IDM_UIOPEN);
}
//##wndproc
typedef struct {
mchar* szctrlx;
mchar* szesc;
mchar* szName;
void (*pfunc)(TX* text);
} FUNCTION_TABLE;
static FUNCTION_TABLE _table[] = {
NULL, NULL, "isearch_backward",isearch_backward,
NULL, NULL, "isearch_forward",isearch_forward,
NULL, "^s", "isearch_forward_regexp",isearch_forward_regexp,
NULL, NULL, "kill_region",kill_region,
NULL, "w", "copy_region_as_kill",copy_region_as_kill,
NULL, "q", "fill_paragraph",fill_paragraph,
NULL, "g", "goto_line",goto_line,
NULL, "t", "transpose_words",transpose_words,
NULL, "m", "back_to_indentation",back_to_indentation,
NULL, "d", "kill_word",kill_word,
NULL, "b", "backward_word",backward_word,
NULL, "f", "forward_word",forward_word,
NULL, "c", "capitalize_word",capitalize_word,
NULL, "l", "downcase_word",downcase_word,
NULL, "u", "upcase_word",upcase_word,
NULL, "<", "beginning_of_buffer",beginning_of_buffer,
NULL, ">", "end_of_buffer",end_of_buffer,
NULL, "%", "query_replase",query_replase,
NULL, "[", "backward_paragraph",backward_paragraph,
NULL, "]", "forward_paragraph",forward_paragraph,
NULL, "^a", "beginning_of_defun",beginning_of_defun,
NULL, "^e", "end_of_defun",end_of_defun,
NULL, "^b", "backward_sexp",backward_sexp,
NULL, "^f", "forward_sexp",forward_sexp,
"e", NULL, "call_last_kbd_macro",call_last_kbd_macro,
"(", NULL, "start_kbd_macro",start_kbd_macro,
")", NULL, "end_kbd_macro",end_kbd_macro,
"u", NULL, "advertised_undo",advertised_undo,
"k", NULL, "kill_buffer",kill_buffer,
"i", NULL, "insert_file",insert_file,
"o", NULL, "other_window",other_window,
"h", NULL, "mark_whole_buffer",mark_whole_buffer,
"f", NULL, "set_fill_column",set_fill_column,
"d", NULL, "dired",dired,
"1", NULL, "delete_other_windows",delete_other_windows,
"2", NULL, "split_window_vertically",split_window_vertically,
"^z", NULL, "suspend_emacs",suspend_emacs,
"^c", NULL, "save_buffers_kill_emacs",save_buffers_kill_emacs,
"^q", NULL, "toggle_read_only",toggle_read_only,
"^s", NULL, "save_buffer",save_buffer,
"^w", NULL, "write_file",write_file,
"^x", NULL, "exchange_point_and_mark",exchange_point_and_mark,
"^b", NULL, "list_buffers",list_buffers,
NULL, NULL, "kill_line",kill_line,
NULL, NULL, "c_indent_command",c_indent_command,
NULL, NULL, "recenter",recenter,
NULL, NULL, "quoted_insert",quoted_insert,
"^g", "^g", "keyboard_quit",keyboard_quit,
NULL, NULL, "transpose_chars",transpose_chars,
NULL, NULL, "toggle_ime_mode",toggle_ime_mode,
NULL, "v", "scroll_down",scroll_down,
NULL, NULL, "delete_backward_char",delete_backward_char,
NULL, " ", "set_mark_command",set_mark_command,
"^f", NULL, "find_file",find_file,
};
static int _nTable = sizeof(_table) / sizeof(FUNCTION_TABLE);
static int szemacscmdToIdm(mchar* szcmd)
{
int n = _nTable;
FUNCTION_TABLE* p = _table;
for (;n--;p++) {
if (!stricmp(p->szName,szcmd)) {
return _idmFirst + (p - _table);
}
}
return 0;
}
static FUNCTION_TABLE* idmToFunction(int idm)
{
//WZ3.90L 981125 new
if (_idmFirst <= idm && idm <= _idmLast) {
return _table + (idm - _idmFirst);
}
return NULL;
}
#if !WINDOWSCE
mchar* idmToSzEmacsFunction(int idm)
{
//WZ3.90L 981125 new
FUNCTION_TABLE* p = idmToFunction(idm);
if (p) return p->szName;
return NULL;
}
static void OutputEmacs2Stroke(TX* textDst,mchar* sz)
{
if (*sz == '^') {
txInsert(textDst,"Ctrl+");sz++;
}
if (*sz == ' ') {
txInsert(textDst,"Space");
} else {
txInsertChar(textDst,toupper(*sz));
}
}
void txKeylistOutputEmacs2Stroke(TX* textDst)
{
int n = _nTable;
FUNCTION_TABLE* p = _table;
for (;n--;p++) {
if (p->szctrlx) {
txInsert(textDst,"Ctrl+X-");
OutputEmacs2Stroke(textDst,p->szctrlx);
txfTagInsertBeam(textDst,20);
txInsert(textDst,p->szName);
txInsertReturn(textDst);
}
if (p->szesc) {
txInsert(textDst,"Esc-");
OutputEmacs2Stroke(textDst,p->szesc);
txfTagInsertBeam(textDst,20);
txInsert(textDst,p->szName);
txInsertReturn(textDst);
}
}
}
#endif // !WINDOWSCE
static BOOL szkeyIsIncluded(mchar* sz,mchar* szkey)
{
// szにszkeyが含まれているか返す
if (sz) {
int lch = strlen(szkey);
while(*sz) {
if (!strnicmp(sz,szkey,lch)) return TRUE;
if (*sz == '^' && sz[1]) {
sz += 2;
} else {
sz++;
}
}
}
return FALSE;
}
static HOOKRESULT CALLBACK wndprocTextHook(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
TX* text = hwndtextGetText(hwnd);
switch (message) {
case WM_TXEVENT: {
if (text->emacswz) {
switch(wParam) {
case TXEVENT_2STROKE: {
if (text->emacswz->chPrefix) {
int n = _nTable;
int chPrefix = text->emacswz->chPrefix;
FUNCTION_TABLE* p = _table;
BOOL fFind = FALSE;
mchar szkey[CCHWORD];
//
text->emacswz->chPrefix = 0;
// txControlProcWmKey(text); // Ctrl+X-Ctrl+Bで、Ctrl+B単独のIDM_LEFTも入ってしまう。
txStatusbarPrintf(text,NULL);
//information("%02X",lParam);
{
mchar c = lParam;
if (c < 0x20) {
szkey[0] = '^';szkey[1] = c + 'a' - 1;szkey[2] = 0;
} else {
szkey[0] = tolower(c);szkey[1] = 0;
}
}
for (;n--;p++) {
if (chPrefix == VK_ESCAPE) {
if (szkeyIsIncluded(p->szesc,szkey)) {fFind = TRUE;break;}
} else {
if (szkeyIsIncluded(p->szctrlx,szkey)) {fFind = TRUE;break;}
}
}
if (fFind) {
(p->pfunc)(text);
}
txSetHookWndproctextResult(text,1);return HOOK_CAPTURE;
}
break;
}
case TXEVENT_IDMEXEC: {
int idm = lParam;
#if 1 //WZ3.90L 981125
if (text->emacswz->fIsearching && !isearchIsContinueIdm(idm)) {
//WZ4.00Ab 990124 Emacswz:インクリメンタル検索中にカーソル移動などを実行するとインクリメンタル検索を中止するようにした。
isearch_quit(text);
}
{
FUNCTION_TABLE* p = idmToFunction(idm);
if (p) {
(p->pfunc)(text); // __TXC__では"p->pfunc(text)"という書き方には対応していない。
return HOOK_CAPTURE;
}
}
#else
if (_idmFirst <= idm && idm <= _idmLast) {
FUNCTION_TABLE* p = _table + (idm - _idmFirst);
(p->pfunc)(text);
return HOOK_CAPTURE;
}
#endif
if (idm == _idm_prefix_ctrlx) {
text->emacswz->chPrefix = 'X';
txKeySet2Stroke(text,_idm_prefix_ctrlx);
txStatusbarPrintf(text,"C-x-");
return HOOK_CAPTURE;
}
if (idm == _idm_prefix_escape) {
text->emacswz->chPrefix = VK_ESCAPE;
txKeySet2Stroke(text,_idm_prefix_escape);
txStatusbarPrintf(text,"ESC-");
return HOOK_CAPTURE;
}
break;
}
case TXEVENT_INPUT:
case TXEVENT_INPUTIME: {
mchar* sz = (LPVOID)lParam;
if (text->emacswz->fIsearching) {
sstrcat(text->emacswz->szIsearch,sz);
text->emacswz->fIsearchWrapped = FALSE;
txSetUndisp(text);
txJumpAddress(text,text->emacswz->adrIsearch);
isearch_next(text,SEARCH_CUR|text->emacswz->Isearchmode);
txSetDisp(text);
txSetHookWndproctextResult(text,1);return HOOK_CAPTURE;
}
break;
}
case TXEVENT_CLOSE: {
if (text->emacswz) {
free(text->emacswz);
text->emacswz = NULL;
}
break;
}
}
}
break;
}
case WM_TXEMACS_TXCMD: {
if (wParam == IDM_KEYMACRORECORD) {
if (lParam) {
_end_kbd_macro(text);
} else {
_start_kbd_macro(text);
}
} else {
txIdmExec(text,wParam);
}
break;
}
}
return HOOK_CONTINUE;
}
//##event
//static int _aaa = sizeof(_table); // これがヘン
//static int _bbb = sizeof(FUNCTION_TABLE);
void __on_txFrameNewEmacs(TX* text)
{
//information("%d %d %d %d %d",_nTable,sizeof(_table) ,sizeof(FUNCTION_TABLE),_aaa,_bbb);
if (text->modeEditor == ME_EMACS) {
#ifdef __TXC__
txSetHookWndproctextTxpcode(text,wndprocTextHook);
#else
if (stristrword(txcGetEventMacro(),"_emacswz")) {
// イベントマクロに指定されている場合は何もしない。for 乗っ取り。
return;
}
txAddHookWndproctext(text,wndprocTextHook);
#endif
// コマンドの登録。登録したコマンドはプロセス内で有効
if (!_idmFirst) {
// 全コマンド登録
{
int n = _nTable;
if (n) {
_idmFirst = idmRegister();
n--;
}
while(n--) idmRegister();
_idmLast = _idmFirst + _nTable - 1;
}
// コマンドとは別に登録
_idm_prefix_ctrlx = idmRegister();
_idm_prefix_escape = idmRegister();
}
// キー登録
_idm_kill_line = szemacscmdToIdm("kill_line");
_idm_isearch_backward = szemacscmdToIdm("isearch_backward");
_idm_isearch_forward = szemacscmdToIdm("isearch_forward");
_idm_isearch_forward_regexp = szemacscmdToIdm("isearch_forward_regexp");
txKeySetWzcmd(text,"^W",szemacscmdToIdm("kill_region"));
txKeySetWzcmd(text,"^R",_idm_isearch_backward);
txKeySetWzcmd(text,"^S",_idm_isearch_forward);
txKeySetWzcmd(text,"^K",_idm_kill_line);
txKeySetWzcmd(text,"^I",szemacscmdToIdm("c_indent_command"));
txKeySetWzcmd(text,"^L",szemacscmdToIdm("recenter"));
txKeySetWzcmd(text,"^Q",szemacscmdToIdm("quoted_insert"));
txKeySetWzcmd(text,"^G",szemacscmdToIdm("keyboard_quit"));
txKeySetWzcmd(text,"^T",szemacscmdToIdm("transpose_chars"));
txKeySetWzcmd(text,"^\\",szemacscmdToIdm("toggle_ime_mode"));
txKeySetWzcmd(text,"+^{Space}",szemacscmdToIdm("toggle_ime_mode"));
txKeySetWzcmd(text,"^Z",szemacscmdToIdm("scroll_down"));
txKeySetWzcmd(text,"^H",szemacscmdToIdm("delete_backward_char"));
txKeySetWzcmd(text,"^{Space}",szemacscmdToIdm("set_mark_command"));
txKeySetWzcmd(text,"^X",_idm_prefix_ctrlx);
txKeySetWzcmd(text,"{Esc}",_idm_prefix_escape);
// コンテキスト
if (!text->emacswz) {
text->emacswz = zmalloc(sizeof(EMACSWZ_CONTEXT));
}
}
}
#ifdef __TXC__
void __on_txFrameNew(TX* text)
{
__on_txFrameNewEmacs(text);
}
main
{
}
#endif
#endif // defined(__TXC__) || !WINDOWSCE