Emacs 编辑大文本文件怎么不卡死?

如题 文本文件为900KB.

你这个大文件, 他是不是一行长字符上青天?

是的,一行相当长

无解啊… 看看能不能先拆一下行

1 个赞

我已经绝望了(苦笑)

找一个 CSS prettifier 格式一下就行

2 个赞

M-x global-so-long-mode 之后再打开。

3 个赞

我请你试试 Commercial Emacs.

1 个赞

Emacs 收费?

哪里那么好的事。

起先推出的代码托管叫GNU ELPA,但是为了愚蠢的规则,不收欢迎。比如,五年前有人帮我写个包,进入GNU ELPA之前要找这位的授予版权。此外,进入的包不能接受包于民营企业的API,比如github。2012年,MELPA推出托管没法令这些文书工作要求,迅速超越GNU ELPA。GNU老板Richard Stallman觉得不大妙。2020年推出NON-GNU ELPA放宽GNU的限制。

用否定来定义某物,这种方法取名字不来是。如果GNU相当于non-commercial,那NON-GNU等于commercial。

那个用户和 Emacs 开发者一直过不去,最后因为恶意行为成为了史上第一个被 emacs-devel 禁言的人士。其实 “commercial emacs” 没有真正解决长行的问题,只是随便删除了 bidi 等功能,重命名了代码中的一些函数,不值得尝试。顺便建议观众不要与他辩论,多珍稀自己宝贵的时间。(所谓的 “don’t feed the troll”)

7 个赞

我觉得,没有必要硬磕长行文本, 因为那种 minify 的一行字符上青天的文件, 根本没法做什么有意义的编辑. 可以用现在 Emacs 自带的 so-long, 这个插件可以提醒你小心不要误打开了含有超长行的文件.

4 个赞

这种只有一行的文本文件我也遇到过(json):joy:即使用vim在终端打开,除去搜索到句末这些操作,左右移动也会卡顿……

我的解决办法如下:

;; 使用 fundamental-mode 打开大文件。
(defun my/large-file-hook ()
  (when (and (> (buffer-size) (* 1024 2))
             (or (string-equal (file-name-extension (buffer-file-name)) "json")
                 (string-equal (file-name-extension (buffer-file-name)) "yaml")
                 (string-equal (file-name-extension (buffer-file-name)) "yml")
                 (string-equal (file-name-extension (buffer-file-name)) "log")))
    (fundamental-mode)
    (setq buffer-read-only t)
    ;;(buffer-disable-undo)
    (font-lock-mode -1)
    (rainbow-delimiters-mode -1)
    (smartparens-global-mode -1)
    (show-smartparens-mode -1)
    (smartparens-mode -1)))
(add-hook 'find-file-hook 'my/large-file-hook)
;; 默认直接用 fundamental-mode 打开 json 和 log 文件, 确保其它 major-mode 不会先执行。
(add-to-list 'auto-mode-alist '("\\.log?\\'" . fundamental-mode))
(add-to-list 'auto-mode-alist '("\\.json?\\'" . fundamental-mode))

我加了检测长行,所以不用记得 用find-file-literally.

1 个赞

global-so-long-mode 也支持检测到长行后执行指定的 `so-long-action’。

2 个赞

commercial-emacs 是 类似于xemacs的emacs fork吗?

可能是代码着色卡住了,建议用 tree-sitter 着色

希望大家能了解 so-long-mode 不是办法。

Output:

GNU Emacs 28.0.92
so-long--active[t] 13.508238 seconds

Commercial Emacs 0.3.1snapshot 3de8c3d in master
so-long--active[nil] 0.009560 seconds

Input:

curl -sSL -O https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css.map \
&& 2>/var/tmp/foo emacs-28.0.92.1 -Q -nw -l so-long -f global-so-long-mode \
--eval "(find-file \"bootstrap.min.css.map\")" \
--eval "(end-of-line)" \
--eval "(redisplay)" \
--eval "(let ((start (float-time))) \
           (dotimes (_i 3) (save-excursion (scroll-down) \
                              (redisplay) (scroll-down) (redisplay))) \
           (princ (with-temp-buffer (insert \"\n\") (version t) (buffer-string)) \
                  (function external-debugging-output)) \
           (princ (format \"\nso-long--active[%S] %f seconds\n\" \
                  (bound-and-true-p so-long--active)
                  (- (float-time) start)) \
                  (function external-debugging-output)))" \
--eval "(call-interactively (function save-buffers-kill-emacs))" \
&& cat /var/tmp/foo \
&& 2>/var/tmp/foo commercial-emacs -Q -nw \
--eval "(fset (quote y-or-n-p) (lambda (&rest _args) t))" \
--eval "(find-file \"bootstrap.min.css.map\")" \
--eval "(end-of-line)" \
--eval "(redisplay)" \
--eval "(let ((start (float-time))) \
           (dotimes (_i 3) (save-excursion (scroll-down) \
                              (redisplay) (scroll-down) (redisplay))) \
           (princ (with-temp-buffer (insert \"\n\") (version t) (buffer-string)) \
                  (function external-debugging-output)) \
           (princ (format \"\nso-long--active[%S] %f seconds\n\" \
                  (bound-and-true-p so-long--active)
                  (- (float-time) start)) \
                  (function external-debugging-output)))" \
--eval "(call-interactively (function save-buffers-kill-emacs))" \
&& cat /var/tmp/foo

commercial emacs 比 emacs 强大很多吗? 能具体说一下吗?