Lazarus在Linux上不支持输入中文的解决办法

admin 2022-1-13 97149

=======================================

方法一(未验证)

=======================================

原文 :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 上完成。希望早日听到这个问题完美解决。



最新回复 (0)
返回