登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: [delphi/lazarus] lazarus 调试自身及随时代码提示的实现     [回主站]     [分站链接]
标题
[delphi/lazarus] lazarus 调试自身及随时代码提示的实现
clq
浏览(334) + 2023-07-24 11:15:38 发表 编辑

关键字:

[delphi/lazarus] lazarus 调试自身及随时代码提示的实现

3,4 年前的实现了,备份记录一下。

“随时代码提示”这个不知道如何翻译,现象是:现在的 ide 基本上是按一个键就会弹出代码提示,而 delphi/lazarus 这样老一点的 ide 是要打一个 "." 才提示的,其实只要将 lazarus 的源码稍微修改一下就可以也实现这样的提示。

以下是好几个文件的合并,未整理。

----------------------------------------------------------------
40.2.可以编译调试lazarus自身.txt



可以用上一版本的 lazarus 调试它自身,不过版本间控件有时候会很不相同。所以要在
path -> othre unit .. 中加入以下路径


frames;..\converter;..\debugger;..\debugger\frames;..\packager;..\designer;..\packager\frames;..\ide;..\components;..\components\ideintf;..\lcl;..\lcl\interfaces\win32;..\lcl\widgetset;..\lcl\forms;..\components\lazcontrols;..\components\debuggerintf;..\components\synedit;..\components\lazdebuggergdbmi;..\components\lazutils;..\components\codetools


include 目录中有可能要加入

include;..\lcl\include;include\win64


工程项目在源码目录中的
D:\test1\la_src\ide

原始运行时没有编译动作,要修改项目属性的
Compiler Commands->Compiler->Call on->Run

设置好后编译还是非常快,而且很容易成功的。

----------------------------------------------------------------
自动提示可以修改以下地方实现,不过最后的结果还是无法和 cnpack 的相比。
原理就是弹出代码提示窗口,默认是用 快捷键 ctrl+space 弹出的那个。个人感觉还是用原版算了,将快捷键改成 alt+space 就比较好用了。

procedure TSourceEditor.ProcessCommand(Sender: TObject;
var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer);
// these are normal commands for synedit (lower than ecUserFirst),
// define extra actions here
// for non synedit keys (bigger than ecUserFirst) use ProcessUserCommand
var
AddChar: Boolean;
s: String;
i: Integer;
begin
//DebugLn('TSourceEditor.ProcessCommand Command=',dbgs(Command));
FSharedValues.SetActiveSharedEditor(Self);
AutoStartCompletionBoxTimer.AutoEnabled:=false; //clq 2020 要在项目的 include path 中加入 D:\test1\la_src\ide\include\win64 才可以编译 //ll
...



//----------------------------------------------------------------
//clq 2020 代码弹出测试
//StartIdentCompletionBox(CodeToolsOpts.IdentComplJumpToError,true);
////StartIdentCompletionBox(False, False); //ok!!!

//让它按任意键(字符、数字)时都能弹出代码提示
if (Command=ecChar) and (AChar>='0') then //其实还可以更详细的进行控制
begin

StartIdentCompletionBox(False, False); //ok!!!
//StartIdentCompletionBox(False, True); //参数上不知道会有什么区别

end;


//----------------------------------------------------------------

//debugln('TSourceEditor.ProcessCommand B IdentCompletionTimer.AutoEnabled=',dbgs(AutoStartCompletionBoxTimer.AutoEnabled));
end;

----------------------------------------------------------------
40.4.代码完成框是synedit控件中的并不是la中的.txt


40.4.代码完成框是synedit控件中的并不是la中的


从以下代码中的 Editor 定义就可以看到,它是跳转到 syn 中了。


procedure TSourceEditor.StartIdentCompletionBox(JumpToError,
CanAutoComplete: boolean);
var
I: Integer;
TextS, TextS2: String;
LogCaret: TPoint;
UseWordCompletion: Boolean;
Completion: TSourceEditCompletion;
CompletionRect: TRect;
begin
{$IFDEF VerboseIDECompletionBox}
debugln(['TSourceEditor.StartIdentCompletionBox JumpToError: ',JumpToError]);
{$ENDIF}
if (FEditor.ReadOnly) then exit; //clq 2020 好像这个就是代码提示弹出控制
Completion := Manager.DefaultCompletionForm;
if (Completion.CurrentCompletionType<>ctNone) then exit;
Completion.IdentCompletionJumpToError := JumpToError;
Completion.CurrentCompletionType:=ctIdentCompletion;
TextS := FEditor.LineText;
LogCaret:=FEditor.LogicalCaretXY;
Completion.Editor:=FEditor;

>>
所以可以利用 synedit CommandProcessed 事件来完整输入任意字符都弹出代码完成框的功能。

procedure TSourceEditor.UserCommandProcessed(Sender: TObject;
var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer);
// called after the source editor processed a key
var Handled: boolean;
begin
Handled:=true;
case Command of

ecNone: ;

ecChar:
begin
if AutoBlockCompleteChar(AChar) then
Handled:=true;
if EditorOpts.AutoDisplayFunctionPrototypes then
if (aChar = '(') or (aChar = ',') then
SourceNotebook.StartShowCodeContext(False);

//clq 2020 似乎可以当做 synedit 的 CommandProcessed 事件

if (AChar<>' ') //忽略空格
and(AChar<>';') //忽略分号
then
StartIdentCompletionBox(False, False); //ok!!!
end;

else
begin
Handled:=false;
if FaOwner<>nil then
TSourceNotebook(FaOwner).ParentCommandProcessed(Self,Command,aChar,Data,
Handled);
end;
end;
if Handled then Command:=ecNone;
end;


//----------------------------------------------------------------
//clq 2020 代码弹出测试
//StartIdentCompletionBox(CodeToolsOpts.IdentComplJumpToError,true);
////StartIdentCompletionBox(False, False); //ok!!!

//让它按任意键(字符、数字)时都能弹出代码提示
if (Command=ecChar) and (AChar>='0') then //其实还可以更详细的进行控制
begin
//TextS := FEditor.LineText;

//FEditor.LineText := FEditor.LineText + AChar; AChar := #0; //这样不行,会导致编辑器内容混乱,还是应该找到编辑器修改完内容后的事件

////StartIdentCompletionBox(False, False); //ok!!!
//StartIdentCompletionBox(False, True); //参数上不知道会有什么区别

//在这里弹出的话,AChar 会被代码完成框忽略,所以还要再想办法//按道理 synedit CommandProcessed 事件后会有完整的内容 //目前是换到 UserCommandProcessed 来完成,比较好用了
end;

----------------------------------------------------------------
40.5.如果设置错误32位的lazarus也调试不了32位的exe.txt

40.5.如果设置错误32位的lazarus也调试不了32位的exe





$(LazarusDir)\mingw\$(TargetCPU)-$(TargetOS)\bin\gdb.exe

代替
D:\new\lazarus64\mingw\x86_64-win64\bin\gdb.exe

>>
如果不是自己带的,则为
D:\new\lazarus64\mingw\$(TargetCPU)-$(TargetOS)\bin\gdb.exe

这些变量最好是安装一个官方的 lazarus (最好是64位)来对比,如果出错,十有八九是这些参数写死了,没有用 la 预定义变量。














总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1