Skip to content

Commit bd994fd

Browse files
committed
feat マルチカーソル処理実装 Ver.1
1 parent 7303ddc commit bd994fd

22 files changed

Lines changed: 915 additions & 20 deletions

‎resource/MainMenu.ini‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@
121121
2,1,30989,,
122122
2,1,30393,,
123123
2,1,30394,,
124+
2,2,1,,
125+
2,1,31392,,
126+
2,1,31393,,
127+
2,1,31394,,
124128
1,0,34011,S,
125129
2,1,30400,W,
126130
2,1,30401,A,

‎sakura_core/Funccode_x.hsrc‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,9 @@ F_TAB_CLOSEOTHER = 31388, //
435435
F_TAB_CLOSELEFT = 31389, // �������ׂĕ‚��� �Ȃ�
436436
F_TAB_CLOSERIGHT = 31390, // �E�����ׂĕ‚��� �Ȃ�
437437
F_TAB_DUPLICATE = 31391, // Duplicate window (open same file in new window) 20260801 none
438+
F_ADD_CURSOR_UP = 31392, // �ŏ�i�J�[�\����1�s��(������)�ɃJ�[�\����lj� �Ȃ� // NKMM_MULTI_CURSOR 20260830
439+
F_ADD_CURSOR_DOWN = 31393, // �ʼn��i�J�[�\����1�s��(������)�ɃJ�[�\����lj� �Ȃ� // NKMM_MULTI_CURSOR 20260830
440+
F_MULTICURSOR_UNDO = 31394, // ���߂̃J�[�\���lj������1�Ž����� �Ȃ� // NKMM_MULTI_CURSOR 20260830
438441

439442

440443
// �x��

‎sakura_core/cmd/CViewCommander.cpp‎

Lines changed: 102 additions & 3 deletions
Large diffs are not rendered by default.

‎sakura_core/cmd/CViewCommander.h‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ class CColorStrategy;
3535
class CColorStrategyPool;
3636
class CSMacroMgr;
3737
#include "CEol.h"
38+
#ifdef NKMM_MULTI_CURSOR
39+
#include <functional>
40+
#endif // NKMM_
3841

3942
class CViewCommander{
4043
public:
@@ -128,6 +131,20 @@ class CViewCommander{
128131
void Command_REDO( void ); /* やり直し(Redo) */
129132
void Command_DELETE( void ); /* カーソル位置または選択エリアを削除 */
130133
void Command_DELETE_BACK( void ); /* カーソル前を削除 */
134+
#ifdef NKMM_MULTI_CURSOR
135+
void Command_AddCursorUp( void ); /* マルチカーソル: 最上段のカーソルの1行上(同じ桁)に追加 */
136+
void Command_AddCursorDown( void ); /* マルチカーソル: 最下段のカーソルの1行下(同じ桁)に追加 */
137+
void Command_MULTICURSOR_UNDO( void ); /* マルチカーソル: 直近に追加したカーソルを1個取り消す */
138+
//! プライマリ+追加カーソルの各位置に対して1回ずつfnEditOnceを実行する(ドキュメント降順)。
139+
//! fnEditOnceはCommand_WCHAR等、現在のGetCaret()位置に作用する既存コマンドをそのまま渡す想定。
140+
void ApplyToAllCursors( const std::function<void()>& fnEditOnce );
141+
//! 移動系コマンド用の分岐。追加カーソルは「プライマリ+固定相対値」でその都度算出されるため、
142+
//! ここではプライマリのfnMoveOnceを1回呼ぶだけでよい(詳細は実装側のコメント参照)。
143+
void DispatchMoveMultiCursor( bool bSelect, const std::function<void()>& fnMoveOnce );
144+
//! 重なった(接した)カーソル同士を1個に統合する(設定でオン/オフ可能、既定オン)。
145+
//! ApplyToAllCursorsの末尾で呼ぶ。VS CodeのeditorMultiCursorMergeOverlapping相当
146+
void MergeOverlappingCursorsIfNeeded( void );
147+
#endif // NKMM_
131148
void Command_WordDeleteToStart( void ); /* 単語の左端まで削除 */
132149
void Command_WordDeleteToEnd( void ); /* 単語の右端まで削除 */
133150
void Command_WordCut( void ); /* 単語切り取り */

‎sakura_core/cmd/CViewCommander_Edit.cpp‎

Lines changed: 414 additions & 0 deletions
Large diffs are not rendered by default.

‎sakura_core/cmd/CViewCommander_ModeChange.cpp‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,18 @@ void CViewCommander::Command_CHG_CHARSET(
108108
*/
109109
void CViewCommander::Command_CANCEL_MODE( int whereCursorIs, bool bAllowCloseDialog )
110110
{
111+
#ifdef NKMM_MULTI_CURSOR
112+
// マルチカーソル中のESCは追加カーソルを一括解除するだけで、選択解除等の
113+
// 後続処理は行わない(1個ずつ戻すCtrl+Shift+U(Command_MULTICURSOR_UNDO)とは役割が違う)。
114+
// bAllowCloseDialogがtrueのとき(=ユーザーの明示的なESC/F_CANCEL_MODE)のみ反応する。
115+
// Command_UNDO等が内部的に呼ぶCommand_CANCEL_MODE()(bAllowCloseDialog=false)では
116+
// マルチカーソル状態を意図せず失わないようにするため 20260830
117+
if( bAllowCloseDialog && !m_pCommanderView->m_vExtraCursors.empty() ){
118+
m_pCommanderView->m_vExtraCursors.clear();
119+
m_pCommanderView->Redraw();
120+
return;
121+
}
122+
#endif // NKMM_
111123
bool bBoxSelect = false;
112124
if( m_pCommanderView->GetSelectionInfo().IsTextSelected() ) {
113125
// 選択解除後のカーソル位置を決める。

‎sakura_core/cmd/CViewCommander_Search.cpp‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,15 @@ void CViewCommander::Command_SEARCH_BOX( void )
8080
/* 検索(単語検索ダイアログ) */
8181
void CViewCommander::Command_SEARCH_DIALOG( void )
8282
{
83+
#ifdef NKMM_MULTI_CURSOR
84+
// 検索ダイアログを開くとフォーカスがダイアログへ移り、以降のタイプ/移動系操作は
85+
// マルチカーソルに関知しないダイアログ側の処理になるため、ここで単一カーソルに戻す
86+
// (Esc・通常クリックに続く、標準的なマルチカーソル解除操作の1つ) 20260902
87+
if( !m_pCommanderView->m_vExtraCursors.empty() ){
88+
m_pCommanderView->m_vExtraCursors.clear();
89+
m_pCommanderView->Redraw();
90+
}
91+
#endif // NKMM_
8392
/* 現在カーソル位置単語または選択範囲より検索等のキーを取得 */
8493
CNativeW cmemCurText;
8594
#ifdef NKMM_FIX_SEARCH_KEY_REGEXP_AUTO_QUOTE
@@ -673,6 +682,14 @@ void CViewCommander::Command_REPLACE_DIALOG( void )
673682
{
674683
BOOL bSelected = FALSE;
675684

685+
#ifdef NKMM_MULTI_CURSOR
686+
// 検索ダイアログと同じ理由でマルチカーソルを解除する 20260902
687+
if( !m_pCommanderView->m_vExtraCursors.empty() ){
688+
m_pCommanderView->m_vExtraCursors.clear();
689+
m_pCommanderView->Redraw();
690+
}
691+
#endif // NKMM_
692+
676693
/* 現在カーソル位置単語または選択範囲より検索等のキーを取得 */
677694
CNativeW cmemCurText;
678695
#ifdef NKMM_FIX_SEARCH_KEY_REGEXP_AUTO_QUOTE

‎sakura_core/cmd/CViewCommander_Select.cpp‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,13 @@ void CViewCommander::Command_BEGIN_BOXSELECT( bool bSelectingLock )
177177
return;
178178
}
179179

180+
#ifdef NKMM_MULTI_CURSOR
181+
// マルチカーソルと矩形選択は排他。矩形選択を開始する側が優先し、追加カーソルは解除する 20260830
182+
if( !m_pCommanderView->m_vExtraCursors.empty() ){
183+
m_pCommanderView->m_vExtraCursors.clear();
184+
}
185+
#endif // NKMM_
186+
180187
//@@@ 2002.01.03 YAZAKI 範囲選択中にShift+F6を実行すると選択範囲がクリアされない問題に対処
181188
if( m_pCommanderView->GetSelectionInfo().IsTextSelected() ){ /* テキストが選択されているか */
182189
/* 現在の選択範囲を非選択状態に戻す */

‎sakura_core/env/CShareData.cpp‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,9 @@ bool CShareData::InitShareData()
406406
auto_strcpy_s(sEdit.m_OpenDialogSelDir, _countof2(sEdit.m_OpenDialogSelDir), _T("%Personal%\\"));
407407
sEdit.m_bAutoColumnPaste = TRUE; /* 矩形コピーのテキストは常に矩形貼り付け */
408408
sEdit.m_nUndoBufMaxKB = 0; // 元に戻す履歴のデータ量上限(KB)。既定0=無制限(従来通り) 20260802
409+
#ifdef NKMM_MULTI_CURSOR
410+
sEdit.m_bMultiCursorMergeOverlapping = true; // マルチカーソル: 重なったら統合する(VS Code既定に合わせてtrue) 20260831
411+
#endif // NKMM_
409412
}
410413

411414
// [ファイル]タブ

‎sakura_core/env/CShareData_IO.cpp‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2332,6 +2332,9 @@ void CShareData_IO::ShareData_IO_Common( CDataProfile& cProfile )
23322332
if( common.m_sEdit.m_nUndoBufMaxKB < 0 ){
23332333
common.m_sEdit.m_nUndoBufMaxKB = 0;
23342334
}
2335+
#endif // NKMM_
2336+
#ifdef NKMM_MULTI_CURSOR
2337+
cProfile.IOProfileData( pszSecName, LTEXT("bMultiCursorMergeOverlapping") , common.m_sEdit.m_bMultiCursorMergeOverlapping );/* マルチカーソル: 重なったら統合する */ // 20260831
23352338
#endif // NKMM_
23362339
cProfile.IOProfileData( pszSecName, LTEXT("NoCaretMoveByActivation") , common.m_sGeneral.m_bNoCaretMoveByActivation );/* マウスクリックにてアクティベートされた時はカーソル位置を移動しない 2007.10.02 nasukoji (add by genta) */
23372340
cProfile.IOProfileData( pszSecName, LTEXT("bScrollBarHorz") , common.m_sWindow.m_bScrollBarHorz );/* 水平スクロールバーを使う */

0 commit comments

Comments
 (0)