找回密码
 欢迎注册
查看: 162|回复: 5

[分享] mathematica代码替换变量的vim代码

[复制链接]
发表于 2025-4-7 11:15:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
"在mathematica代码中,把AB=3类型的代码,修改成AB=BA=3,线段长度赋值,AB与BA都赋值,这样两个变量都能用了,这样再不用考虑线段的两个端点哪个在前、哪个在后了,后面使用线段长度变量还能增加代码的可读性

  1. "在mathematica代码中,把AB=3类型的代码,修改成AB=BA=3,线段长度赋值,AB与BA都赋值,这样两个变量都能用了,这样再不用考虑线段的两个端点哪个在前、哪个在后了,后面使用线段长度变量还能增加代码的可读性
  2. :menu 259.660 mma.替换变量   :.,$s/\(\([A-Z]\)\([A-Z]\)=\)/\1\3\2=/gec<CR>
复制代码


把这个功能添加到vim的菜单里,从光标所在行替换到最后一行(需要人工确认)
替换前是AB=3这样的代码,
替换后是AB=BA=3这样的代码,
替换时搜索
大写字母大写字母=
这样的模式,
直接点菜单运行这个功能。

代码例子见
https://bbs.emath.ac.cn/forum.ph ... 9966&pid=104959

这样做,不用考虑线段长度变量的变量名两个端点哪个在前、哪个在后了,
后面使用线段长度变量还能增加代码的可读性。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 6 天前 | 显示全部楼层
把BA替换成AB,写代码时用到线段长度变量时,AB与BA两个变量随便用,但是写完代码后,再用编辑器的正则替换(写到菜单里)把BA替换成AB,使得顺序小的A在顺序大的B之前,这样写代码用到线段长度变量时,就不用人工费脑筋考虑A与B哪个在前。同时,还要注意不替换ΔBAC与∠BAC中的BA

我准备考虑再升级一下。
添加这个功能
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 5 天前 | 显示全部楼层
本帖最后由 nyy 于 2025-4-14 09:56 编辑
nyy 发表于 2025-4-13 09:13
把BA替换成AB,写代码时用到线段长度变量时,AB与BA两个变量随便用,但是写完代码后,再用编辑器的正则替换 ...


再次升级功能
"在mathematica代码中,把AB=3类型的代码,修改成AB=BA=3,线段长度赋值,AB与BA都赋值,这样两个变量都能用了,这样再不用考虑线段的两个端点哪个在前、哪个在后了,后面使用线段长度变量还能增加代码的可读性
:menu 259.660 mma.替换变量   :.,$s/\(\([A-Z]\)\([A-Z]\)=\)/\1\3\2=/gec<CR>
"在mathematica代码中,替换线段长度变量,比如把BA替换成AB,写代码时用到线段长度变量时,AB与BA两个变量随便用,但是写完代码后,再用编辑器的正则替换(写到菜单里)把BA替换成AB,使得顺序小的A在顺序大的B之前,这样写代码用到线段长度变量时,就不用人工费脑筋考虑A与B哪个在前。同时,还要注意不替换ΔBAC、∠BAC、变量BACD中的BA
:menu 259.661 mma.线段长度变量BA替换成AB   :.,$s/[A-Za-z]\@<!\([A-Z]\)\([A-Z]\)[A-Za-z0-9]\@!/\=(submatch(1)>submatch(2)?submatch(2).submatch(1):submatch(1).submatch(2))/gec<CR>


  1. "在mathematica代码中,把AB=3类型的代码,修改成AB=BA=3,线段长度赋值,AB与BA都赋值,这样两个变量都能用了,这样再不用考虑线段的两个端点哪个在前、哪个在后了,后面使用线段长度变量还能增加代码的可读性
  2. :menu 259.660 mma.替换变量   :.,$s/\(\([A-Z]\)\([A-Z]\)=\)/\1\3\2=/gec<CR>
  3. "在mathematica代码中,替换线段长度变量,比如把BA替换成AB,写代码时用到线段长度变量时,AB与BA两个变量随便用,但是写完代码后,再用编辑器的正则替换(写到菜单里)把BA替换成AB,使得顺序小的A在顺序大的B之前,这样写代码用到线段长度变量时,就不用人工费脑筋考虑A与B哪个在前。同时,还要注意不替换ΔBAC、∠BAC、变量BACD中的BA
  4. :menu 259.661 mma.线段长度变量BA替换成AB   :.,$s/[A-Za-z]\@<!\([A-Z]\)\([A-Z]\)[A-Za-z0-9]\@!/\=(submatch(1)>submatch(2)?submatch(2).submatch(1):submatch(1).submatch(2))/gec<CR>
复制代码


第一种办法,赋值的变量实在是太多,第二种办法,写代码的时候,随便用变量,写玩代码后,再用编辑器修改成唯一的变量(把BA换成AB,这样就不存在AB与BA两个变量了),
第二种办法的好处是略微牺牲一点可读性、略微减少一点可维护性。
我选择把两种办法都保留

第一种代码的最终效果见例子
https://bbs.emath.ac.cn/forum.ph ... 9966&pid=104959
这种办法是引入了AB BA  x y a b等变量,变量实在是太多,好处是后面的代码的可读性略微高一点点,但是由于引入了 x y a b等变量,求解结果可读性差一些
这种办法办法在写代码的时候轻松一些,毕竟x变量比AB变量少输入字母
第二种代码的最终效果见例子
https://bbs.emath.ac.cn/forum.ph ... 4199&pid=124781
这种办法的好处是AB BA x y a b等变量,只保留了AB,但是由于删除了BA,所以代码可读性略差一点,但是求解结果可读性比较强
这种办法办法在写代码的时候复杂一些,毕竟AB变量比x变量多输入字母

还有一种办法是
https://bbs.emath.ac.cn/forum.ph ... 0072&pid=105014
这种办法,代码可读性略差一些,但是如果注释写好了,最终还是具有可读性的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 4 天前 | 显示全部楼层
nyy 发表于 2025-4-14 09:33
再次升级功能
"在mathematica代码中,把AB=3类型的代码,修改成AB=BA=3,线段长度赋值,AB与BA都赋值,这样两 ...

第2种办法,比如变量名AB,更具有可读性,
但是有时候字母用多了,需要判定诸如
AD与DA两个变量哪个字母在前,这个时候就会导致
写代码的时候人分心思考这类问题,所以我的第2种办法,
就是让人写代码的时候两个变量随便用,等写完了所有的代码,
用编辑器执行替换,把所有的AB与BA全部执行替换,
全部替换成AB,让字母顺序小的在前,字母顺序大的在后,
这样确保了变量的唯一性,同时又不让人分心思考。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 前天 13:55 | 显示全部楼层
再一次将我的代码升级,
这一次只搜索BA这类变量,找到并替换掉
  1. "在mathematica代码中,把AB=3类型的代码,修改成AB=BA=3,线段长度赋值,AB与BA都赋值,这样两个变量都能用了,这样再不用考虑线段的两个端点哪个在前、哪个在后了,后面使用线段长度变量还能增加代码的可读性
  2. :menu 259.660 mma.线段长度变量AB=3替换成AB=BA=3   :.,$s/[A-Za-z]\@<!\(\([A-Z]\)\([A-Z]\)=\)/\1\3\2=/gec<CR>
  3. "在mathematica代码中,替换线段长度变量,比如把BA替换成AB,写代码时用到线段长度变量时,AB与BA两个变量随便用,但是写完代码后,再用编辑器的正则替换(写到菜单里)把BA替换成AB,使得顺序小的A在顺序大的B之前,这样写代码用到线段长度变量时,就不用人工费脑筋考虑A与B哪个在前。同时,还要注意不替换ΔBAC、∠BAC、变量BACD中的BA
  4. :menu 259.661 mma.线段长度变量BA替换成AB   :.,$s/[A-Za-z]\@<!\([A-Z]\)\([A-Z]\)[A-Za-z0-9]\@!/\=(submatch(1)>submatch(2)?submatch(2).submatch(1):submatch(1).submatch(2))/gec<CR>
  5. "下面的或表达式,是两个\\,至于原因不知道,只搜索BA(也就是第一个字母比第二个字母大的情况,AB这种不搜索)
  6. :menu 259.662 mma.线段长度变量只搜索BA并替换成AB    :.,$s/[A-Za-z]\@<!\(B[A]\\|C[A-B]\\|D[A-C]\\|E[A-D]\\|F[A-E]\\|G[A-F]\\|H[A-G]\\|I[A-H]\\|J[A-I]\\|K[A-J]\\|L[A-K]\\|M[A-L]\\|N[A-M]\\|O[A-N]\\|P[A-O]\\|Q[A-P]\\|R[A-Q]\\|S[A-R]\\|T[A-S]\\|U[A-T]\\|V[A-U]\\|W[A-V]\\|X[A-W]\\|Y[A-X]\\|Z[A-Y]\)[A-Za-z0-9]\@!/\=ExchangeIfGreater(submatch(1))/gec<CR>
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 昨天 16:21 | 显示全部楼层
nyy 发表于 2025-4-17 13:55
再一次将我的代码升级,
这一次只搜索BA这类变量,找到并替换掉
  1. function! ExchangeIfGreater(str)
  2.   " 假设输入一定是2个大写字母,省略校验(如需校验可保留len检查)
  3.   let c1 = a:str[0]  " 第一个字符(如 "BA"[0] 是 'B')
  4.   let c2 = a:str[1]  " 第二个字符(如 "BA"[1] 是 'A')
  5.   
  6.   " 直接比较字符大小(Vim中字符比较按ASCII顺序,A=65 < B=66 < ... < Z=90)
  7.   return c1 > c2 ? c2 . c1 : a:str
  8. endfunction
复制代码


忘记把这个函数上传上来了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2025-4-19 07:31 , Processed in 0.033628 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表