=======================================
方法一(未验证)
=======================================
原文 :http://www.fpccn。com/thread-22647-1-1.html
=======================================
linux下Lazarus 2.2.0 GTK2版代码编辑器及SynEdit控件不支持中文输入,长期困扰着使用中文的开发者,需然网上已有解决方案,但并不是最佳的解决办法,跟踪源码后发现,只需将这5个文件按下面的方法添加{$define WITH_GTK2_IM}和{$define Gtk2IME}就能完美修复不支持中文输入的bug,修改后需重新编译lazarus。
新的lazarus和synedit控件在linux已能正常输入中文(在银河麒麟使用搜狗输入法有个小问题,词组时只有第一个字能输入,其他输入法词组使用正常)。
适用lazarus版本:lazarus 2.2.0 FPC 3.2.2
适用平台:x86和ARM 64 linux 【银河麒麟(CPU为麒麟990)和树莓派】
不适用平台:其他CPU的Linux未测试
修改方法很简单,这4个文件,添加:
lazarus/components/synedit/lazsyngtk2imm.pas
lazarus/lcl/interfaces/gtk2/gtk2globals.pp
lazarus/lcl/interfaces/gtk2/gtk2widgetset.inc
lazarus/lcl/interfaces/gtk2/gtk2proc.inc
{$ifdef linux}
{$define WITH_GTK2_IM}
{$endif}
再修改:
lazarus/components/synedit/synedit.inc添加
{$ifdef linux}
{$define Gtk2IME}
{$endif}
修改完成后重新编译lazarus。
==========================================
方法二(已验证)
==========================================
原文:https://www.cnblogs.com/qiufeng2014/p/15640889.html
===========================
在Linux环境下,Lazarus不支持中文输入。这是一个臭名昭著的Bug,其根源为Lazarus所使用的SynEdit的问题。
在网上找到一个比较好的解决,记录如下。
1. 我是用fpcupdeluxe安装的Lazarus,打开/home/pi/fpcupdeluxe/lazarus/ide/sourceeditor.pp。
2. 在界面下方放下一个TPanel, 里面放下一个TLabel,一个TEdit,适当安排界面,如下图。
3. 在源码里面查找InsertCVSKeyword,会先找到这么一行
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);
begin
if ReadOnly then Exit;
FEditor.InsertTextAtCaret(AKeyWord);
end;
这样,就给TSourceEditor增加了一个叫“InsertKeyword”的过程,作用是可以通过编程语句在光标所在位置添加指定字符串。
4. 界面上新加的Edit在onKeyPress,输入以下语句:
procedure TSourceNotebook.Edit1KeyPress(Sender: TObject; var Key: char);
begin
if key=#13 then
begin
GetActiveSE.InsertKeyword(Edit1.text);
Edit1.Text:='';
FocusEditor;
end;
end;
这样,需要输入汉字时转到下面输入,然后点一下按钮,就自动添到上面源程序光标所在位置,并且将输入焦点转到上面源程序里面。
最后重新编译Lazarus。
在树梅派和银河麒麟arm 64测试通过。
2021-12-06更新:
更便捷的方法是在需要插入中文的位置按Ctrl+Enter键,修改方法如下:
打开SourceEditor.pp,在TSourceNotebook.FormKeyDown增加下面的代码,然后重新编译lazarus就可以
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;
在需要的位置按Ctrl+Enter弹出输入框:
========================
下面是一个简易的修改脚本(add_chinese_input_to_lazarus.sh):
#!/bin/bash
get_char()
{
SAVEDSTTY=`stty -g`
stty -echo
stty cbreak
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty echo
stty $SAVEDSTTY
}
pause()
{
# 启用功能的开关 1开启|其它不开启
enable_pause=1
# 判断第一个参数是否为空,约定俗成的写法
if [ "x$1" != "x" ]; then
echo $1
fi
if [ $enable_pause -eq 1 ]; then
# echo "Press any key to continue!"
echo "按任意键继续..."
char=`get_char`
fi
}
echo ===============================================================
echo =
echo = 本脚本给运行于Linux上的Lazarus的代码编辑器增加中文输入功能
echo =
echo = 用法:
echo =
echo = 把该脚本保存在lazarus所在目录,然后执行
echo =
echo = sh ./add_chinese_input_to_lazarus.sh
echo =
echo = ---------------------------------------------------------------
echo =
echo = 请注意:
echo =
echo = 该脚本不能重复执行,在执行前请先确认是首次执行
echo =
echo = 如果中止执行请按 Ctrl + C 退出
echo =
echo ===============================================================
pause
sed -i 's/{$mode objfpc}{$H+}/{$mode objfpc}{$H+}\n\n{$ifdef linux}\n {$define WITH_GTK2_IM}\n{$endif}/g' lazarus/components/synedit/lazsyngtk2imm.pas
sed -i 's/{$mode objfpc}{$H+}/{$mode objfpc}{$H+}\n\n{$ifdef linux}\n {$define WITH_GTK2_IM}\n{$endif}/g' lazarus/lcl/interfaces/gtk2/gtk2globals.pp
sed -i 's/{$IFNDEF USE_GTK_MAIN_OLD_ITERATION}/{$ifdef linux}\n {$define WITH_GTK2_IM}\n{$endif}\n\n{$IFNDEF USE_GTK_MAIN_OLD_ITERATION}/g' lazarus/lcl/interfaces/gtk2/gtk2widgetset.inc
sed -i 's/{off $DEFINE VerboseUpdateSysColorMap}/{off $DEFINE VerboseUpdateSysColorMap}\n\n{$ifdef linux}\n {$define WITH_GTK2_IM}\n{$endif}/g' lazarus/lcl/interfaces/gtk2/gtk2proc.inc
sed -i 's/{$DEFINE SYNEDIT_INCLUDE}/{$ifdef linux}\n {$define Gtk2IME}\n{$endif}\n\n{$DEFINE SYNEDIT_INCLUDE}/g' lazarus/components/synedit/synedit.inc
echo
echo
echo 代码更改完毕,请启动lazarus,然后从菜单 “Tools” --> "Build Lazarus with Profile: Normal IDE" 重新编译Lazarus,以使修改生效。
echo
===========================================
第四种办法(与第一种相同原理,只是不需要改代码):
Lazarus 中文输入法的本质问题是其代码编辑窗口使用的SynEdit控件在 Linux 操作系统下的处理逻辑问题。目前可以通过以下步骤解决不能输入的问题:
1、进入工具菜单中的配置构建 Lazarus 选项。
2、在弹出的对话框中,选择目标操作系统 Linux,目标 CPU x86_64。
3、选择编辑定义,添加定义:WITH_GTK2_IM 和 Gtk2_IME。然后选中这两个定义。
4、选择构建重新编译IDE。
5、重启IDE就可能以输入中文了。默认的字体可能中文显示不太理想,自己调整下。
存在的问题:
只能单字输入,输入词组时,只有首个字符输入,后面的全被丢了。
自带的 SynEdit 组件仍然输入不了中文的,应该需要相应的条件重新编译,不过大家还是算了,毕竟不用它也没啥大不了。TMemo 一类的控件中文输入是没有问题的。
因为上述原因,我们只能认为这块是个半成品。如果真正解决问题,还是得人修改 SynEdit 的源码。
这个解决方案参考秋雨的博客,只是这样就不用修改源码文件。
实际测试在 DeepinLinux 20.4+Lazarus 2.2.0 上完成。希望早日听到这个问题完美解决。