home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2000 December
/
VPR0012B.BIN
/
APUPDATE
/
VC
/
TXC0621S
/
TXC0621S.LZH
/
_IDMEMCS.C
< prev
next >
Wrap
C/C++ Source or Header
|
2000-02-20
|
7KB
|
340 lines
/*
EMACSコマンド処理群
Start 99年12月12日
このプログラムはEXEには含まれていない。
EMACS like keybind 実装にあたり、
中村 学 (Nakamura Manabu)さんのEMACSWZと、
UK-TaniyamaさんのEMACSWZを参考にさせて頂きました。
ありがとうございます。
*/
#if __TXC__
#include <_wz.h>
#include <windows.h>
#include <windowsx.h>
#include <_idm.h>
#else
#include "_sys.h"
#endif
#include "_idmlib.h"
#define EMACSCMD // コマンド関数であることを表わす
//##emacs base function
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");
}
void EMACSCMD copy_region_as_kill(TX* text)
{
txSetUndisp(text);
{
int ly = text->ly;
txJumpMarkCur(text);
txSelectEx(text,CLIP_CHAR);
txJumpMarkCur(text);
txIdmExec(text,IDM_COPY); //WZ4.00A 981230 Emacsライクキー定義で、Esc-Wにカットが割り当てられていたが、コピーに変更した。
txSetLy(text,ly); //WZ4.00Bl 990911 RegionCopyでカーソルlyを移動しないようにした。ユーザ要望。
}
txSetDisp(text);
statprintf("Region copyed");
}
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);
}
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 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);
}
}
void EMACSCMD capitalize_word(TX* text)
{
capitalize(text,FALSE,FALSE);
}
void EMACSCMD downcase_word(TX* text)
{
capitalize(text,TRUE,TRUE);
}
void EMACSCMD upcase_word(TX* text)
{
capitalize(text,TRUE,FALSE);
}
void EMACSCMD beginning_of_buffer(TX* text)
{
txMarkCur(text);
txJumpFileTop(text);
statprintf("Mark set");
}
void EMACSCMD end_of_buffer(TX* text)
{
txMarkCur(text);
txJumpFileEnd(text);
statprintf("Mark set");
}
void EMACSCMD beginning_of_defun(TX* text)
{
txSearchEx(text,"^[{]",SEARCH_REWZ|SEARCH_PREV);
}
void EMACSCMD end_of_defun(TX* text)
{
txSearchEx(text,"^[}]",SEARCH_REWZ|SEARCH_PREV);
}
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);
}
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);
}
void EMACSCMD start_kbd_macro(TX* text)
{
if (sh->fMacroRec) txIdmExec(text,IDM_KEYMACRORECORD); // 既に記録中の場合は抜ける。
txIdmExec(text,IDM_KEYMACRORECORD);
statprintf("Defining kbd macro...");
}
void EMACSCMD end_kbd_macro(TX* text)
{
if (sh->fMacroRec) {
txIdmExec(text,IDM_KEYMACRORECORD);
statprintf("Keyboard macro defined");
}
}
void EMACSCMD mark_whole_buffer(TX* text)
{
txSetUndisp(text);
txJumpFileEnd(text);
txMarkCur(text);
txJumpFileTop(text);
txSetDisp(text);
}
#if !UNIX
void EMACSCMD suspend_emacs(TX* text)
{
// DOS PROMPT
#if !WINDOWSCE
#if __TXC__
if (GetVersion() < 0x80000000) {
shellOpenW(L"cmd.exe");
} else {
shellOpenW(L"dosprmpt.pif");
}
#else
if (_platform == WINDOWSNT) {
shellOpenW(L"cmd.exe");
} else {
shellOpenW(L"dosprmpt.pif");
}
#endif
#endif
}
#endif
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);
}
}
}
void EMACSCMD write_file(TX* text)
{
txuiSaveTo(text);
}
void EMACSCMD exchange_point_and_mark(TX* text)
{
txJumpMarkCur(text);
txSetLyCenter(text);
}
void EMACSCMD kill_line(TX* text)
{
// カーソル位置から行末までを削除します。
// カーソル位置が改行なら、改行を削除します。
// 削除した文字列をクリップボードにコピーします。
// 連続実行するとクリップボードに追加します。
TX* textWork = NULL;
txSetUndisp(text);
{
//information("%d %d",text->idmLast,_idm_kill_line);
static int _idm_kill_line;
if (!_idm_kill_line) {
_idm_kill_line = idmFromString("_idmemcs.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);
}
void EMACSCMD recenter(TX* text)
{
// カーソルを画面中央にセットし、画面表示をリフレッシュ
txSetUndisp(text);
txSetLyCenter(text);
txSetDisp(text);
}
void EMACSCMD quoted_insert(TX* text)
{
// なにもしない
}
void EMACSCMD keyboard_quit(TX* text)
{
// インクリメンタルサーチ等の取り消し
txIsearchQuitEm(text);
statprintf("Quit");
}
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);
}
void EMACSCMD toggle_ime_mode(TX* text)
{
wndImeSetOpen(text->hwndtext,!wndImeGetOpen(text->hwndtext));
}
void EMACSCMD set_mark_command(TX* text)
{
statprintf("Mark set");
txMarkCur(text);
}