org-mode高亮显示错误


#1

%E5%9B%BE%E7%89%87

如图大纲=4.2.2=显示出错,最后一个2上出现一个紫色的框框,而且整句的颜色高亮也不对。

有没有哪位大师兄知道是怎么回事?


#2

orgmode 是会出现这种问题的,因为染色全凭正则,可能你输入的哪段话超出了现有正则表达式的范围,然后就造成这种车祸了

如果想要知道到底是哪一个正则的问题,需要一个 debug 工具 font-lock-studio

edit:

补充链接

我遇到这种问题一般都是无视它,除非导出的时候出错才调查原因,因为这个也不是小概率的情况。当然我理解强迫症遇到这种情况一定特难受 :joy:


#3

提供一个能重现该问题的例子会很有帮助。


#4

如下是我的大纲

* 第四章 指针和数组
** 4.2 数组
*** 4.2.1 数组的内存分布
*** 4.2.3 数组名a作为左值和右值的区别

** 4.3 指针和数组之间的恩恩怨怨
*** 4.3.2 a和&a的区别

** 4.4 指针数组和数组指针
*** 4.4.3 再论a和&a之间的区别

其在我的emacs上显示情况如图,其中有紫色框框的是显示错误的: %E5%9B%BE%E7%89%87


#5

只有大纲是不能够 debug 的,因为造成染色失败的显然是你的正文

如果你不想把整个文档都贴出来,最好的办法就是用 font-lock-studio 去诊断问题


#6

我的全文如下

* 第四章 指针和数组
** 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:)


#7

我这也有这个问题,在正文中输 1.1 也会有这状况,但我没太管。


#8

我这正常, org 版本是 9.1.7

image


#9

我的是9.1.9


#10

我也没有这个情况,

image

你运行一下 org-version 把完整的 orgmode 版本信息贴出来,比如我的

怀疑你的 orgmode 可能安装不正确


#11


#12

没有另外安装 org-plus-contrib


#13

我用的完全是https://github.com/redguardtoo/emacs.d的配置,我看了一下好像没有 org-plus-contrib


#14

看你用的 Windows 系统?


#15

是的,一直在windows下使用


#16

windows下,完全正常。 Snipaste_2018-09-25_18-58-03


#17

刚刚发现这个问题的所在了,是因为启用了 artbollocks-mode 引起的,可以注释掉,重启就没有问题了(爬楼确认了你果然用的是陈斌的配置 :slight_smile: )。

之前看到这个问题的时候,就怀疑是这个 mode 引起的,但当时用 M-x artbollocks-mode 禁用了之后, 发现问题没有解决,就没有追究了。

刚刚手上有一个 org 文件,标题中包含了 should 一词,比如 ** should I? ,结果标题的高度与同级的明显不同,忍不了。 就尝试看下对应的文本属性,发现其属性是 artbollocks-weasel-words-face ,这明显就是 artbollocks-mode 的锅了。 上回直接禁用 mode 之所以未生效,应该是其“退出”时没有清除对应的 text properties 所致。

我是这样查看 text properties 的,有点笨,若有更好的方法欢迎告知 :slight_smile:

  1. 把 point 移到 should 开头( evil 模式下放在 s 上)

  2. 通过 eval 求值: M-: (buffer-substring (point) (+ (point) 6)) RET ,在 echo area 就可以看到了其属性,如下:

    #("should" 0 6 (fontified t face artbollocks-weasel-words-face))
    

另外建议修改下标题,这应该是高亮相关的一个主题,非大纲也存在此问题。


#18

describe-face就行了,会使用输入的face名或者默认用当前point的face。不过我这里hl-line-mode会干扰,要先global-hl-line-mode关掉它。


#19

今天换了个配色,用的 solarized light,然后发现这个问题好像解决了…

不过我试了一下将光标闪烁去除,然后它又错了。有机会照你的方法试一下。