折叠和文本栏

折叠和文本栏

可以fold设置为识别字符而不是字节吗?繁体中文字符似乎每个都以三个字节编码(至少在 UTF-8 中),这意味着如果folds-w不是三的倍数,则会发生以下情况:

$ cat in.txt
【財經中心、政治中心╱台北報導】看不慣政府施政效率緩慢,鴻海集團董事長郭台銘動念選總統!《壹週刊》報導,在川普勝選當晚,郭召集鴻海高層幹部,進行美國總統大選換人後的應變策略演練,讓人驚訝的是,郭詢問在場幹

$ cat in.txt | fold # -w is 80 by default
【財經中心、政治中心╱台北報導】看不慣政府施政效率緩��
�,鴻海集團董事長郭台銘動念選總統!《壹週刊》報導,在�
��普勝選當晚,郭召集鴻海高層幹部,進行美國總統大選換人
後的應變策略演練,讓人驚訝的是,郭詢問在場幹

fold的默认输出宽度为 80 列,这会导致26 * 3 + 2每行打印 26 2/3 个字符( 或 80 个字节)。因此,-w必须设置为三的倍数以避免字符损坏。所以,至少对于fold, columns=bytes.再次,我的问题是,可以fold设置为支持多字节字符吗?手册页没有提及任何相关内容。

答案1

GNU Fold 和 GNU fmt 只理解字节,而不理解字符。要换行到一定数量的字符,可以使用 sed。

sed 's/.\{20\}/&\n/g' <in.txt
【財經中心、政治中心╱台北報導】看不慣政
府施政效率緩慢,鴻海集團董事長郭台銘動念
選總統!《壹週刊》報導,在川普勝選當晚,
郭召集鴻海高層幹部,進行美國總統大選換人
後的應變策略演練,讓人驚訝的是,郭詢問在
場幹

如果您想在空格处中断(对许多语言有用),这里有一个快速而肮脏的 awk 脚本。

awk '
    BEGIN {width = 20}
    NF == 0 {column = 0; print}
    {
        split($0, a);
        for (i in a) {
            w = length(a[i]) + 1;
            column += w;
            if (column > width) {column = w; print ""};
            if (column != w) printf " ";
            printf "%s", a[i];
        }
    }
    END {if (column) print ""}'

无论如何,请确保您的语言环境设置正确。具体来说,LC_CTYPE必须指定正确的字符编码,例如,LC_CTYPE=en_US.utf8或者LC_CTYPE=zh_CN.utf8(系统上可用的任何语言代码都可以)将 Unicode 编码为 UTF-8。

请注意,这计算的是字符,而不是屏幕宽度。即使是固定宽度的字体也可以有双宽字符,这通常是针对中文字符,因此,例如,上述文本的字符宽度为 20 在典型终端上占用 40 列。

答案2

如果您的系统上有 vim(可以处理 UTF-8 字符),您可以尝试以下操作:

将这些 vim ex 模式命令插入到名为的文件中fold.vim

set formatoptions+=m
" uncomment and update the line below to set line width to e.g. 60 chars
" textwidth=60
normal! gqG<Esc>
wq

那么如果你的中文字符在一个名为chinese_charsthen 的文件中,你可以从提示符下运行它。

vim -e chinese_chars < fold.vim

其中vim -e表示以“ex”模式启动 vim 并从 STDIN 读取 ex 命令

vim脚本解释

:h fo-table

m 也会在 255 以上的多字节字符处中断。这对于每个字符独立为一个单词的亚洲文本很有用。

那么这意味着什么呢?

默认情况下,该gq命令不适用于十进制数大于 255 的字符。例如,此 char:的十进制值为 22,577。
运行set formatoptions+=m意味着中断将与 中的文本一起使用chinese_chars

参考:
http://vim.1045645.n5.nabble.com/textwidth-doesn-t-work-for-Chinese-td1142655.html

对我来说,这会就地编辑文件chinese_chars并在 79 或 80 个字符处换行 - 这是gq正常模式命令的默认值。

相关内容