103
103
bool searchBackward;
104
104
static string lastPattern;
105
105
static string lastReplacement;
113
if (viTextEditor != null) {
114
viTextEditor.Caret.IsVisible = curState != State.Command;
115
viTextEditor.RequestResetCaretBlink ();
107
121
const string substMatch = @"^:s(?<sep>.)(?<pattern>.+?)\k<sep>(?<replacement>.*?)(\k<sep>(?<trailer>i?))?$";
108
122
StringBuilder commandBuffer = new StringBuilder ();
109
123
Dictionary<char,ViMark> marks = new Dictionary<char, ViMark>();
215
233
public override bool WantsToPreemptIM {
217
return state != State.Insert && state != State.Replace;
235
return CurState != State.Insert && CurState != State.Replace;
221
239
protected override void SelectionChanged ()
223
241
if (Data.IsSomethingSelected) {
224
state = ViEditMode.State.Visual;
242
CurState = ViEditMode.State.Visual;
225
243
Status = "-- VISUAL --";
226
} else if (state == State.Visual && !Data.IsSomethingSelected) {
244
} else if (CurState == State.Visual && !Data.IsSomethingSelected) {
231
249
protected override void CaretPositionChanged ()
233
if (state == State.Replace || state == State.Insert || state == State.Visual)
251
if (CurState == State.Replace || CurState == State.Insert || CurState == State.Visual)
235
else if (state == ViEditMode.State.Normal || state == ViEditMode.State.Unknown)
253
else if (CurState == ViEditMode.State.Normal || CurState == ViEditMode.State.Unknown)
236
254
ViActions.RetreatFromLineEnd (Data);
259
ViStatusArea statusArea;
260
TextEditor viTextEditor;
241
262
void CheckVisualMode ()
243
if (state == ViEditMode.State.Visual || state == ViEditMode.State.Visual) {
264
if (CurState == ViEditMode.State.Visual || CurState == ViEditMode.State.Visual) {
244
265
if (!Data.IsSomethingSelected)
245
state = ViEditMode.State.Normal;
266
CurState = ViEditMode.State.Normal;
247
268
if (Data.IsSomethingSelected) {
248
state = ViEditMode.State.Visual;
269
CurState = ViEditMode.State.Visual;
249
270
Status = "-- VISUAL --";
275
296
data.Caret.Mode = CaretMode.Block;
276
297
ViActions.RetreatFromLineEnd (data);
299
viTextEditor = data.Parent;
300
if (viTextEditor != null) {
301
statusArea = new ViStatusArea (viTextEditor, this);
302
viTextEditor.AddTopLevelWidget (statusArea, 0, 0);
303
((TextEditor.EditorContainerChild)viTextEditor[statusArea]).FixedPosition = true;
279
308
protected override void OnRemovedFromEditor (TextEditorData data)
281
310
data.Caret.Mode = CaretMode.Insert;
311
if (viTextEditor != null) {
312
viTextEditor.Remove (statusArea);
313
statusArea.Destroy ();
284
320
void Reset (string status)
286
state = State.Normal;
322
CurState = State.Normal;
287
323
ResetEditorState (Data);
289
325
commandBuffer.Length = 0;
363
399
Caret.Mode = CaretMode.Insert;
364
400
Status = "-- INSERT --";
365
state = State.Insert;
401
CurState = State.Insert;
369
405
Caret.Mode = CaretMode.Underscore;
370
406
Status = "-- REPLACE --";
371
state = State.Replace;
407
CurState = State.Replace;
375
411
Status = "-- VISUAL LINE --";
376
412
Data.SetSelectLines (Caret.Line, Caret.Line);
377
state = State.VisualLine;
413
CurState = State.VisualLine;
381
417
Status = "-- VISUAL --";
382
state = State.Visual;
418
CurState = State.Visual;
383
419
RunAction (ViActions.VisualSelectionFromMoveAction (ViActions.Right));
388
state = State.Delete;
424
CurState = State.Delete;
429
CurState = State.Yank;
433
CurState = State.Yank;
398
434
HandleKeypress (Gdk.Key.y, (int)'y', Gdk.ModifierType.None);
562
598
case State.Delete:
563
if (((modifier & (Gdk.ModifierType.ShiftMask | Gdk.ModifierType.ControlMask)) == 0
599
if (IsInnerOrOuterMotionKey (unicodeKey, ref motion)) return;
601
if (motion != Motion.None) {
602
action = ViActionMaps.GetEditObjectCharAction((char) unicodeKey, motion);
604
else if (((modifier & (Gdk.ModifierType.ShiftMask | Gdk.ModifierType.ControlMask)) == 0
564
605
&& unicodeKey == 'd'))
566
607
action = SelectionActions.LineActionFromMoveAction (CaretMoveActions.LineEnd);
630
if (IsInnerOrOuterMotionKey (unicodeKey, ref motion)) return;
589
631
int offset = Caret.Offset;
591
if (((modifier & (Gdk.ModifierType.ShiftMask | Gdk.ModifierType.ControlMask)) == 0
633
if (motion != Motion.None) {
634
action = ViActionMaps.GetEditObjectCharAction((char) unicodeKey, motion);
636
else if (((modifier & (Gdk.ModifierType.ShiftMask | Gdk.ModifierType.ControlMask)) == 0
592
637
&& unicodeKey == 'y'))
594
639
action = SelectionActions.LineActionFromMoveAction (CaretMoveActions.LineEnd);
617
662
case State.Change:
663
if (IsInnerOrOuterMotionKey (unicodeKey, ref motion)) return;
665
if (motion != Motion.None) {
666
action = ViActionMaps.GetEditObjectCharAction((char) unicodeKey, motion);
618
668
//copied from delete action
619
if (((modifier & (Gdk.ModifierType.ShiftMask | Gdk.ModifierType.ControlMask)) == 0
669
else if (((modifier & (Gdk.ModifierType.ShiftMask | Gdk.ModifierType.ControlMask)) == 0
620
670
&& unicodeKey == 'c'))
622
672
action = SelectionActions.LineActionFromMoveAction (CaretMoveActions.LineEnd);
1212
public override void AllocateTextArea (TextEditor textEditor, TextArea textArea, Gdk.Rectangle allocation)
1214
if (!statusArea.Visible)
1216
allocation.Height -= (int)textArea.LineHeight;
1217
if (textArea.Allocation != allocation)
1218
textArea.SizeAllocate (allocation);
1219
statusArea.SetSizeRequest (allocation.Width, (int)viTextEditor.LineHeight);
1220
viTextEditor.MoveTopLevelWidget (statusArea, 0, allocation.Height);
1223
class ViStatusArea : Gtk.DrawingArea
1226
ViEditMode editMode;
1228
public ViStatusArea (TextEditor editor, ViEditMode editMode)
1230
this.editor = editor;
1231
this.editMode = editMode;
1232
editor.TextViewMargin.CaretBlink += HandleCaretBlink;
1233
editor.Caret.PositionChanged += HandlePositionChanged;
1236
void HandlePositionChanged (object sender, DocumentLocationEventArgs e)
1241
void HandleCaretBlink (object sender, EventArgs e)
1246
protected override void OnDestroyed ()
1248
editor.Caret.PositionChanged -= HandlePositionChanged;
1249
editor.TextViewMargin.CaretBlink -= HandleCaretBlink;
1250
base.OnDestroyed ();
1253
protected override bool OnExposeEvent (Gdk.EventExpose evnt)
1255
using (Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window)) {
1256
cr.Rectangle (evnt.Region.Clipbox.X, evnt.Region.Clipbox.Y, evnt.Region.Clipbox.Width, evnt.Region.Clipbox.Height);
1257
cr.Color = editor.ColorStyle.PlainText.Background;
1259
using (var layout = PangoUtil.CreateLayout (editor)) {
1260
layout.FontDescription = editor.Options.Font;
1262
layout.SetText ("000,00-00");
1263
int minstatusw, minstatush;
1264
layout.GetPixelSize (out minstatusw, out minstatush);
1266
var line = editor.GetLine (editor.Caret.Line);
1267
var visColumn = line.GetVisualColumn (editor.GetTextEditorData (), editor.Caret.Column);
1269
if (visColumn != editor.Caret.Column) {
1270
layout.SetText (editor.Caret.Line + "," + editor.Caret.Column + "-" + visColumn);
1272
layout.SetText (editor.Caret.Line + "," + editor.Caret.Column);
1275
int statusw, statush;
1276
layout.GetPixelSize (out statusw, out statush);
1278
statusw = System.Math.Max (statusw, minstatusw);
1281
cr.MoveTo (Allocation.Width - statusw, 0);
1283
cr.Color = editor.ColorStyle.PlainText.Foreground;
1284
cr.ShowLayout (layout);
1287
layout.SetText (editMode.Status);
1289
layout.GetPixelSize (out w, out h);
1290
var x = System.Math.Min (0, -w + Allocation.Width - editor.TextViewMargin.CharWidth - statusw);
1292
cr.Color = editor.ColorStyle.PlainText.Foreground;
1293
cr.ShowLayout (layout);
1294
if (editMode.CurState == ViEditMode.State.Command) {
1295
if (editor.TextViewMargin.caretBlink) {
1296
cr.Rectangle (w + x, 0, (int)editor.TextViewMargin.CharWidth, (int)editor.LineHeight);
1307
public enum Motion {