如图大纲=4.2.2=显示出错,最后一个2上出现一个紫色的框框,而且整句的颜色高亮也不对。
有没有哪位大师兄知道是怎么回事?
如图大纲=4.2.2=显示出错,最后一个2上出现一个紫色的框框,而且整句的颜色高亮也不对。
有没有哪位大师兄知道是怎么回事?
orgmode 是会出现这种问题的,因为染色全凭正则,可能你输入的哪段话超出了现有正则表达式的范围,然后就造成这种车祸了
如果想要知道到底是哪一个正则的问题,需要一个 debug 工具 font-lock-studio
edit:
补充链接
我遇到这种问题一般都是无视它,除非导出的时候出错才调查原因,因为这个也不是小概率的情况。当然我理解强迫症遇到这种情况一定特难受
提供一个能重现该问题的例子会很有帮助。
如下是我的大纲
* 第四章 指针和数组
** 4.2 数组
*** 4.2.1 数组的内存分布
*** 4.2.3 数组名a作为左值和右值的区别
** 4.3 指针和数组之间的恩恩怨怨
*** 4.3.2 a和&a的区别
** 4.4 指针数组和数组指针
*** 4.4.3 再论a和&a之间的区别
其在我的emacs上显示情况如图,其中有紫色框框的是显示错误的:
只有大纲是不能够 debug 的,因为造成染色失败的显然是你的正文
如果你不想把整个文档都贴出来,最好的办法就是用 font-lock-studio 去诊断问题
我的全文如下
* 第四章 指针和数组
** 4.2 数组
*** 4.2.1 数组的内存分布
我们定义一个数组a时,编译器根据指定的元素个数和元素类型分配确定大小(元素类型大小×元素个数)的一块内存,并把这个内存的名字命名为a
sizeof(a)的值为sizeof(int)*5,32位系统下为20。
sizeof(a[0])的值为sizeof(int),32位系统下为4。
sizeof(&a[0])的值在32位系统下为4,取元素a[0]的首地址
sizeof(&a)的值在32位系统下为4,取数组a的首地址(地址都是4字节表示的)
*** 4.2.2 省政府和市政府的区别——&a[0]和&a的区别
&a[0]是数组首元素的地址,&a是数组的首地址。
虽然二者值一样,但是意义不一样
#+BEGIN_SRC C
#include <stdio.h>
int main() {
int a[5] = {1,2,3,4,5};
printf("%x, %x\n", &a, &a[0]);
printf("%x, %x", (&a+1), (&a[0]+1));
return 0;
}
output:
1c4661e0, 1c4661e0
1c4661f4, 1c4661e4
#+END_SRC
*** 4.2.3 数组名a作为左值和右值的区别
a作为右值时代表的含义和&a[0]一样,代表的是数组元素的首地址,而不是数组的首地址。(在用表达式sizeof(a)中时,a表示的是数组名,此时a并没有被用作右值)
注意,这仅仅是代表,并没有一个地方来存储这个地址,也就是说编译器并没有为数组a分配一块内存来存储其地址。
*a不能作为左值!* 编译器会认为数组名作为左值代表的意思是a的首元素的首地址,但是这个地址开始的一块内存是一个总体,我们只能访问数组的某个元素,而无法把数组当一个整体进行访问。
** 4.3 指针和数组之间的恩恩怨怨
*** 4.3.2 a和&a的区别
#+BEGIN_SRC C
int main() {
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a+1);
printf("%d, %d", *(a+1),*(ptr-1));
return 0;
}
output:
2, 5
#+END_SRC
*解析:*
对指针进行加1操作,得到的是下一个元素的地址,而不是原有地址值直接加1.
因此,一个类型为T的指针的移动,以~sizeof(T)~为移动单位。
对上题来说,a是一个一维数组,数组有5个元素;ptr是一个int型的指针。
=&a+1= :取数组a的首地址,在该地址的值上加上sizeof(a)的值,即 =&a+5*sizeof(int)=,也就是下一个数组的首地址,当然当前指针已经越过了数组的界限。
=(int *)(&a+1)= :这一步是把上一步计算出来的地址强制转化为=int *=类型,并赋值给ptr
=*(a+1)= :a和&a的值是一样的,但是意思不一样:
1.a是数组首元素的首地址,也就是a[0]的首地址;而&a是数组的首地址。
2.a+1是数组下一元素的首地址,即a[1]的首地址;&a+1是下一个数组的首地址
=*(ptr-1)= :因为ptr指向的是a[5],并且ptr是int *类型,所以*(ptr-1)指向a[5]
** 4.4 指针数组和数组指针
*** 4.4.3 再论a和&a之间的区别
#+BEGIN_SRC C
#include <stdio.h>
int main() {
char a[5] = {'A', 'B', 'C', 'D'};
printf("%x\n", a);
char (*p3)[5] = &a;
char (*p4)[5] = a;
printf("%x ", (p3+1));
printf("%x\n", (p4+1));
char (*p5)[3] = &a;
char (*p6)[3] = &a;
printf("%x ", (p5+1));
printf("%x\n", (p6+1));
char (*p7)[10] = &a;
char (*p8)[10] = &a;
printf("%x ", (p7+1));
printf("%x\n", (p8+1));
return 0;
}
output:
75a1e490
75a1e495 75a1e495
75a1e493 75a1e493
75a1e49a 75a1e49a
#+END_SRC
上面对p3和p4等指针的使用,哪个正确?
*解析:*
毫无疑问,p3和p4都是数组指针,指向的是整个数组。&a是整个数组的首地址,a是数组首元素的首地址,值虽然相同,但意义不同。
在C语言里,赋值符号”=“两边的数据类型必须是相同的,如果不相同则需要显示或隐式的类型转换。
p3这个定义中,”=“两边的数据类型完全一致。
p4这个定义就不是了:左边的类型是指向整个数组的指针,右边的数据类型是指向单个字符的指针。一般编译通不过,但是在Visual C++ 6.0只是给出警告。由于&a和a的值一样,而变量作为右值时编译器只是取变量的值,所以在该IDE中运行没有问题。
既然知道了,p3和p4都是指向整个数组的,那么+1后的值就很好理解了。
我有个问题是这个 font-lock-studio
的使用是将其当作 package
那样手动安装到我的 .emac.d
文件夹下么?(我对emacs的包管理还不是很熟悉,让你见笑了:rofl:)
我这也有这个问题,在正文中输 1.1
也会有这状况,但我没太管。
我这正常, org 版本是 9.1.7
我的是9.1.9
没有另外安装 org-plus-contrib
?
我用的完全是https://github.com/redguardtoo/emacs.d
的配置,我看了一下好像没有 org-plus-contrib
看你用的 Windows 系统?
是的,一直在windows下使用
windows下,完全正常。
刚刚发现这个问题的所在了,是因为启用了 artbollocks-mode 引起的,可以注释掉,重启就没有问题了(爬楼确认了你果然用的是陈斌的配置 )。
之前看到这个问题的时候,就怀疑是这个 mode 引起的,但当时用 M-x artbollocks-mode
禁用了之后,
发现问题没有解决,就没有追究了。
刚刚手上有一个 org 文件,标题中包含了 should
一词,比如 ** should I?
,结果标题的高度与同级的明显不同,忍不了。
就尝试看下对应的文本属性,发现其属性是 artbollocks-weasel-words-face
,这明显就是 artbollocks-mode
的锅了。
上回直接禁用 mode 之所以未生效,应该是其“退出”时没有清除对应的 text properties 所致。
我是这样查看 text properties 的,有点笨,若有更好的方法欢迎告知
把 point 移到 should
开头( evil
模式下放在 s
上)
通过 eval 求值: M-: (buffer-substring (point) (+ (point) 6)) RET
,在 echo area 就可以看到了其属性,如下:
#("should" 0 6 (fontified t face artbollocks-weasel-words-face))
另外建议修改下标题,这应该是高亮相关的一个主题,非大纲也存在此问题。
describe-face
就行了,会使用输入的face名或者默认用当前point的face。不过我这里hl-line-mode
会干扰,要先global-hl-line-mode
关掉它。