软换行 or 硬换行?大家的使用习惯是什么?

本人有使用 org-mode 记笔记和记录感想的习惯,有点强迫症,一直坚持 80 columns 和硬换行的习惯。

最近写了一篇文章想要发表,导出 markdown,再输入某网站的文章编辑界面之后,调用了 markdown 自动转换,这才想起来换行变成空格之后,在中文的段落里面特别突兀。我想写文章这些是不是就应该用软换行,技术文档这些才使用硬换行。

另外,转换之后我的 footnotes 和 toc 都失效了,既然支持用 markdown 写作,为什么不支持好一点呢?


updated

之前有在论坛里面看到导出的时候自动删除中文字符里面的空格,解决方法肯定是有的。这篇帖子主要是想看看大家是如何处理这个问题的?

完全使用软/硬换行,还是根据文档分类使用软硬换行,还是说增加一个函数来处理这个问题,或者其他。

我有点搞不明白软换行和硬换行的区别,是不是这样的:

软换行:敲回车换行,但是行与行之间还是连在一起的

例如:

这是第一行
这是第二行

硬换行:也是敲回车换行,但是行与行之间至少有一行空行?

例如:

这是第一行

这是第二行

我不知道我的理解对不对。如果是这样的话,「硬换行」对我来说就是拆分段落了。「软换行」则是一种组织段落中换行的手段,我不会固定字数换行(我的换行字数设置的比较大),而是遵循 语义换行


你的吐槽,看起来就是 org 转换到 markdown 时不符合你的需要,而 org 的 TOC 和 markdown 的 TOC 要求的格式可能不同,所以转换过去也无法识别吧,你只是需要找一个方法,将 org 转换成你想要的 markdown 格式就好了。

网上或许有解决方案,或者可以论坛搜搜看~

2 个赞

从硬换行改成软换行 + fill-column 的方式了,+word-wrap-mode:

Long lines will wrap at the window margin by default, or can optionally be wrapped at fill-column by configuring +word-wrap-fill-style.

软硬换行的区别在于如何实现视觉上的换行。软换行是让编辑器显示的时候自动对超出显示宽度的段落进行换行。硬换行是通过手动输入换行符实现视觉行的换行。

比如 word 文档里面就是使用软换行。而代码相关的文档里面通常使用硬换行(因为终端上超出显示宽度的单行文字会被直接截断)

另外我是一直习惯使用硬换行,这次写文章的时候体会到冲突,于是来吐槽一下,同时也想看看大家是如何做的。


另外仔细看了一下你给的链接,解释的很清楚了。不过我这里指的硬换行是指根据设定的编辑器的 fill- column 进行换行。 比如 fill-column 设定为 7.

1234567
hello world // 软换行
hello 
world  // 硬换行
1 个赞

昨天晚上太晚了。看到了你提供的解决方案,想着今天试试,现在一看怎么删了?

明白了,主动输入换行的叫硬换行。由编辑器实现的视觉上的换行(没有插入换行符换行)的是软换行,大概就是 Emacs 里 visual-line 的效果吧。

你的例子我还是有点疑问,emacs 按照 fill-colum 自动换行应该也是插入了换行符的。所以你说的软硬,自己主动插入的就硬,编辑器自动处理的叫软?

你的需求,大概需要想办法将不需要的硬换行换行符移除吧,这样就不会出现多余的空格。至于 footnote 和 toc,可能是直接复制过去,org 的格式和 markdown 不兼容?可以看看怎么转换一下

没错。我之前也尝试过使用你指的语义换行,但是发现每行的长度,容易参差不齐,看着不是很舒服。修改的时候也有一些麻烦,于是就换到了硬换行,emacs 里面有内置的按键 M-q 可以帮我根据 fill-column 大小自动重新组织段落。

我倒是不喜欢默认的 fill-column 策略 :melting_face:,我觉得它把语义破坏了,它实现的仅仅是把内容限制在一定长度而已。

确实是我说的不是很清楚,抱歉。

  • 软换行是通过显示的时候对过长的单行文字进行折行,实际上没有对文本进行任何修改。
  • 硬换行是通过在文本里面插入实际的换行符实现视觉上的折行。

希望下面的图片,可以帮助理解。前后两个图片的文本是相同的,只是改变了窗口的宽度。

1 个赞

其实是兼容的。只是那个网址,只是支持导入 markdown 格式,并不是支持 markdown 格式的写作。我想 footnote 和 toc 不支持,只是单纯那个网站自己没有做好完整的 markdown 支持而已。

经过多种权衡,我最终决定语义换行搭配各种论坛上找到的导出自动处理空格的函数。

https://emacs-china.org/t/org-mode-html/7174

只需要稍微修改一下就可以给 markdown 导出使用。

(define-advice org-gfm-paragraph
    (:around (orig-fun paragraph contents info) org-gfm-paragraph-advice)
  "Join consecutive Chinese lines into a single long line without
unwanted space when exporting org-mode to html."
  (let* ((fix-regexp "[[:multibyte:]]")
         (fixed-contents
          (replace-regexp-in-string
           (concat
            "\\(" fix-regexp "\\) *\n *\\(" fix-regexp "\\)") "\\1\\2" contents)))
    (funcall orig-fun paragraph fixed-contents info)))


updated

我发现对于我这个强迫症患者,面对使用语义换行导致的每行文字长度的不一致, 可以换一个角度说服自己。 语义换行根据文字意群换行,文字长度错落有致,像诗一样。 把文字根据语义安排好换行的顺序,真的让我感觉到很舒服。

但是语义换行其实有时候很难受。比如一个包含了对比或转折的句子, 一开始写的时候,想写的不长,于是决定放在一行, 但是写到转折的部分突然想要扩充一下,这个时候一个句子分成两行更合适。 但写作的时候写到一半,移动光标到前一个标点符号、删除、返回, 这个操作很烦人。 于是我写了这个新的函数绑定到 M-q, 在前面最近的一个标点符号之后进行换行。



(defun my/newline-after-punctuation ()
  "在光标前最近的标点符号后换行,但保持光标相对于文本的位置不变。"
  (interactive)
  (let ((punct-regexp "[,。;?!,.;?!]"))
    (save-excursion
      (if (re-search-backward punct-regexp nil t)
          (progn
            (forward-char 1)
            (newline-and-indent))
        (message "前面未找到标点符号"))))) 
3 个赞

我写博客一般会用 olivetti-mode,限制100个字符长度(我觉得这个长度比较适合我,不至于频繁换行),然后我就只管写,不会太在乎换行,只有当达到长度限制的时候,我才会考虑把当前的长句子在合适的语义位置换行。

要调整我倒也不嫌麻烦,甚至有点乐在其中,因为反复调整后,往往能让语言表达的更通顺。

我觉得写初稿的时候不用太在意换行,先让自己顺畅写完。等写完了才回头读一遍,再慢慢换行,看看哪里不通顺的就调整一下。

明白,但是如果写着写着自动换行了,会让我很难受, 光是看着不太合理的换行我都觉得很难受, 甚至只需要我预计到可能会出现这样的情况,都会觉得很难受, 不立刻调整,我会写不下去的。

正是因为这样,我不得不立刻停下写作,回去调整。 这样的习惯十分打断我的写作思路,因此想出了这种方法。

我也是使用的 olivetti-mode,体验非常好。 不过如果能够实现像打字机一样的效果, 只移动背后的屏幕,不移动光标的位置就更好了。 我试用了两个 package 效果都一般(typewritter-roll-mode, centered-cursor-mode)。 可能之后有时间了,尝试自己实现一下。

对于 fill-column 的长度,我设置的是 80,或许有些短了。 如果之后明显限制了我的写作,我在考虑要不要加长吧。