home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2000 December / VPR0012B.BIN / APUPDATE / VC / TXC0620A / TXC0620A.LZH / _IDMEMCS.C < prev    next >
C/C++ Source or Header  |  2000-02-20  |  7KB  |  340 lines

  1. /*
  2.     EMACSコマンド処理群
  3.         Start 99年12月12日
  4.     
  5.     このプログラムはEXEには含まれていない。
  6.     
  7.     EMACS like keybind 実装にあたり、
  8.     中村 学 (Nakamura Manabu)さんのEMACSWZと、
  9.     UK-TaniyamaさんのEMACSWZを参考にさせて頂きました。
  10.     ありがとうございます。
  11. */
  12.  
  13. #if __TXC__
  14.     #include <_wz.h>
  15.     #include <windows.h>
  16.     #include <windowsx.h>
  17.     #include <_idm.h>
  18. #else
  19.     #include "_sys.h"
  20. #endif
  21. #include "_idmlib.h"
  22.  
  23. #define EMACSCMD    // コマンド関数であることを表わす
  24.  
  25. //##emacs base function
  26.  
  27. void EMACSCMD kill_region(TX* text)
  28. {
  29.     txSetUndisp(text);
  30.     {
  31.         txJumpMarkCur(text);
  32.         txSelectEx(text,CLIP_CHAR);
  33.         txJumpMarkCur(text);
  34.         txIdmExec(text,IDM_CUT);
  35.     }
  36.     txSetDisp(text);
  37.     statprintf("Region cuted");
  38. }
  39.  
  40. void EMACSCMD copy_region_as_kill(TX* text)
  41. {
  42.     txSetUndisp(text);
  43.     {
  44.         int ly = text->ly;
  45.         txJumpMarkCur(text);
  46.         txSelectEx(text,CLIP_CHAR);
  47.         txJumpMarkCur(text);
  48.         txIdmExec(text,IDM_COPY);    //WZ4.00A 981230 Emacsライクキー定義で、Esc-Wにカットが割り当てられていたが、コピーに変更した。
  49.         txSetLy(text,ly);    //WZ4.00Bl 990911 RegionCopyでカーソルlyを移動しないようにした。ユーザ要望。
  50.     }
  51.     txSetDisp(text);
  52.     statprintf("Region copyed");
  53. }
  54.  
  55. void EMACSCMD transpose_words(TX* text)
  56. {
  57.     mchar src[CCHTXSTR];
  58.     mchar dst[CCHTXSTR];
  59.     txSetUndisp(text);
  60.     //
  61.     txJumpWordTopMi(text);
  62.     txSelectEx(text,CLIP_CHAR);
  63.     txJumpWordEndMi(text);
  64.     if (txGetChar(text) == ' ') {
  65.         txJumpWordEndMi(text);
  66.     }
  67.     txGetWordEx(text,src,cchof(src));
  68.     txSelectDelete(text);
  69.     //
  70.     txSelectEx(text,CLIP_CHAR);
  71.     txLeftWordMi(text);
  72.     if (txGetChar(text) == ' ') {
  73.         txLeftWordMi(text);
  74.     }
  75.     txGetWordEx(text,dst,cchof(dst));
  76.     txSelectDelete(text);
  77.     //
  78.     txInsert(text,src);
  79.     txInsert(text,dst);
  80.     //
  81.     txSetDisp(text);
  82. }
  83.  
  84. void EMACSCMD back_to_indentation(TX* text)
  85. {
  86.     txSetUndisp(text);
  87.         txJumpParaTop(text);
  88.         while(1) {
  89.             TXCHAR ch = txReadChar(text);
  90.             if (ch != '\t' && ch != ' ') break;
  91.             if (txIsCurEof(text)) break;
  92.         }
  93.         txLeft(text);
  94.     txSetDisp(text);
  95. }
  96.  
  97. static void capitalize(TX* text,BOOL fWord,BOOL fTolower)
  98. {
  99.     if (txIsCurReturn(text)) {
  100.         //WZ3.90I 981102 改行でのcapitalizeを改良。
  101.         txRight(text);
  102.     } else {
  103.         txSetUndisp(text);
  104.         {
  105.             mchar buff[CCHTXSTR];
  106.             if (!text->fClip) {
  107.                 txSelect(text);
  108.                 if (fWord) {
  109.                     txJumpWordEndMi(text);
  110.                 } else {
  111.                     txRight(text);
  112.                 }
  113.             }
  114.             txGetWordEx(text,buff,cchof(buff));
  115.             if (fTolower) {
  116.                 strlwr(buff);
  117.             } else {
  118.                 strupr(buff);
  119.             }
  120.             txSelectDelete(text);
  121.             txInsert(text,buff);
  122.             txJumpWordEndMi(text);
  123.         }
  124.         txSetDisp(text);
  125.     }
  126. }
  127.  
  128. void EMACSCMD capitalize_word(TX* text)
  129. {
  130.     capitalize(text,FALSE,FALSE);
  131. }
  132.  
  133. void EMACSCMD downcase_word(TX* text)
  134. {
  135.     capitalize(text,TRUE,TRUE);
  136. }
  137.  
  138. void EMACSCMD upcase_word(TX* text)
  139. {
  140.     capitalize(text,TRUE,FALSE);
  141. }
  142.  
  143. void EMACSCMD beginning_of_buffer(TX* text)
  144. {
  145.     txMarkCur(text);
  146.     txJumpFileTop(text);
  147.     statprintf("Mark set");
  148. }
  149.  
  150. void EMACSCMD end_of_buffer(TX* text)
  151. {
  152.     txMarkCur(text);
  153.     txJumpFileEnd(text);
  154.     statprintf("Mark set");
  155. }
  156.  
  157. void EMACSCMD beginning_of_defun(TX* text)
  158. {
  159.     txSearchEx(text,"^[{]",SEARCH_REWZ|SEARCH_PREV);
  160. }
  161.  
  162. void EMACSCMD end_of_defun(TX* text)
  163. {
  164.     txSearchEx(text,"^[}]",SEARCH_REWZ|SEARCH_PREV);
  165. }
  166.  
  167. void EMACSCMD backward_sexp(TX* text)
  168. {
  169.     txSetUndisp(text);
  170.         //WZ3.90I 981102 WZ4.0の正規表現に対応
  171.         txSearchEx(text,"\\x5D|\\x7D|\\x29",SEARCH_REWZ|SEARCH_PREV);    // ]})
  172.         txJumpBrace(text);
  173.     txSetDisp(text);
  174. }
  175.  
  176. void EMACSCMD forward_sexp(TX* text)
  177. {
  178.     txSetUndisp(text);
  179.         //WZ3.90I 981102 WZ4.0の正規表現に対応
  180.         txSearchEx(text,"\\x5B|\\x7B|\\x28",SEARCH_REWZ|SEARCH_CUR);    // [{(
  181.         txJumpBrace(text);
  182.         txRight(text);
  183.     txSetDisp(text);
  184. }
  185.  
  186. void EMACSCMD start_kbd_macro(TX* text)
  187. {
  188.     if (sh->fMacroRec) txIdmExec(text,IDM_KEYMACRORECORD);    // 既に記録中の場合は抜ける。
  189.     txIdmExec(text,IDM_KEYMACRORECORD);
  190.     statprintf("Defining kbd macro...");
  191. }
  192.  
  193. void EMACSCMD end_kbd_macro(TX* text)
  194. {
  195.     if (sh->fMacroRec) {
  196.         txIdmExec(text,IDM_KEYMACRORECORD);
  197.         statprintf("Keyboard macro defined");
  198.     }
  199. }
  200.  
  201. void EMACSCMD mark_whole_buffer(TX* text)
  202. {
  203.     txSetUndisp(text);
  204.         txJumpFileEnd(text);
  205.         txMarkCur(text);
  206.         txJumpFileTop(text);
  207.     txSetDisp(text);
  208. }
  209.  
  210. #if !UNIX
  211. void EMACSCMD suspend_emacs(TX* text)
  212. {
  213. // DOS PROMPT
  214. #if !WINDOWSCE
  215.     #if __TXC__
  216.     if (GetVersion() < 0x80000000) {
  217.         shellOpenW(L"cmd.exe");
  218.     } else {
  219.         shellOpenW(L"dosprmpt.pif");
  220.     }
  221.     #else
  222.     if (_platform == WINDOWSNT) {
  223.         shellOpenW(L"cmd.exe");
  224.     } else {
  225.         shellOpenW(L"dosprmpt.pif");
  226.     }
  227.     #endif
  228. #endif
  229. }
  230. #endif
  231.  
  232. static void EMACSCMD save_buffer(TX* text)
  233. {
  234.     if (!text->fEdit) {
  235.         statprintf("(No changes need to be saved)");
  236.     } else {
  237.         if (txuiSave(text)) {
  238.             statprintf("Wrote %s",text->szfilename);
  239.         }
  240.     }
  241. }
  242.  
  243. void EMACSCMD write_file(TX* text)
  244. {
  245.     txuiSaveTo(text);
  246. }
  247.  
  248. void EMACSCMD exchange_point_and_mark(TX* text)
  249. {
  250.     txJumpMarkCur(text);
  251.     txSetLyCenter(text);
  252. }
  253.  
  254. void EMACSCMD kill_line(TX* text)
  255. {
  256. // カーソル位置から行末までを削除します。
  257. // カーソル位置が改行なら、改行を削除します。
  258. // 削除した文字列をクリップボードにコピーします。
  259. // 連続実行するとクリップボードに追加します。
  260.     TX* textWork = NULL;
  261.     txSetUndisp(text);
  262.     {
  263. //information("%d %d",text->idmLast,_idm_kill_line);
  264.         static int _idm_kill_line;
  265.         if (!_idm_kill_line) {
  266.             _idm_kill_line = idmFromString("_idmemcs.kill_line");
  267.         }
  268.         if (text->idmLast == _idm_kill_line) {
  269.             // ^K連続実行でクリップボードに出力
  270.             textWork = textopen(NULL);
  271.             txIdmExec(textWork,IDM_PASTE);
  272.         }
  273.         txSelectEx(text,CLIP_CHAR);
  274.         if (txIsCurReturn(text)) {
  275.             txRight(text);
  276.         } else {
  277.             txJumpParaEnd(text);
  278.         }
  279.         if (textWork) {
  280.             txJumpFileEnd(textWork);
  281.             txInsertTextSelect(textWork,text);
  282.             txSelectDelete(text);
  283.             txSelectEx(textWork,CLIP_ALL);
  284.             txIdmExec(textWork,IDM_COPY);
  285.             textclose(textWork);
  286.         } else {
  287.             txIdmExec(text,IDM_CUT);
  288.         }
  289.     }
  290.     txSetDisp(text);
  291. }
  292.  
  293. void EMACSCMD recenter(TX* text)
  294. {
  295. // カーソルを画面中央にセットし、画面表示をリフレッシュ
  296.     txSetUndisp(text);
  297.         txSetLyCenter(text);
  298.     txSetDisp(text);
  299. }
  300.  
  301. void EMACSCMD quoted_insert(TX* text)
  302. {
  303. //    なにもしない
  304. }
  305.  
  306. void EMACSCMD keyboard_quit(TX* text)
  307. {
  308. // インクリメンタルサーチ等の取り消し
  309.     txIsearchQuitEm(text);
  310.     statprintf("Quit");
  311. }
  312.  
  313. void EMACSCMD transpose_chars(TX* text)
  314. {
  315. // カーソル位置と左の文字を入れ替え
  316.     if (txIsCurReturn(text)) return;
  317.     txSetUndisp(text);
  318.         txSelectQuit(text);
  319.         {
  320.             TXCHAR ch = txGetChar(text);
  321.             txDeleteChar(text);
  322.             txLeft(text);
  323.             txInsertChar(text,ch);
  324.             txRight(text);
  325.         }
  326.     txSetDisp(text);
  327. }
  328.  
  329. void EMACSCMD toggle_ime_mode(TX* text)
  330. {
  331.     wndImeSetOpen(text->hwndtext,!wndImeGetOpen(text->hwndtext));
  332. }
  333.  
  334. void EMACSCMD set_mark_command(TX* text)
  335. {
  336.     statprintf("Mark set");
  337.     txMarkCur(text);
  338. }
  339.  
  340.