View Issue Details

IDProjectCategoryView StatusLast Update
0002367Double CommanderGraphical user interfacepublic2022-04-16 11:26
Reporterliquidvacuum Assigned ToAlexx2000  
PrioritynormalSeverityfeatureReproducibilityhave not tried
Status resolvedResolutionfixed 
ProjectionnoneETAnone 
Fixed in Version1.1.0 
Summary0002367: Add Find, Replace and Goto line commands to Compare files
DescriptionВ инструменте "Сравнение файлов" отсутствуют команды "Найти...", "Найти далее", "Найти предыдущее", "Заменить...", "Перейти к строке...".
Необходимо добавить команды "Найти...", "Найти далее", "Найти предыдущее", "Заменить...", "Перейти к строке...", идентичные командам во встроенном редакторе.
Патч приложен.

There are no "Find...", "Find next", "Find previous", " Replace...", "Go to line..." commands in the Compare files tool.
There is need to add "Find...", "Find next", "Find previous", " Replace...", "Go to line..." commands, identical to the commands in the built-in editor.
Patch attached.
TagsNo tags attached.
Attached Files
05-differ-find.diff (19,203 bytes)   
diff --git a/doublecmd-1.0.0.orig/src/fdiffer.lfm b/doublecmd-1.0.0/src/fdiffer.lfm
index c4a845b..8aa4d26 100755
--- a/doublecmd-1.0.0.orig/src/fdiffer.lfm
+++ b/doublecmd-1.0.0/src/fdiffer.lfm
@@ -1093,9 +1093,6 @@ object frmDiffer: TfrmDiffer
         }
         OnClick = actEditDeleteExecute
       end
-      object miDivider9: TMenuItem
-        Caption = '-'
-      end
       object miEditSelectAll: TMenuItem
         Action = actEditSelectAll
         Bitmap.Data = {
@@ -1136,6 +1133,24 @@ object frmDiffer: TfrmDiffer
         }
         OnClick = actEditSelectAllExecute
       end
+      object miDivider9: TMenuItem
+        Caption = '-'
+      end
+      object miFind: TMenuItem
+        Action = actEditFind
+      end
+      object miFindNext: TMenuItem
+        Action = actEditFindNext
+      end
+      object miFindPrevious: TMenuItem
+        Action = actEditFindPrevious
+      end
+      object miReplace: TMenuItem
+        Action = actEditRplc
+      end
+      object miGotoLine: TMenuItem
+        Action = actEditGotoLine
+      end
     end
     object mnuOptions: TMenuItem
       Caption = '&Options'
@@ -1678,6 +1693,40 @@ object frmDiffer: TfrmDiffer
       ImageIndex = 19
       OnExecute = actEditSelectAllExecute
     end
+    object actEditFind: TAction
+      Category = 'Edit'
+      Caption = '&Find'
+      HelpType = htKeyword
+      Hint = 'Find'
+      ImageIndex = 22
+      OnExecute = actExecute
+    end
+    object actEditFindNext: TAction
+      Category = 'Edit'
+      Caption = 'Find next'
+      Hint = 'Find next'
+      OnExecute = actExecute
+    end
+    object actEditFindPrevious: TAction
+      Category = 'Edit'
+      Caption = 'Find previous'
+      OnExecute = actExecute
+    end
+    object actEditRplc: TAction
+      Category = 'Edit'
+      Caption = '&Replace'
+      HelpType = htKeyword
+      Hint = 'Replace'
+      ImageIndex = 23
+      OnExecute = actExecute
+    end
+    object actEditGotoLine: TAction
+      Category = 'Edit'
+      Caption = 'Goto Line...'
+      Hint = 'Goto Line'
+      ImageIndex = 24
+      OnExecute = actExecute
+    end
     object actEditRedo: TAction
       Category = 'Edit'
       Caption = 'Redo'
@@ -1723,7 +1772,7 @@ object frmDiffer: TfrmDiffer
     left = 200
     top = 136
     Bitmap = {
-      4C6916000000100000001000000077856C7C91794D7E8B67386F8B67388C8B67
+      4C6919000000100000001000000077856C7C91794D7E8B67386F8B67388C8B67
       38D48B6738FF8A693DF880714AE57A7858850000000000000000000000000000
       00000000000000000000000000009270425EBB96627ED1AD815DE6CEB1CDEFDF
       D0FFECDBC5FFDFC29BFFA08B68FD886E43FD5A7F6A1B00000000000000000000
@@ -2427,7 +2476,103 @@ object frmDiffer: TfrmDiffer
       00001A00A8FF1F00DCFF5C41E0FF000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
       00003516E8FF0000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000
+      0000000000000000000000000000979B9AFF858A88FF858A88FF858A88FF858A
+      88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF8A8F8DFF0000
+      0000000000000000000000000000878C8AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF858A88FF0000
+      0000000000000000000000000000868B89FFFFFFFFFFEFF0F0FFEFF0F0FFEFF0
+      F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFFFFFFFFF858A88FF0000
+      0000000000000000000000000000878C8AFFFFFFFFFFEFF0F0FFC6C7C7FFC6C7
+      C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFEFF0F0FFFFFFFFFF858A88FF0000
+      0000000000000000000000000000868B89FFFFFFFFFFEFF0F0FFEFF0F0FFEFF0
+      F0FFEFF0F0FFD5D6D6FF808381FF808381FF808381FF808381FF808482FF0000
+      0000000000000000000000000000878C8AFFFFFFFFFFEFF0F0FFC6C7C7FFC6C7
+      C7FFA6A9A8FF808381FFC8BAAEFFD2BCA6FFD4BAA2FFCDB9A8FF808381FF0000
+      0000000000000000000000000000868B89FFFFFFFFFFEFF0F0FFEFF0F0FFD5D7
+      D6FF808381FFC8B7A8FFD2AC8AFFE7D3BFFFEAD7C5FFD9BA9CFFCBAD90FF8083
+      81FF000000000000000000000000878C8AFFFFFFFFFFEFF0F0FFC6C7C7FF8083
+      81FFBBAEA3FFCFA985FFF2E6DCFFF7EEE8FFF5ECE4FFECDACAFFD8B28EFFCBAF
+      97FF808381FF0000000000000000878C8AFFFFFFFFFFEFF0F0FFEFF0F0FF8083
+      81FFD0B8A2FFDFC0A5FFF1E4D9FFF3EAE0FFF2E7DDFFE9D4C1FFDFBEA0FFD0A6
+      81FF808381FF0000000000000000868B89FFFDFEFEFFEFF0F0FFEFF0F0FF8083
+      81FFD6BFA9FFE0C1A5FFEEDED0FFF2E5DAFFEDDCCDFFECD9C8FFE8D0BCFFD1A7
+      80FF808381FF0000000000000000868B89FFF9FAFAFFEFF0F0FFEFF0F0FF8083
+      81FFC3B5A7FFD0AB89FFE5CAB3FFEBD7C3FFEAD4C1FFEEDDCFFFDABDA3FFCEAF
+      93FF808381FF0000000000000000868B89FFFFFFFFFFFFFFFFFFFFFFFFFFCDCF
+      CFFF808381FFD1B89FFFD6B391FFDFC5AFFFE3CAB2FFD6BAA0FFD3B497FF8083
+      81FF737675FF0000000000000000898E8CFF868B89FF858A88FF858A88FF858A
+      88FF7B807EFF808381FFDCC8B3FFCFAC8BFFD1A880FFD0B399FF808381FFA3A4
+      A3FFA3A4A3FF6A6E6CFF00000000000000000000000000000000000000000000
+      0000000000006A6E6CFF808381FF808381FF808381FF808381FF8C8E8DFFB7B8
+      B8FFA3A4A3FFA3A4A3FF828484FF000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000008C8E
+      8DFFB7B8B8FFA3A4A3FF828484FF000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00008C8E8DFF8C8E8DFF828484FF000000000000000000000000000000008083
+      81FF808381FF808381FF00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000808381FFC8BA
+      AEFFD4BAA2FFCCB9A7FF808381FF000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000808381FFC8B7A7FFD1AC
+      8AFFEAD7C5FFD9B99BFFCBAC90FF808381FF838785FF858A88FF858A88FF858A
+      88FF8A8F8DFF000000000000000000000000808381FFBBAEA2FFCFA884FFF2E6
+      DCFFF5ECE4FFECDACAFFD8B18DFFCBB097FF808381FFFFFFFFFFFFFFFFFFFFFF
+      FFFF858A88FF000000000000000000000000808381FFD0B8A2FFDEC0A4FFF1E4
+      D9FFF2E7DDFFEAD5C3FFDFBFA2FFD0A580FF808381FFEFF0F0FFEFF0F0FFFFFF
+      FFFF02598FFF02598FFF0000000000000000808381FFC2B5A7FFD0AA88FFE8D0
+      BBFFEEDCCDFFF3E8DEFFDCC1A8FFCEB094FF808381FFC6C7C7FFEFF0F0FF0259
+      8FFFC6EAEEFF71ADCFFF02598FFF0000000000000000808381FFD1B89FFFD6B3
+      91FFE6D0BBFFD8BEA6FFD3B597FF808381FFD0D2D1FFEFF0F0FF02598FFFC7EB
+      EFFF6AACD2FF5583A1FF02598FFF00000000828484FFA3A4A3FF808381FFDDC8
+      B3FFD1A77FFFD1B499FF808381FF939695FFC6C7C7FF02598FFFC7EBEFFF6AAC
+      D2FF5787A4FF02598FFF00000000828484FFA3A4A3FFB7B8B8FF8C8E8DFF8083
+      81FF808381FF808381FFAFB1B0FFEFF0F0FF02598FFFC5E6EDFF69AACFFF5683
+      A0FF02598FFF0000000000000000828484FFB7B8B8FF8C8E8DFFFFFFFFFFEFF0
+      F0FFC6C7C7FFC6C7C7FFC6C7C7FF02598FFFC4E5EDFF649FC8FF5784A0FF0259
+      8FFF6A8089FF0000000000000000000000008C8E8DFF868B89FFFFFFFFFFEFF0
+      F0FFEFF0F0FFEFF0F0FFEEEFEFFF395B70FF8AABC2FF5585A3FF02598FFFCADC
+      E7FF848987FF00000000000000000000000000000000868B89FFFDFEFEFFEFF0
+      F0FFEFF0F0FFEEEFEFFF02598FFF26424CFF36576BFF02598FFFAFC1CCFFEFEF
+      EFFF7F8482FF00000000000000000000000000000000868B89FFF9FAFAFFEFF0
+      F0FFEFF0F0FFEDEEEEFF000000FF02598FFF96A9B3FFC2C2C2FFCACBCBFFE2E2
+      E2FF7B7F7DFF00000000000000000000000000000000868B89FFFFFFFFFFFFFF
+      FFFFFFFFFFFFFEFEFEFFF7F7F7FFE9E9E9FFE2E2E2FFE5E5E5FFEAEAEAFFEFEF
+      EFFF7F8482FF00000000000000000000000000000000898E8CFF868B89FF858A
+      88FF858A88FF858A88FF848987FF838886FF828785FF838886FF838886FF8388
+      86FF888D8BFF0000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000FFFFFF00BBBBBBFF9B958AFFA09990FF948A
+      7CFF886F4FFF8B6738FF896A40FF7F7253FF858A88FF858A88FF858A88FF858A
+      88FF858A88FFBBBBBBFFFFFFFF00FFFFFF00858A88FFA59C8FFFB2ADA8FFBAA3
+      8FFFBAA38FFFBAA38FFFBAA38FFFCCBBADFF874A20FFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFF858A88FFFFFFFF00FFFFFF00858A88FFBBBBBBFFBBBBBBFF948A
+      7CFF9A7441FF9F7844FFBAA38FFFBAA38FFFCCBBADFF874A20FFB7B7B7FFB7B7
+      B7FFFEFEFEFF858A88FFFFFFFF00FFFFFF00858A88FFD8D8D8FFD8D8D8FFBBBB
+      BBFFFFFFFFFFFFFFFFFF874A20FFBAA38FFFCCBBADFF874A20FFFFFFFFFFFFFF
+      FFFFFEFEFEFF858A88FFFFFFFF00FFFFFF00858A88FFD8D8D8FFD8D8D8FFBBBB
+      BBFFFFFFFFFFBFBFBFFF874A20FFBAA38FFFCCBBADFF874A20FFBFBFBFFFBFBF
+      BFFFFEFEFEFF858A88FFFFFFFF00FFFFFF00858A88FFD8D8D8FF874A20FF874A
+      20FF874A20FF874A20FF874A20FFBAA38FFFCCBBADFF874A20FF874A20FF874A
+      20FF874A20FF874A20FFFFFFFF00FFFFFF00858A88FFD8D8D8FFD8D8D8FF874A
+      20FFBAA38FFFBAA38FFFBAA38FFFB5957AFFB5957AFFB5957AFFB5957AFFCCBB
+      ADFF874A20FF858A88FFFFFFFF00FFFFFF00858A88FFD8D8D8FFD8D8D8FFBBBB
+      BBFF874A20FFBAA38FFFB5957AFFB5957AFFB5957AFFB5957AFFCCBBADFF874A
+      20FFFEFEFEFF858A88FFFFFFFF00FFFFFF00858A88FFD8D8D8FFD8D8D8FFBBBB
+      BBFFFFFFFFFF874A20FFBAA38FFFB5957AFFB5957AFFCCBBADFF874A20FFC8C8
+      C8FFFEFEFEFF858A88FFFFFFFF00FFFFFF00858A88FFD8D8D8FFD8D8D8FFBBBB
+      BBFFFFFFFFFFFFFFFFFF874A20FFBAA38FFFCCBBADFF874A20FFFFFFFFFFFFFF
+      FFFFFEFEFEFF858A88FFFFFFFF00FFFFFF00858A88FFD8D8D8FFD8D8D8FFBBBB
+      BBFFFFFFFFFFD4D4D4FFD4D4D4FF874A20FF874A20FFD4D4D4FFD4D4D4FFD4D4
+      D4FFFEFEFEFF858A88FFFFFFFF00FFFFFF00858A88FFD8D8D8FFD8D8D8FFBBBB
+      BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFEFEFEFF858A88FFFFFFFF00FFFFFF00858A88FFD8D8D8FFD8D8D8FFBBBB
+      BBFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFFFEFEFEFF858A88FFFFFFFF00FFFFFF00858A88FFD8D8D8FFD8D8D8FFBBBB
+      BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFEFEFEFF858A88FFFFFFFF00FFFFFF00858A88FFD8D8D8FFD8D8D8FFBBBB
+      BBFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE
+      FEFFFFFFFFFF858A88FFFFFFFF00FFFFFF00BBBBBBFF858A88FF858A88FF858A
+      88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A
+      88FF858A88FFBBBBBBFFFFFFFF00
     }
   end
   object ContextMenu: TPopupMenu
diff --git a/doublecmd-1.0.0.orig/src/fdiffer.pas b/doublecmd-1.0.0/src/fdiffer.pas
index b4217b6..341583e 100755
--- a/doublecmd-1.0.0.orig/src/fdiffer.pas
+++ b/doublecmd-1.0.0/src/fdiffer.pas
@@ -51,6 +51,11 @@ type
     actEditRedo: TAction;
     actEditSelectAll: TAction;
     actEditPaste: TAction;
+    actEditFind: TAction;
+    actEditFindNext: TAction;
+    actEditFindPrevious: TAction;
+    actEditRplc: TAction;
+    actEditGotoLine: TAction;
     actAbout: TAction;
     actAutoCompare: TAction;
     actLineDifferences: TAction;
@@ -91,6 +96,11 @@ type
     miCutContext: TMenuItem;
     miDeleteContext: TMenuItem;
     miEditSelectAll: TMenuItem;
+    miFind: TMenuItem;
+    miFindNext: TMenuItem;
+    miFindPrevious: TMenuItem;
+    miReplace: TMenuItem;
+    miGotoLine: TMenuItem;
     miDivider9: TMenuItem;
     miEditDelete: TMenuItem;
     miEditPaste: TMenuItem;
@@ -218,6 +228,13 @@ type
     EncodingList: TStringList;
     ScrollLock: LongInt;
     FShowIdentical: Boolean;
+    bSearchBackwards: Boolean;
+    bSearchCaseSensitive: Boolean;
+    bSearchFromCaret: Boolean;
+    bSearchSelectionOnly: Boolean;
+    bSearchWholeWords: Boolean;
+    bSearchRegExp: Boolean;
+    sSearchText, sReplaceText: String;
     FWaitData: TWaitData;
     FCommands: TFormCommands;
     procedure ShowIdentical;
@@ -241,10 +258,18 @@ type
   public
     constructor Create(TheOwner: TComponent); override;
     destructor Destroy; override;
+    procedure DoSearchReplaceText(AReplace: boolean; ABackwards: boolean);
+    procedure ShowSearchReplaceDialog(AReplace: boolean);
+    function GetDisplayNumber(LineNumber: Integer): Integer;
   published
     procedure cm_CopyLeftToRight(const Params: array of string);
     procedure cm_CopyRightToLeft(const Params: array of string);
     procedure cm_Exit(const Params: array of string);
+    procedure cm_EditFind(const Params: array of string);
+    procedure cm_EditFindNext(const Params: array of string);
+    procedure cm_EditFindPrevious(const Params: array of string);
+    procedure cm_EditRplc(const Params: array of string);
+    procedure cm_EditGotoLine(const Params: array of string);
     procedure cm_FirstDifference(const Params: array of string);
     procedure cm_LastDifference(const Params: array of string);
     procedure cm_NextDifference(const Params: array of string);
@@ -262,7 +287,7 @@ implementation
 
 uses
   LCLType, LazFileUtils, LConvEncoding, SynEditTypes, uHash, uLng, uGlobs,
-  uShowMsg, DCClassesUtf8, dmCommonData, DCOSUtils, uConvEncoding;
+  uShowMsg, DCClassesUtf8, dmCommonData, DCOSUtils, uConvEncoding, fEditSearch;
 
 const
   HotkeysCategory = 'Differ';
@@ -727,6 +752,136 @@ begin
   pnlLeft.Width:= (ClientWidth div 2) - (Splitter.Width div 2);
 end;
 
+procedure TfrmDiffer.DoSearchReplaceText(AReplace: boolean;
+  ABackwards: boolean);
+var
+  Options: TSynSearchOptions;
+begin
+  if AReplace then
+  begin
+    Options := [ssoPrompt, ssoReplace, ssoReplaceAll];
+  end
+  else
+  begin
+    Options := [];
+  end;
+  if ABackwards then
+  begin
+    Include(Options, ssoBackwards);
+  end;
+  if bSearchCaseSensitive then
+  begin
+    Include(Options, ssoMatchCase);
+  end;
+  if not bSearchFromCaret then
+  begin
+    Include(Options, ssoEntireScope);
+  end;
+  if bSearchSelectionOnly then
+  begin
+    Include(Options, ssoSelectedOnly);
+  end;
+  if bSearchWholeWords then
+  begin
+    Include(Options, ssoWholeWord);
+  end;
+  if bSearchRegExp then
+  begin
+    Include(Options, ssoRegExpr);
+  end;
+  try
+    if SynDiffEditActive.SearchReplace(sSearchText, sReplaceText, Options) = 0 then
+    begin
+      if ssoBackwards in Options then
+      begin
+        SynDiffEditActive.BlockEnd := SynDiffEditActive.BlockBegin;
+      end
+      else
+      begin
+        SynDiffEditActive.BlockBegin := SynDiffEditActive.BlockEnd;
+      end;
+      SynDiffEditActive.CaretXY := SynDiffEditActive.BlockBegin;
+      msgOK(Format(rsViewNotFound, ['"' + sSearchText + '"']));
+    end;
+  except
+    on E: Exception do msgError(E.Message);
+  end;
+end;
+
+procedure TfrmDiffer.ShowSearchReplaceDialog(AReplace: boolean);
+var
+  dlg: TfrmEditSearchReplace;
+begin
+  dlg := TfrmEditSearchReplace.Create(Self, AReplace);
+  with dlg do try
+    // assign search options
+    SearchBackwards := bSearchBackwards;
+    SearchCaseSensitive := bSearchCaseSensitive;
+    SearchFromCursor := bSearchFromCaret;
+    SearchInSelectionOnly := bSearchSelectionOnly;
+    SearchRegExp := bSearchRegExp;
+    // start with last search text
+    SearchText := sSearchText;
+    // if something is selected search for that text
+    if SynDiffEditActive.SelAvail and (SynDiffEditActive.BlockBegin.Y = SynDiffEditActive.BlockEnd.Y) then
+    begin
+      SearchText := SynDiffEditActive.SelText;
+    end
+    else
+    begin
+      SearchText := SynDiffEditActive.GetWordAtRowCol(SynDiffEditActive.CaretXY);
+    end;
+    SearchTextHistory := glsSearchHistory.Text;
+    if AReplace then
+    with dlg as TfrmEditSearchReplace do
+    begin
+      ReplaceText := sReplaceText;
+      ReplaceTextHistory := glsReplaceHistory.Text;
+    end;
+    SearchWholeWords := bSearchWholeWords;
+    if ShowModal = mrOK then
+    begin
+      bSearchBackwards := SearchBackwards;
+      bSearchCaseSensitive := SearchCaseSensitive;
+      bSearchFromCaret := SearchFromCursor;
+      bSearchSelectionOnly := SearchInSelectionOnly;
+      bSearchWholeWords := SearchWholeWords;
+      bSearchRegExp := SearchRegExp;
+      sSearchText := SearchText;
+      glsSearchHistory.Text := SearchTextHistory;
+      if AReplace then
+      with dlg as TfrmEditSearchReplace do
+      begin
+        sReplaceText := ReplaceText;
+        glsReplaceHistory.Text := ReplaceTextHistory;
+      end;
+      if sSearchText <> '' then
+      begin
+        DoSearchReplaceText(AReplace, bSearchBackwards);
+        bSearchFromCaret:= True;
+        gFirstTextSearch:= False;
+      end;
+    end;
+  finally
+    FreeAndNil(dlg);
+  end;
+end;
+
+function TfrmDiffer.GetDisplayNumber(LineNumber: Integer): Integer;
+var
+  I: Integer;
+begin
+  Result := 1;
+  for I := 0 to SynDiffEditActive.Lines.Count - 1 do
+  begin
+    if SynDiffEditActive.Lines.Number[I] = LineNumber then
+    begin
+      Result := I + 1;
+      Break;
+    end;
+  end;
+end;
+
 procedure TfrmDiffer.BinaryCompareFinish;
 begin
   BinaryCompare:= nil;
@@ -841,6 +996,81 @@ begin
   Close;
 end;
 
+procedure TfrmDiffer.cm_EditFind(const Params: array of string);
+begin
+  if not actBinaryCompare.Checked then
+  begin
+    ShowSearchReplaceDialog(False);
+  end;
+end;
+
+procedure TfrmDiffer.cm_EditFindNext(const Params:array of string);
+begin
+  if not actBinaryCompare.Checked then
+  begin
+    if gFirstTextSearch then
+    begin
+      ShowSearchReplaceDialog(False);
+      Exit;
+    end;
+    if sSearchText <> '' then
+    begin
+      DoSearchReplaceText(False, bSearchBackwards);
+      bSearchFromCaret:= True;
+    end;
+  end;
+end;
+
+procedure TfrmDiffer.cm_EditFindPrevious(const Params: array of string);
+begin
+  if not actBinaryCompare.Checked then
+  begin
+    if gFirstTextSearch then
+    begin
+      bSearchBackwards:=True;
+      ShowSearchReplaceDialog(False);
+      Exit;
+    end;
+    if sSearchText <> '' then
+    begin
+      SynDiffEditActive.SelEnd:=SynDiffEditActive.SelStart;
+      DoSearchReplaceText(False, True);
+      bSearchFromCaret:= True;
+    end;
+  end;
+end;
+
+procedure TfrmDiffer.cm_EditRplc(const Params:array of string);
+begin
+  if not actBinaryCompare.Checked then
+  begin
+    ShowSearchReplaceDialog(True);
+  end;
+end;
+
+procedure TfrmDiffer.cm_EditGotoLine(const Params:array of string);
+var
+  P: TPoint;
+  Value: String;
+  NewTopLine: Integer;
+begin
+  if not actBinaryCompare.Checked then
+  begin
+    if ShowInputQuery(rsEditGotoLineTitle, rsEditGotoLineQuery, Value) then
+    begin
+      P.X := 1;
+      P.Y := GetDisplayNumber(StrToIntDef(Value, 1));
+      NewTopLine := P.Y - (SynDiffEditActive.LinesInWindow div 2);
+      if NewTopLine < 1 then begin
+        NewTopLine := 1;
+      end;
+      SynDiffEditActive.CaretXY := P;
+      SynDiffEditActive.TopLine := NewTopLine;
+      SynDiffEditActive.SetFocus;
+    end;
+  end;
+end;
+
 procedure TfrmDiffer.cm_FirstDifference(const Params: array of string);
 var
   Line: Integer;
diff --git a/doublecmd-1.0.0.orig/src/uglobs.pas b/doublecmd-1.0.0/src/uglobs.pas
index dac1bd7..02a3103 100755
--- a/doublecmd-1.0.0.orig/src/uglobs.pas
+++ b/doublecmd-1.0.0/src/uglobs.pas
@@ -1151,6 +1151,12 @@ begin
   with HMForm.Hotkeys do
     begin
       AddIfNotExists(['Ctrl+R'],[],'cm_Reload');
+      AddIfNotExists([SmkcSuper + 'F' ,'','',
+                      'F7'            ,'',''],'cm_EditFind');
+      AddIfNotExists(['F3'],[],'cm_EditFindNext');
+      AddIfNotExists(['Shift+F3'],[],'cm_EditFindPrevious');
+      AddIfNotExists(VK_H, [ssModifier], 'cm_EditRplc');
+      AddIfNotExists(VK_G, [ssModifier], 'cm_EditGotoLine');
       AddIfNotExists(['Alt+Down'],[],'cm_NextDifference');
       AddIfNotExists(['Alt+Up'],[],'cm_PrevDifference');
       AddIfNotExists(['Alt+Home'],[],'cm_FirstDifference');
05-differ-find.diff (19,203 bytes)   
Fixed in Revision
Operating system
Widgetset
Architecture

Activities

liquidvacuum

2019-09-28 00:12

reporter   ~0003278

Для команды "Заменить..." по умолчанию выбрана горячая клавиша Ctrl+H, поскольку Ctrl+R уже занята для "Перезагрузить". Возможно, горячие клавиши Ctrl+R для "Заменить..." (как во встроенном редакторе) и, например, F5 для "Перезагрузить" были бы более предпочтительны для унификации интерфейса.
Между пунктами меню "Вырезать"/"Копировать"/"Вставить"/"Удалить" и пунктом "Выделить всё" удалён разделитель, т.к. во встроенных просмотрщике и редакторе он также отсутствует. Однако во многих приложениях разделитель между ними присутствует. Возможно, необходимо оставить его, добавить во встроенных просмотрщике и редакторе.

Issue History

Date Modified Username Field Change
2019-09-27 23:25 liquidvacuum New Issue
2019-09-27 23:25 liquidvacuum File Added: 05-differ-find.diff
2019-09-28 00:12 liquidvacuum Note Added: 0003278
2022-04-16 11:26 Alexx2000 Status new => resolved
2022-04-16 11:26 Alexx2000 Fixed in Version => 1.1.0
2022-04-16 11:26 Alexx2000 Resolution open => fixed
2022-04-16 11:26 Alexx2000 Assigned To => Alexx2000