我写东西的时候习惯在中英文间隔的地方放一个额外的空格,Emacs 正常开着 visual-line-mode
来根据窗口大小自动折行。
但现在的问题是如果我打开 toggle-word-wrap
的话,长的中英文混排的句子会在英文单词空格的地方折行——往往是在远不到一行的宽度,效果很难看;而如果不打开 toggle-word-wrap
的话,如果英文单词正好在窗口边缘,它会在中间断开(一部分在上一行一部分在下一行),读起来很不方便。
不知道有没有能两全其美的方法。
我写东西的时候习惯在中英文间隔的地方放一个额外的空格,Emacs 正常开着 visual-line-mode
来根据窗口大小自动折行。
但现在的问题是如果我打开 toggle-word-wrap
的话,长的中英文混排的句子会在英文单词空格的地方折行——往往是在远不到一行的宽度,效果很难看;而如果不打开 toggle-word-wrap
的话,如果英文单词正好在窗口边缘,它会在中间断开(一部分在上一行一部分在下一行),读起来很不方便。
不知道有没有能两全其美的方法。
一般写markdown或者org或者TeX ,手动折行才是正道。不会影响导出,也方便阅读。另起一段空一行。一般可以写完以后按M-q处理折行。
如果你需要类似记事本这样的折行,那就会把英文词分开。 自动换行规则太复杂,还会降低性能。
不怎么熟悉什么状况,但 visual-line-mode
的 doc-string 似乎说它的主要作用就是打开 word-wrap
,所以不应当有关闭 word-wrap
且还开着 visual-line-mode
的情况?
不容易看出来 Emacs 的 Word Wrap 是什么实现的,应该是用 C 语言实现的,也不太可能定制它的行为。你所描述 Visual Line Mode 或者说 Word Wrap 的问题应该是在意料之中的,跟 M-f
(forward-word
) 不能处理中文的原因一样,你可以试试了解 Syntax Table / Word Boundary,看看能不能让 Emacs 把一个个中文字符(包括全角标点)当作一个 Word。或问问 Emacs 的开发人员。
我也有同样的问题。我关闭 word-wrap
同时打开 visual-line-mode
,凑合着用吧。或者还有一种办法就是用硬折行,反正导出的时候是按照空行而不是按照回车来划分段落的。
感觉上 visual-line-mode 主要是提供了折行功能,word-wrap 只是折行的一个 feature。
扫了一眼代码,好像是 C 实现。想要能根据语言折行的话得去判断字符的范围了吧,考虑到中文以外的字符的支持负担是比较重。
不清楚,Emacs 默认不就开启了折行(Line Wrap)?(emacs) Continuation Lines 除非你自己改了这个设置,否则 Visual Line Mode 开不开都会自动折行。
Emacs 默认是没有 line wrap;toggle-truncate-lines 提供了折行的显示;visual line mode 提供了折行+基于屏幕显示的“虚拟”行的移动(行首行尾等等)。word-wrap 定义了折行的时候能不能把一个英文单词折到两行里去。
另外我上面那个帖子手误把 visual line mode 写成 visible line mode 了,已经更正。
试试 Emacs -Q
Truncate Line 是从中间截断的意思,也就是过长的行压根就选择不显示。这里估计你的意思是“关闭 Truncate Line 也就开启了 Line Wrap / 折行"
这么说应该也没什么问题。虽然 Emacs 默认折行本来就开着,要是你自己把它关了,Visual Line Mode 开的时候又会把它打开。
发现我之前用来做测试的文件是个 org 文档,text-mode
默认折行,但 org-mode
默认不折行。而 toggle-truncate-mode
只有切换的时候在 mini-buffer
里显示一下当前状态。是我先入为主理解错了。
text-mode
的话,这个是默认状态,过长的行被折成三行,两边有箭头指示,C-a
到行首的 E, C-e
到行尾的句号。
toggle-truncate-mode
之后是这个状态,只显示一行的一部分,显示不下的部分用两边的箭头指示
visual-line-mode
则是这个样子,我打开了行号来表现得更清楚。两边没有箭头指示,C-a
到行首的 E,C-e
到虚拟行尾的 e,C-n
到 mode 那一(虚拟)行。除了行号还显示这是一(物理)行之外,其他的操作都跟普通的硬换行(fill)没有差别。
1 和 3 都算 line wrap/折行,但是显示和操作方式是不一样的。
word wrap 对 1 和 3 都适用。
打车问一下相关问题。我开了visual-line-mode,然后在emacs mode下我可以一行一行的移动光标,但为什么在normal mode下,按j或k有时候是移动一段呢?
不清楚,没用过 Evil
看起来我之前没搞清楚问题所在,现在我的看法是:
Emacs 的断行规则里预设了「空格处断行」,没考虑过 CJK 的情况。所以这可以当作一个 Bug,TODO 需要有人提交一个 Bug Report。
你要用 gj
或 gk
来在虚拟行中移动,或者直接绑定替换默认的。
emacs中算第几列时,一个中文字符等于两个英文占的列数,怎么把它改成一对一呢?
挺有意思的问题,但跟这个主题没关,你应该单独开个新主题。
org mode 的确默认不折行,但是你可以在你的配置中加上这段代码:
(setq org-startup-truncated t)
其实我很喜欢emacs的truncate-linne,从实践中发现wrap实在太难受,尤其在orgmode的时候,影响结构观感。只有在必须的时候自己toggle-truncate-line就好了,大多数时候就如楼上所说使用手动段落切割 M-q
。
一般如果需要恢复段落的原始长行,可以使用如下函数(我无耻的抄的):
;; ** Set unfill function
(defun your-specific-config-name/unfill-paragraph (&optional region)
"Takes a multi-line paragraph and makes it into a single line of text."
(interactive (progn (barf-if-buffer-read-only) '(t)))
(let ((fill-column (point-max))
;; This would override `fill-column' if it's an integer.
(emacs-lisp-docstring-fill-column t))
(fill-paragraph nil region)))
对于Markdown, org, latex, 同不建议写超长行。
有传说中的爷爷一样老的auto-fill mode
可以用,设个舒服的fill-column
的值(每行最多字数),比如80,到了超出你点空白字符键时就会自动加回车换行。当你进行插入或者删除等修改操作后,变得各行不齐时,在当前段落任何位置,按下M-q
就又重新排齐啦。
我是被老板安利的,主要这玩意儿太老了,除非看书,根本不会注意到。我之前衣纠结过很久,知道用了它。我写长邮件草稿都用Emacs了,为了换行和对齐方便。
另附上把自动换行对齐为多个行在段落重新转成一个超长行:
;; unfill paragraph: the opposite of fill-paragraph
(defun y:unfill-paragraph-or-region (&optional region)
"Takes a multi-line paragraph and makes it into a single line of text."
(interactive (progn (barf-if-buffer-read-only) '(t)))
(let ((fill-column (point-max))
;; This would override `fill-column' if it's an integer.
(emacs-lisp-docstring-fill-column t))
(fill-paragraph nil region)))
(define-key global-map "\M-Q" 'y:unfill-paragraph-or-region)
网上有看到一个方法,可以保持 j
,k
正常在虚拟行中移动,而不会整段地移动;同时去掉了换行处的标志。在 dotspacemacs/user-config
加入:
(defun org-line-wrap ()
(spacemacs/toggle-visual-line-navigation-on)
(setq-local word-wrap nil))
(add-hook 'org-mode-hook 'org-line-wrap)
将上面的 nil
改为 t
,则每一段换行后是完整的单词。
Org mode 能导出富文本的邮件