写点什么

如何让 Sublime Text 编辑器支持新的 ABAP 关键字

作者:Jerry Wang
  • 2021 年 11 月 23 日
  • 本文字数:1455 字

    阅读完需:约 5 分钟

如何让 Sublime Text 编辑器支持新的 ABAP 关键字

BAP 7.40 推出了许多新的关键字 - keyword,您的 Sublime Text 可能无法针对这些新关键字实现期望的语法高亮显示(syntax highlight)或者自动完成(auto completion)。


实际上只需手动修改 Sublime Text 安装目录下的 DataPackagesABAP 里的两个文件就能保证对于 SAP ABAP Netweaver 新推出的关键字,也能支持语法高亮显示和自动完成:


1. ABAP.tmLanguage

例如增加对 REDUCE 关键字的支持:


2. ABAP.sublime-completions

将期望支持自动完成功能的关键字维护进这个文件的对应位置即可。



测试:REDUCE 这个新关键字能够自动完成,输入完成之后呈自动高亮状态。




有同事问这个问题:lv_s 是从 int4 转过来的,长度为 2,和硬编码的 lv_s2(长度为 1)相比,后面多了个空格。



为什么?查 SAP ABAP 的编程帮助 F1 help。


帮助文档说的很清楚了:如果赋值操作的目的字段(Target 字段),即赋值号的左边操作数的类型为 string,如果赋值之前的整数是负数,则在赋值后的字符串变量尾部增添一个"-"负号,否则增添一个空白符(blank)。



同样,在这个 help 的附近,解释了为什么把 line 4 的类型从 string 改成 sstring 之后,长度一下就变成 20 的原因:



类似这种 ABAP 赋值操作的隐式类型转换和显式类型转换在实际编程开发工作中也要注意。

需求就是我用 ABAP 的某个函数从数据库读取一个字符串出来,该字符串的内容是一个网页。


网页的 form 里包含了很多隐藏的 input field。我的任务是解析出 name 为 svyValueGuid 的 input field 的值:FA163EEF573D1ED89E89C7FE5E7C4715



最简单粗暴的做法是:利用 ABAP 的 FIND FIRST OCCURRENCE 关键字首先找到 svyValueGuid 的偏移量,然后从这个偏移量出发,再找到第一个>的偏移量,这样问题就化简为在子串 type="hidden" value="FA163EEF573D1ED89E89C7FE5E7C4715",这样问题就简单多了。但是这种办法比较笨重,代码很冗余。


有没有更快捷的办法呢?那就是使用 ABAP regular expression,即正则表达式。


请看下列的测试代码:


REPORT ztest_interface.
DATA: lv_input TYPE string,
reg_pattern TYPE string.
lv_input = `<body>` &&
`<div class="Title">Jerry's Programming Skill survey</div>` &&
`<form action="Survey.htm?sap-client=001">` &&
`<input name="svyApplicationId" type="hidden" value="CRM_SURVEY_ACTIVITY">` &&
`<input name="svyValueGuid" type="hidden" value="FA163EEF573D1ED89E89C7FE5E7C4715">` &&
`<input name="SurveyId" type="hidden" value="JERRY_TEST">` &&
`<div Id="" class="Section1">` && `</form></body>`.
reg_pattern = '.*svyValueGuid(?:.*)value="(.*)">.*SurveyId.*'.
TRY.
DATA(lo_regex) = NEW cl_abap_regex( pattern = reg_pattern ).
DATA(lo_matcher) = lo_regex->create_matcher( EXPORTING text = lv_input ).
IF lo_matcher->match( ) <> abap_true.
WRITE:/ 'fail in input scan!'.
RETURN.
ENDIF.
DATA(lt_reg_match_result) = lo_matcher->find_all( ).
READ TABLE lt_reg_match_result ASSIGNING FIELD-SYMBOL(<match>) INDEX 1.
READ TABLE <match>-submatches ASSIGNING FIELD-SYMBOL(<sub>) INDEX 1.
data(lv_sub) = lv_input+<sub>-offset(<sub>-length).
WRITE:/ 'result: ', lv_sub.
CATCH cx_root INTO DATA(cx_root).
WRITE:/ cx_root->get_text( ).
RETURN.
ENDTRY.
复制代码


执行结果:



解决问题的核心思路是这个正则表达式:*.svyValueGuid(?:.)value="(.)">.SurveyId.


通过捕获分组操作符,一对小括号,将 32 位的 GUID 值进行捕获。这种解法比 FIND FIRST OCCURANCE 的代码量要少。

发布于: 58 分钟前阅读数: 5
用户头像

Jerry Wang

关注

个人微信公众号:汪子熙 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。

评论

发布
暂无评论
如何让 Sublime Text 编辑器支持新的 ABAP 关键字