Emacs有按字符折行的工具吗?

遇到一些长句子不希望按照字符数而总是按特定的字符折行,比如: aaaaaaaaaa + bbbbbbbbbb + ccccccccccc + dddddddd,希望显示成

aaaaaaaaaa +
  bbbbbbbbbb +
  ccccccccccc +
  dddddddd

aaaaaaaaaa
  + bbbbbbbbbb
  + ccccccccccc
  + dddddddd

缩进可以不要,但我希望能从特定的符号(比如+)折行,最好是visual-line-mode

找到一个工具wrap-region,但是似乎跟我的需求正好相反,这个是设定不折行的字符。

有其他推荐吗?谢谢!

仿佛看到了ggplot

我一般直接 :s/+/\n+/g:joy:

不知道有没有自动折的

差点忘了自己之前在网上抄到的code。。来源和最新版本似乎在这儿

是用Yihui Xie的formatR 来做自动formatting 理论上和rstuidio的效果应该相同

;;;; ESS
  (with-eval-after-load 'ess
    (defun ess-indent-region-with-formatR-tidy-source (beg end)
      "Format region of code R using formatR::tidy_source()."
      (interactive "r")
      (let ((string
             (replace-regexp-in-string
              "\"" "\\\\\\&"
              (replace-regexp-in-string ;; how to avoid this double matching?
               "\\\\\"" "\\\\\\&"
               (buffer-substring-no-properties beg end))))
            (buf (get-buffer-create "*ess-command-output*")))
        (ess-force-buffer-current "Process to load into:")
        (ess-command
         (format
          "local({
          formatR::tidy_source(text=\"\n%s\",
                               arrow=TRUE, width.cutoff=60) })\n"
          string) buf)
        (with-current-buffer buf
          (goto-char (point-max))
          ;; (skip-chars-backward "\n")
          (let ((end (point)))
            (goto-char (point-min))
            (goto-char (1+ (point-at-eol)))
            (setq string (buffer-substring-no-properties (point) end))
            ))
        (delete-region beg end)
        (insert string)
        (delete-backward-char 2)
        ))
    )
1 个赞

我想的就是R :sweat_smile: 不过平时中文折行效果也不好……

我的Rscript一直eval不了region或函数,也没排查出是Doom的问题还是ESS的,运行单行是可以的,但每次一行既麻烦console里又不整齐,所以想能折行显示就好了。

不知道这个思路是不是跑太偏了……

有啥报错信息吗 是不是没设置binding?发送单行和函数和region是不同的command

    ess-eval-line
    ess-eval-buffer
    ess-eval-region
    ess-eval-function
    ess-eval-paragraph
    ess-eval-line-and-go
    ess-eval-buffer-and-go
    ess-eval-line-and-step
    ess-eval-region-and-go
    ess-eval-function-and-go
    ess-eval-paragraph-and-go
    ess-eval-paragraph-and-step
    ess-eval-function-or-paragraph
    ess-eval-line-visibly-and-step
    ess-eval-buffer-from-beg-to-here
    ess-eval-buffer-from-here-to-end
    ess-eval-line-and-step-invisibly
    ess-eval-line-invisibly-and-step
    ess-eval-region-or-line-and-step
    ess-eval-function-or-paragraph-and-step
    ess-eval-region-or-function-or-paragraph
    ess-eval-region-or-line-visibly-and-step
    ess-eval-region-or-function-or-paragraph-and-step

没啥,就是有跟region有关的,准确说是只要有换行的region或{}包围的内有换行的函数,就会卡住。一次一行就没问题。这两天在折腾怎么在打开script时关连一个process,这个还没详细测试。

楼主找到更好的解决方案了吗?我目前也有这个需求。
研究过程中,发现lua-mode 对单个符号的实现就是你需要的效果。 下图是自动缩进后的效果:

没有按照我原来的思路实现。

后来用了format-all搭配老王的auto-save等,也算是基本解决了。

这是我写R的一些配置,不知道你能不能用得上,供参考: https://gitee.com/hesperus/emacs.d/blob/master/config/+ESS.el#L47

感谢分享,我好好研究一下。

更新: 基于basic-mode 的缩进算法实现,进行稍微扩展已经解决这个问题。后缀加什么符号都可以,我用的是行尾遇到“\” 自动折行。

实现方法:

  1. 如果往前搜索到关键字(”\“),并且往后搜索到上一行的行尾没找到关键字。折行时增加缩进。
  2. 如果往前搜索到关键字(”\“),并且往后搜索到上一行的行尾没找到关键字。折行时减少缩进。
  3. 其他情况 不做操作。