【Deepin Linux 下 软开神器Lazarus支持中文变量名的安装方法】

本文主要是介绍【Deepin Linux 下 软开神器Lazarus支持中文变量名的安装方法】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Deepin Linux 下 软开神器Lazarus支持中文变量名的安装方法

  • 前言:
  • 一、下载
  • 二、修改源码
    • 1. 修改 fpc 编译器 源码
    • 2. 修改 Lazarus 源码
  • 三、编译并测试
  • 四、后记

**

前言:

**
国产Linux在美国的打压下迎来了春天,但Linux天生软件很少,开发工具更是寒岑,不擅长GUI 的C++、缓慢的python 、Java、庞大的QT ,麻烦的Electron,又大又慢又贵的.Net, 就没有一个能打的。
没想到1999年出生的开发神器Lazarus2终于成熟,它继承了曾经的王者Delphi的血统,新增大量优点:开源、跨平台、原生编译、优雅简洁、Bug极少,最快的编译和运行速度-没有之一,支持几乎所有OS和CPU(包括咱的龙芯),消耗很少的资源,甚至能跑在树梅派之类的小板板上;虽然它用的Free Pascal 语言十分简洁且强壮,但功能一点不少,语法上支持大部分C++的特性,重载操作符/函数/模板/泛型/接口…
它有多简单?菜鸟我只需花一天不和女神聊天就为神器新增“中文变量名”功能,从此告别迷一样的拼音变量名和蹩脚冗长的英文名。本文在Deepin Linux 15.8 和 20.3 均测试无恙!

一、下载

用GUI 工具fpcupdeluxe下载最方便。
在黑终端直接运行 ./fpcupdeluxe-x86_64-linux进入如下界面
fpcupdeluxe-x86_64-linux界面
设置为中文好看,选择fpc stable 和lazarus 2.2.4版本下载安装。
默认安装在主目录下的fpcupdeluxe中

二、修改源码

感谢网友“秋·风”的神作, 参考后,修改一些bug, 本菜鸟亲自编写的如下2个脚本:
首先是修改编译器fpc , 其次修改ide : lazarus

1. 修改 fpc 编译器 源码

#!/bin/bash
if [ ! -d "./fpcsrc" ];thenecho "./fpcsrc 目录不存在, 请确保有才能执行!"exit 1
fi
sed -i "4054c\ 'A'..'Z',#\$80..#\$FF :" 						./fpcsrc/compiler/scanner.pas
sed -i "4729c\ if (c in ['A'..'Z','a'..'z','_',#\$80..#\$FF]) then " 		./fpcsrc/compiler/scanner.pas
sed -i "4822c\  if not ((c in ['_','A'..'Z','a'..'z',#\$80..#\$FF])) then " 	./fpcsrc/compiler/scanner.pas
sed -i "5456c\ 'a'..'z', #\$80..#\$FF:"							./fpcsrc/compiler/scanner.pas
echo "修改./fpcsrc/compiler/scanner.pas..."sed -i "815c\ Alpha = ['A'..'Z', 'a'..'z', '_',#\$80..#\$FF];" 	./fpcsrc/rtl/objpas/sysutils/sysstr.inc
echo "修改./fpcsrc/rtl/objpas/sysutils/sysstr.inc..."sed -i "1321c\  'a'..'z',#\$80..#\$FF :" 	./fpcsrc/compiler/assemble.pas
echo "修改./fpcsrc/compiler/assemble.pas..."sed -i "96c\  else if not(value_str[i] in ['_','A'..'Z','a'..'z','0'..'9',':',#\$80..#\$FF]) then " ./fpcsrc/compiler/objcutil.pas
echo "修改./fpcsrc/compiler/objcutil.pas..."sed -i "181c\   if (s='') or not (s[1] in ['A'..'Z','a'..'z','_',#\$80..#\$FF]) then " ./fpcsrc/compiler/options.pas
sed -i "184c\   if not (s[I] in ['A'..'Z','a'..'z','0'..'9','_',#\$80..#\$FF]) then " ./fpcsrc/compiler/options.pas
sed -i "2714c\  while (i<length(fn)) and (fn[i+1] in ['a'..'z','A'..'Z','0'..'9','_','-',#\$80..#\$FF]) do " ./fpcsrc/compiler/options.pas
echo "修改./fpcsrc/compiler/options.pas..."sed -i "82c\   Result:=fBuf[fPos] in ['_','A'..'Z','a'..'z',#\$80..#\$FF]; " 	./fpcsrc/rtl/objpas/classes/parser.inc
sed -i "444c\  '_','A'..'Z','a'..'z',#\$80..#\$FF : HandleAlphaNum; " 		./fpcsrc/rtl/objpas/classes/parser.inc
echo "修改./fpcsrc/rtl/objpas/classes/parser.inc..."sed -i "75c\  Result:=pchar(fLine)[fLinePos] in ['_','A'..'Z','a'..'z',#\$80..#\$FF]; " ./fpcsrc/packages/fcl-res/src/dfmreader.pp
echo "修改./fpcsrc/packages/fcl-res/src/dfmreader.pp..."
echo "增加fpc3.2.2对中文支持,全部完成。 若要laz支持中文,请在laz目录下运行sh laz2cn.sh"

把以上代码保存为 fpc2cn.sh , 放在fpcupdeluxe目录下,运行之:

sh fpc2cn.sh

然后用fpcupdeluxe编译,为了防止它下载新代码覆盖我们刚做的修改,注意在“设置”中勾选“仅重新构建”如下图,然后回到主界面,点击“安装fpc”。
如果手动 make 编译 fpc 会导致”没有3.06版本“错误,因为它用自己旧版编译新版,并不像其他语言一样,要用C语言编译器编译。这样的好处是能充分验证自己编译器,大大减少自己的Bug。

勾选仅构建

2. 修改 Lazarus 源码


#!/bin/bash
# sed 后如要引用单引号需要用双引号,引用$需要转意用\$, 单引号内的$不需要转意
if [ ! -d "./lazarus" ];then  #[空格 布尔条件 空格] 必须要有空格, 分号表示一行多指令, 这里是为了接then  echo "./lazarus 目录不存在, 请确保有才能执行!"exit 1
fi# the follow code for linux下Lazarus 2.2.0 GTK2版代码编辑器及SynEdit控件不支持中文输入
sed -i '4a\  {$ifdef linux}' 		./lazarus/components/synedit/lazsyngtk2imm.pas
sed -i '5a\   {$define WITH_GTK2_IM}  {$define LCLGtk2}' 	./lazarus/components/synedit/lazsyngtk2imm.pas
sed -i '6a\  {$endif}' 			./lazarus/components/synedit/lazsyngtk2imm.passed -i '12a\  {$ifdef linux}' 		./lazarus/lcl/interfaces/gtk2/gtk2globals.pp
sed -i '13a\   {$define WITH_GTK2_IM}' 	./lazarus/lcl/interfaces/gtk2/gtk2globals.pp
sed -i '14a\  {$endif}' 			./lazarus/lcl/interfaces/gtk2/gtk2globals.ppsed -i '20a\  {$ifdef linux}' 		./lazarus/lcl/interfaces/gtk2/gtk2widgetset.inc 
sed -i '21a\   {$define WITH_GTK2_IM}' 	./lazarus/lcl/interfaces/gtk2/gtk2widgetset.inc
sed -i '22a\  {$endif}' 			./lazarus/lcl/interfaces/gtk2/gtk2widgetset.inc
sed -i '246a\ if ord(str[0])>127 then im_context_use:=true' ./lazarus/lcl/interfaces/gtk2/gtk2widgetset.inc
sed -i '247a\ else if length(str)>1 Then im_context_use:=true;' ./lazarus/lcl/interfaces/gtk2/gtk2widgetset.inc
echo "修复lazarus在linux搜狗词组只能输入第一个字的Bug..."sed -i '21a\  {$ifdef linux}' 		./lazarus/lcl/interfaces/gtk2/gtk2proc.inc
sed -i '22a\   {$define WITH_GTK2_IM}' 	./lazarus/lcl/interfaces/gtk2/gtk2proc.inc
sed -i '23a\  {$endif}' 			./lazarus/lcl/interfaces/gtk2/gtk2proc.incsed -i '21a\  {$ifdef linux}' 		./lazarus/components/synedit/synedit.inc
sed -i '22a\   {$define Gtk2IME}' 	./lazarus/components/synedit/synedit.inc
sed -i '23a\  {$endif}' 			./lazarus/components/synedit/synedit.inc
echo "解决GTK2版代码编辑器及SynEdit控件不支持中文输入..."sed -i "13c\ unitdir=../../lcl/interfaces/gtk2 ../../packager/units/\$(CPU_TARGET)-\$(OS_TARGET) ../lazutils/lib/\$(CPU_TARGET)-\$(OS_TARGET) ../freetype/lib/\$(CPU_TARGET)-\$(OS_TARGET) ../../lcl/units/\$(CPU_TARGET)-\$(OS_TARGET) ../../lcl/units/\$(CPU_TARGET)-\$(OS_TARGET)/\$(LCL_PLATFORM) . " ./lazarus/components/synedit/Makefile.fpc
#synedit/Makefile.fpc 13行修改加入../../lcl/interfaces/gtk2 到 unitdir= ../../packager/...” 中
# 再执行 fpcmake 帮我们生成新的makefile. 否则编译时会出现找不到gtk2globals
fpcmake ./lazarus/components/synedit/Makefile.fpc
echo "修改./lazarus/components/synedit/Makefile.fpc 生成新的makefile"# lazarus linux使用StringGrid和DBGrid等控件时,如果内容包含#13时会出现乱码
sed -i '1311a\ i:integer; ' 					./lazarus/lcl/interfaces/gtk2/gtk2devicecontext.inc
sed -i '1321a\ for i:=0 to length(AText)-1 do ' 		./lazarus/lcl/interfaces/gtk2/gtk2devicecontext.inc
sed -i '1322a\   if ord(AText[i])<32 Then AText[i]:=#32; ' 	./lazarus/lcl/interfaces/gtk2/gtk2devicecontext.inc
echo "解决Grid等控件时,如果内容包含#13时会出现乱码..."# 支持中文标识符
echo "增加支持中文标识符..."
sed -i "851c\ IsIdentStartChar[c]:=c in ['a'..'z','A'..'Z','_',#\$80..#\$FF];" 	./lazarus/components/codetools/keywordfunclists.pas
sed -i "852c\ IsIdentChar[c]:=c in ['a'..'z','A'..'Z','_','0'..'9',#\$80..#\$FF];" ./lazarus/components/codetools/keywordfunclists.pas
echo "修改./lazarus/components/codetools/keywordfunclists.pas..."#sed -i lazarus/lcl/interfaces/gtk2/gtk2winapi.inc
sed -i "1167c\ '_','A'..'Z','a'..'z',#\$80..#\$FF: " 	./lazarus/components/codetools/customcodetool.pas
sed -i '1342c\  { #192..#255: ' 				./lazarus/components/codetools/customcodetool.pas
sed -i '1365c\  end; } ' 					./lazarus/components/codetools/customcodetool.pas
sed -i "1621c\  'A'..'Z','a'..'z',#\$80..#\$FF: " 	./lazarus/components/codetools/customcodetool.pas
echo "修改./lazarus/components/codetools/customcodetool.pas"sed -i "720c\  if not (Name[i] in ['0'..'9','_','a'..'z','A'..'Z',#\$80..#\$FF]) then " 	./lazarus/lcl/lresources.pp
sed -i "1344c\  if (not (c in ['a'..'z','A'..'Z','0'..'9','_',#\$80..#\$FF])) then " 	./lazarus/lcl/lresources.pp
sed -i "2039c\  if c in ['a'..'z','A'..'Z','0'..'9','_',#\$80..#\$FF] then " 		./lazarus/lcl/lresources.pp
sed -i "2083c\  and (LFMSource[p] in ['a'..'z','A'..'Z','0'..'9','_',#\$80..#\$FF]) do " ./lazarus/lcl/lresources.pp
sed -i "2091c\  and (LFMSource[p] in ['a'..'z','A'..'Z','0'..'9','_',#\$80..#\$FF]) do " ./lazarus/lcl/lresources.pp
sed -i "2099c\  and (LFMSource[p] in ['a'..'z','A'..'Z','0'..'9','_',#\$80..#\$FF]) do " ./lazarus/lcl/lresources.pp
sed -i "5465c\ Result:=fBuf[fPos] in ['_','A'..'Z','a'..'z',#\$80..#\$FF]; " 		./lazarus/lcl/lresources.pp
sed -i "5777c\  '_','A'..'Z','a'..'z',#\$80..#\$FF : HandleAlphaNum; " 			./lazarus/lcl/lresources.pp
echo "修改./lazarus/lcl/lresources.pp..."sed -i "1420c\   Alpha = ['A'..'Z', 'a'..'z', '_',#\$80..#\$FF]; " 	./lazarus/components/lazutils/lazstringutils.pas
echo "修改./lazarus/components/lazutils/lazstringutils.pas..."sed -i "4927c (Result[I] in ['a'..'z', 'A'..'Z', '_',#\$80..#\$FF]) or " ./lazarus/components/ideintf/propedits.pp
echo "修改./lazarus/components/ideintf/propedits.pp..."
echo "laz2.2.4修改bug和汉化全部完成。另外需要运行sh fpc2cn.sh修改fpc3.2.2"

该脚本保存为 laz2cn.sh, 终端中进入目录运行之:

cd ~/fpcupdeluxe
sh laz2cn.sh

眨眼就结束,结果如图:
修改源码结果

三、编译并测试

重新编译,为了简单,因为fpc已经OK了,我们就直接用命令编译:

cd lazarus
make all

简单吧,哈哈哈!
在我的8年前的联想X250电脑上只需几分钟,编译完成如下图:
编译完成
完成后,桌面自动生成了快捷图标,美丽的花豹!双击运行。
填入测试代码如下图:
测试中文变量名
我这里的变量和控件名都用了中文!
用快捷 F9 编译运行如下:
运行结果

四、后记

自己动手快速为一个大型开发工具新增“中文变量名”支持功能,在以前依赖别人的商品软件时代是不可想象的。我从未见过如此厚颜NB 之物,现在你就见到咯,它就是开源的Lazarus !
现在我正在用它为客户开发一套跨平台的中文软件,速度快得惊人,我可以直接用它写需求分析模型,让用户立马可见所期望的软件模样…。
别人996加班写bug找bug,有了它,我就可自由吃饭游泳打东东!

这篇关于【Deepin Linux 下 软开神器Lazarus支持中文变量名的安装方法】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/425414

相关文章

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

Win安装MySQL8全过程

《Win安装MySQL8全过程》:本文主要介绍Win安装MySQL8全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Win安装mysql81、下载MySQL2、解压文件3、新建文件夹data,用于保存数据库数据文件4、在mysql根目录下新建文件my.ini

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依