请问Linux下编辑中文文档卡顿吗?

最近发现在WSL1 GUI下用Doom Emacs处理稍微大量的中文就会卡顿,比如移动光标有肉眼可见的卡顿。

试了以下几种方法试图解决问题但都没有明显效果:

  • 修改GC:

    (setq gc-cons-threshold (* 512 1024 1024))
    (setq gc-cons-percentage 0.5)
    (run-with-idle-timer 5 t #'garbage-collect)
    
  • 修改字体:

    用过文泉驿微米黑、微软雅黑以及微软宋体。

很好奇各位大佬在Linux下处理中文不卡吗?

贴下使用环境:

WSL1 Ubuntu 18.04.4 LTS

Emacs version: GNU Emacs 26.3 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.22.30) of 2019-09-17

Doom Emacs version: Doom v2.0.9 develop be396655c45b8ca9b05bbf585385cd17d74a58c1

Profiler report:

测试方法:开了一个Fundamental的buffer,里面放了20行中文,然后对这些中文进行编辑。结果如下。

CPU:

- command-execute                                                4234  77%
 - call-interactively                                            4234  77%
  - funcall-interactively                                        3995  73%
   - counsel-M-x                                                 3478  63%
    - ivy-read                                                   3454  63%
     + read-from-minibuffer                                        95   1%
     + ivy--reset-state                                             4   0%
     + ivy-call                                                     1   0%
    + counsel--M-x-externs                                         24   0%
   - evil-previous-line                                           326   5%
    + evil-line-move                                              326   5%
   - evil-next-line                                                87   1%
    + evil-line-move                                               87   1%
   + evil-normal-state                                             63   1%
   + evil-delete-char                                              18   0%
   + evil-delete                                                   11   0%
   + handle-focus-in                                                5   0%
   + evil-visual-char                                               3   0%
   + evil-forward-word-end                                          2   0%
   + evil-insert                                                    1   0%
   + evil-yank                                                      1   0%
  + byte-code                                                     238   4%
- ...                                                            1160  21%
   Automatic GC                                                  1160  21%
+ redisplay_internal (C function)                                  32   0%
+ timer-event-handler                                              14   0%
+ evil-repeat-pre-hook                                              3   0%
+ winner-save-old-configurations                                    3   0%
+ evil-visual-post-command                                          3   0%
+ evil-repeat-post-hook                                             2   0%
+ evil--jump-hook                                                   1   0%
+ evil-escape-pre-command-hook                                      1   0%
+ xselect-convert-to-string                                         1   0%

Mem:

- command-execute                                          15,647,376  60%
 - call-interactively                                      15,646,320  60%
  - funcall-interactively                                  13,950,980  53%
   - counsel-M-x                                            6,078,038  23%
    - ivy-read                                              6,030,494  23%
     + read-from-minibuffer                                 4,500,063  17%
     + ivy-call                                             1,217,135   4%
     + ivy--reset-state                                        93,638   0%
     + ivy--update-prompt                                       1,024   0%
      counsel--M-x-externs                                     47,544   0%
   - evil-previous-line                                     5,062,464  19%
    + evil-line-move                                        5,062,464  19%
   - evil-next-line                                         2,572,097   9%
    + evil-line-move                                        2,572,097   9%
   + evil-insert                                               63,597   0%
   + evil-visual-char                                          54,616   0%
   + evil-delete                                               46,984   0%
   + handle-focus-in                                           40,052   0%
   + evil-delete-char                                           8,148   0%
   + evil-delete-backward-char-and-join                         6,720   0%
   + evil-backward-char                                         6,336   0%
   + evil-forward-char                                          3,168   0%
   + evil-paste-after                                           3,168   0%
   + evil-normal-state                                          2,224   0%
   + evil-yank                                                  1,256   0%
   + evil-forward-word-end                                      1,056   0%
  + byte-code                                               1,694,284   6%
- ...                                                       6,391,983  24%
 + pop-to-buffer                                            6,299,639  24%
 + #<lambda 0x374f1716630a6>                                   90,272   0%
 + annalist--record-record                                      2,072   0%
+ redisplay_internal (C function)                           3,384,721  13%
+ timer-event-handler                                         221,709   0%
+ winner-save-old-configurations                              127,160   0%
+ evil-visual-post-command                                     43,036   0%
+ xselect-convert-to-targets                                   12,408   0%
+ xselect-convert-to-string                                     6,794   0%
+ evil-repeat-pre-hook                                          2,112   0%
+ evil-escape-pre-command-hook                                  2,048   0%
+ internal-echo-keystrokes-prefix                               1,056   0%
  list                                                          1,040   0%
  internal-timer-start-idle                                       876   0%

describe-char:

             position: 8367 of 85084 (10%), column: 72
            character: 是 (displayed as 是) (codepoint 26159, #o63057, #x662f)
              charset: unicode (Unicode (ISO10646))
code point in charset: 0x662F
               script: han
               syntax: w 	which means: word
             category: .:Base, C:2-byte han, L:Left-to-right (strong), c:Chinese, h:Korean, j:Japanese, |:line breakable
             to input: type "C-x 8 RET 662f"
          buffer code: #xE6 #x98 #xAF
            file code: #xE6 #x98 #xAF (encoded by coding system utf-8)
              display: by this font (glyph code)
    xft:-1ASC-Droid Sans Fallback-normal-normal-normal-*-16-*-*-*-*-0-iso10646-1 (#x33C7)

Character code properties: customize what to show
  name: CJK IDEOGRAPH-662F
  general-category: Lo (Letter, Other)
  decomposition: (26159) ('是')

是否已经正确设置中文字体?

inhibit-compacting-font-caches 变量是否为t(为nil时在Windows上处理非英文字体(包括icons font等)会产生严重卡顿)

是为t(doom默认)。

我不是很清楚WSL上是否属于用windows处理。

之前用的时候由于一直是英文环境,没怎么注意中文处理这件事。

最近在用org写一份中文文档,大概2000行不到。 屏幕中可见范围中文少的时候还凑合(比如大部分标题都折起来),如果满屏幕都是中文,编辑就很卡。

不知道是不是Emacs天生处理中文字符就很慢。

折起来时不卡,这个猜测是不是开了linum-mode,

用的不是linum,是原生的line number mode。

line number mode应该也不比linum好多少,行号问题导致org-mode卡,应该是老问题,很多人都遇到过,我以前也不知道,还以为org-mode就是这样的,甚至还换了几个emacs版本来用………

https://pavelfatin.com/typometer/

我拿这个测试过Emacs的编辑性能。关闭linum-modeword-wrap会有比较大的改善

感谢大家的回复! 怪我没说清重点 :joy:,其实我想问的是各位在Linux(非WSL)下用Emacs写大量中文的时候相较英文是否有明显的卡顿,甚至完全卡死。如果Emacs对中文的确支持不好的话,我也就不折腾了。

我大致能确定是中文导致的,但不清楚根本原因是什么,以及如何解决。

我做过如下测试:

  1. Buffer为Fundamental,没有行号,没有word wrap,大约30行x100个中文字符。编辑就已经卡的不行了,例如删除字符或移动光标。
  2. Org mode下开启行号,输入10000行英文都丝般顺滑。
  3. 我发现卡顿程度和当前视野范围中中文字符的数量成正相关(所以才说Org mode把标题折起来会好很多。)

所以才觉得应该是中文导致的,Profiler显示ivy-readevil-line-move占用了挺高的CPU以及Mem,不清楚具体是什么为什么。

emacs -Q呢?

linux下编辑几百行全中文org文件无卡顿

linux下emacs应该比windows更加流畅才对!我windows编辑一万多行纯中文的org文件没有卡顿,linux只会更好,感觉没必要操心这个问题

我用Spacemacs在WSL下丝毫不会卡,除了fcitx自动切换有点迟钝。不知道有没有帮助。

ps:我用的GNU Emacs 27.0.90 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.22.30) of 2020-03-05

我又试了下以前用过的Spacemacs配置,编辑中文也不卡。 emacs -Q也不卡。 然后用了下Doom Emacs的默认配置,就有问题 :joy:

也许是Doom默认开了一些东西水土不服吧。

Fundamental mode就开了下面几个minor mode,还是卡的不行。

Enabled minor modes: +Popup Doom-Modeline Evil Evil-Escape Evil-Local
File-Name-Shadow Gcmh General-Override Ivy Menu-Bar Mouse-Wheel Persp
Shell-Dirtrack Show-Paren Solaire-Global Tool-Bar Which-Key Window-Divider
Winner Xterm-Mouse

emacs -Q不卡

试试我的配置卡不卡? GitHub - redguardtoo/emacs.d: Fast and robust Emacs setup.

不卡。

试了下Doom 19年年底的版本,也是存在同样的问题。

用我的配置Centaur Emacs 会不会卡?

不卡。紫薯布丁

我在windows下用doom也不卡,org中文在二千行左右。行号也开启的。

doom下卡过是编辑env文件,shell-mode,换成fundamental就好了

1 个赞