フォーラムの返信を作成しました。
- 作成者投稿
- 星くず 彼方に参加者
わかりました、やってみます。
ありがとうございました。星くず 彼方に参加者開発お疲れ様です。
21.3.903 x64で、
BOOL checks[7] {}; BOOL enables[7] { Editor_QueryStatus(em, EEID_WINDOW_SPLIT, &checks[0]), Editor_QueryStatus(em, EEID_WINDOW_SPLIT_HORZ, &checks[1]), Editor_QueryStatus(em, EEID_WINDOW_SPLIT_VERT, &checks[2]), Editor_QueryStatus(em, EEID_WINDOW_SPLIT_HORZ_FIX, &checks[3]), Editor_QueryStatus(em, EEID_WINDOW_SPLIT_VERT_FIX, &checks[4]), Editor_QueryStatus(em, EEID_WINDOW_SPLIT_HORZ_TOGGLE, &checks[5]), Editor_QueryStatus(em, EEID_WINDOW_SPLIT_VERT_TOGGLE, &checks[6]) }; wchar_t str[0x8000]; swprintf_s(str, L"%d : %d, %d : %d, %d : %d, %d\n" L"%d : %d, %d : %d, %d : %d, %d", enables[0], enables[1], enables[2], enables[3], enables[4], enables[5], enables[6], checks[0], checks[1], checks[2], checks[3], checks[4], checks[5], checks[6] ); MessageBoxW(em, str, L"test", MB_OK);
というコードを試しました。
分割無し
1 : 1, 1 : 1, 1 : 1, 1
0 : 0, 0 : 0, 0 : 0, 0上下2分割
1 : 1, 1 : 1, 1 : 1, 1
0 : 0, 0 : 0, 0 : 1, 0左右2分割
1 : 1, 1 : 1, 1 : 1, 1
0 : 0, 0 : 0, 0 : 0, 1上下3分割
0 : 0, 0 : 0, 0 : 0, 0
0 : 0, 0 : 0, 0 : 0, 0左右3分割
0 : 0, 0 : 0, 0 : 0, 0
0 : 0, 0 : 0, 0 : 0, 0上下左右4分割
1 : 1, 1 : 0, 0 : 1, 1
0 : 0, 0 : 0, 0 : 1, 1
という結果が得られました。上下3分割と、左右3分割の区別がつけられないようです。
星くず 彼方に参加者わかりました、それでやってみます。
ありがとうございました。星くず 彼方に参加者冬期休暇に入ったので、とっかかります。
星くず 彼方に参加者v14.4.3 beta 1で問題が修正されてるのを確認しました。
ありがとうございました。星くず 彼方に参加者次のベータの修正で直るかもしれませんが、一応追加の情報です。
表示/非表示を切り替えられるものはいくつかありますが、
各種ツールバーの有無は影響しない
タブの有無/スタイルは影響しない
スクロールバーの有無は影響しない
ステータスバーの有無は影響しない
ルーラーを非表示にしてる時は発生しない
ルーラーを表示しているときだけおかしくなるルーラーを表示しているときの「文末へ」コマンド時、OnEventsに EVENT_CARET_MOVED が、2回やってくる。
そのうち1回目でやると、0xffffffff80000000へ変換される。 2回目でやった時は正常値へ変換される。
ルーラーを表示してないときの「文末へ」コマンド時、OnEventsのEVENT_CARET_MOVEDは1回だけ。逆に「文頭へ」コマンドの場合は、ルーラーの有無にかかわらず、OnEventsのEVENT_CARET_MOVEDは1回だけ。
星くず 彼方に参加者ライブラリページが修正されてるの確認しました。
ありがとうございました星くず 彼方に参加者こんにちは
手前味噌な話で恐縮ですが、拙作「BoxSelects 箱形選択」プラグインが、
そのような操作で箱型選択できるようにするためのものです。ここのライブラリにも登録してあります。
(型の字が間違ってるので検索するときは注意。)それを入れて、ショートカットキーを割り当てて使います。
星くず 彼方に参加者こんにちは
亀レスですが、ひょっとしたら、
昔作った EditViewOnlyChangePanes 分割されたペインへ切り替え というプラグインが、
kshiさんの望みの操作かもしれません。よろしければ、本体に実装されるまでのつなぎとしてどうぞ。
星くず 彼方に参加者よくよく考えてみたら、巨大ファイルコントローラ使って大きなファイルを部分的に読み込んでるときは、GetWindowText系はうまくいかないかもしれません。(未テスト)
ファイルが巨大な場合(EmEditorは248 GB以上のファイルも処理できることになっている)、いかなる手段であれ全体を取得するのは無理があると思うので、一定以上大きなファイルの時は全体を取得しないようにした方がいいと思います。
星くず 彼方に参加者横から失礼。
snowさんのおっしゃるカーソル位置のシリアル位置取得なら
POINT_PTR pp;
Editor_GetCaretPos( hwnd, POS_LOGICAL_W, &pp );
UINT_PTR n = Editor_LogicalToSerial( hwnd, &pp );
でいけますね。
昔使ったことあるのに、存在をすっかり忘れてた・・・こちらも例によって改行文字がカウントされます。
また、フリーカーソル時に改行の右側へカーソルが行ったときのことを若干気にした方がいいかもしれません。星くず 彼方に参加者横から失礼。
全体の文字数を取るなら GetWindowTextLength
全体の文字列を取るなら GetWindowText
が使えますよ。
(8.05 32bit版のOnCommandとOnEventsに渡ってくるウィンドウハンドルについて実験済み。)ただし、改行文字も(おそらくその他の制御文字も)含まれます。
試した範囲では、改行コードがCRLFのようなので一改行に付き2文字分増えます。星くず 彼方に参加者横から失礼します
ShiftJISは範囲内の全ての番号を使い切ってるわけではないので、
>>第一バイトが0x81~0x9F・0xE0~0xFC
>>第二バイトが0x40~0x7E・0x80~0xFC
>>と0x0D0Aだけで構成されていることは確認済みです。
であっても EmEditorの内部コードであると思われるUNICODEに変換できるとは限りません。たとえば 0x81 0xB0 はShiftJISの範囲内ですが、
文字が割り当てられておらず、UNICODEにも変換できません。
(後で調べたらShift_JIS-2004では文字が割り当てられてるようです。しかしながら 少なくともXPSP3ではUNICODEへ変換できない状況は変わらないようです)なので、
プログラマさんのようなので、一度、全文字UNICODEに変換できるか試してみてははいかがでしょう?
そのときはMultiByteToWideCharの第二引数にMB_ERR_INVALID_CHARSを指定してやってください。
もし変換できない文字が含まれてたら失敗して0が帰ってきます。これできっちり全ての文字が変換できたら、あなたのファイルは、より確実に白であるといえるでしょう。
>>その二つのファイルをバイナリで比較するとまったく同一のファイルでした。
のほうは、わかりませんが・・・星くず 彼方に参加者こちらのコードが動いたのは、
32bit版
WinXP+ATOK2008
WinXP+MS-IME2002(詳細なテキストサービスのサポートをプログラムのすべてに拡張する offの時のみ)
64bit版
WinVista+ATOK2008
EmEditor 8.05ですWinVista64bit+MS-IMEは、こっちもダメですね・・・
星くず 彼方に参加者横から失礼
このスレ見てプラグインを作ろうとしてたのですが、本体側で対応してくれるのならプラグインいらないですね。
こっちでは機能するようになったので、ソースの一部を張っときます。
case WM_IME_REQUEST:
if( wParam == IMR_DOCUMENTFEED ){
POINT_PTR pos;
Editor_GetCaretPos( hwnd, POS_LOGICAL_W, &pos );
GET_LINE_INFO inf;
inf.cch = 0;
inf.flags = FLAG_LOGICAL;
inf.yLine = pos.y;
UINT_PTR size( Editor_GetLineW( hwnd, &inf, NULL ) );
inf.cch = size + 32;
wchar_t* buf( (wchar_t*)_alloca( inf.cch * sizeof(wchar_t) ) );
if( buf ){
Editor_GetLineW( hwnd, &inf, buf );
size_t len( wcslen(buf) );
/* wchar_t str[30];
swprintf_s( str, L” %d”, lParam );
wcscat_s( buf, inf.cch, str );
MessageBox( hwnd, buf, L””, MB_OK );/**/
if( lParam ){
RECONVERTSTRING* rcs( (RECONVERTSTRING*)lParam );
memset( rcs, 0, sizeof(RECONVERTSTRING) );
rcs->dwSize = sizeof(RECONVERTSTRING);
rcs->dwStrOffset = sizeof(RECONVERTSTRING);
rcs->dwStrLen = (DWORD)len;
rcs->dwTargetStrOffset = (DWORD)(min( (size_t)max( pos.x, 0 ), len ) * sizeof(wchar_t));
wcscpy_s( (wchar_t*)(rcs + 1), len + 1, buf );
}
return sizeof(RECONVERTSTRING) + (len + 1) * sizeof(wchar_t);
}
}
break;このソースはUnicode版のものです。
多分に余計なものも含まれてるでしょうが、私のところではこれで、32bit,64bitともに動いてます。参考になりますでしょうか・・・
星くず 彼方に参加者調べてみたところ、
・プロジェクトプラグインでVisualStudioのソリューションを開く。
・現在のソリューションテンプレートのプロパティのキーボードで、定義へ移動からF12を削除し、いったんプロパティを閉じる。とすると、上記プロパティのパラメータ情報の現在のキーのところに、勝手にSpaceが出現し、これが作用していたようです。
(仮想PCにクリーンインストールした環境でも再現しました)星くず 彼方に参加者説明の通りにすると、タグジャンプできるようになりました。
ありがとうございます。「プラグインの設定」以外にも、設定画面があったのですね……
気づかなかった。とりあえず、F12タグジャンプができるようにはなったのですが、説明されたようにキー設定を変えて以降、プロジェクトプラグインを表示している間、スペースキーでスペースを入力できなくなりました。
スペースキーには、本体でもプラグインでも設定してないのですが…… - 作成者投稿