eW0n9悟空
deepin
2020-03-04 22:38 接上贴
2.4,解决Lazarus的一个重大BUG!
当你切身使用lazarus后,会发现在代码编辑区,是无法切换到中文输入法的,无法正常用键盘输入中文,但可以别的地方(比如记事本)复制一串中文粘贴进去,而且lazarus的各种文本控件是可以正常接受中文输入的,唯独在代码编辑区有bug,网上搜索一番后发现这个bug是从原始时代就存在的,lazarus的代码编辑器是用的synEdit组件,开发者老外不用输入法,所以这个问题是专门留给我们东方人的-_-!
2.4.1,那么问题来了,如何解决呢?参照网上网友(感谢http://blog.sina.com.cn/s/blog_b36b1ed90101fceg.html)们的多种方式,现综合起来研究出一个相对简洁的办法:在代码编辑时,若到了需要输入中文字符串的地方,按Ctrl+回车键,此时代码框上方会弹出一个InputBox,输入相应中文内容后,直接回车或点击OK键,内容就会自动插入到代码中,下面是按下Ctrl+Enter后的效果图及点击OK后的效果图,可以看到,中文已经比较方便的插入到合适的位置:


(细心的网友可能也已发现上图中插入的中文与字母代码不是等高的,看着很怪异,这是由字体不合适造成的,后面第3.4章节专门提供了解决办法)
2.4.2,具体是如何实现上面的效果的呢?参见以下方法及代码:
(1)用Lazarus打开/usr/share/lazarus/2.0.6/ide/sourceeditor.pp
(2)在源码里面查找InsertCVSKeyword,会先找到这么一行:
procedure InsertCVSKeyword(const AKeyWord: string);
procedure InsertCVSKeyword(const AKeyWord: string);
在这一行下面加上一行:
procedure InsertKeyword(const AKeyWord: string);F3继续找其实现,找到以下代码:
procedure TSourceEditor.InsertCVSKeyword(const AKeyWord: string);begin
if ReadOnly then Exit;
FEditor.InsertTextAtCaret('$'+AKeyWord+'$'+LineEnding);
end;
复制它们,在下面粘贴,并改成:
procedure TSourceEditor.InsertKeyword(const AKeyWord: string);
beginprocedure TSourceEditor.InsertKeyword(const AKeyWord: string);
if ReadOnly then Exit;
FEditor.InsertTextAtCaret(AKeyWord);
end;
这样,就给TSourceEditor增加了一个叫“InsertKeyword”的过程,作用是可以通过编程语句在光标所在位置添加指定字符串。
下面,要实现的就是Ctrl+Enter的功能,我们要在代码编辑器窗口的OnKeyDown事件中下手:

procedure TSourceNotebook.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var _sInS: string; begin if (ssCtrl in Shift) and (Key = 13) then begin Key := 0; _sInS := Trim(InputBox('插入文本', '', '')); if _sInS<> '' then begin GetActiveSE.InsertKeyword(_sIns); FocusEditor; end; end; end; |
注:我在改的时候遇到的问题是SourceEditor.pp无法保存,提示说文件是只读属性,这个简单,把/usr/share/lazarus/2.0.6/ide/sourceeditor.pp鼠标右键,权限里把[只读]改成[读写]就能保存了。
改好代码保存就OK了,最后参照第2.3步,将lazarus重新编译一下,即可体验比较方便的中文输入方法了。
Reply Like 0 View the author


中文 











