针对粘贴代码段的编辑问题

对于粘贴到文件(或buffer)的代码段,我有两个问题想请教大家:

  1. 粘贴到一个文件中的代码段,有没有什么方法快速将其格式化? 举例说明:新建了一个.c 的文件,从别的文件(如pdf)中复制一段代码,粘贴进.c文件,经常出现代码段的所有缩进都丢失的情况。是不是可以选中这段代码,然后用个命令迅速格式化代码,使其变得比较规范。

  2. 在org mode中,有时总是先有了代码,才想起来要在前后分别加上#+BEGIN_SRC#+END_SRC:

 #+BEGIN_SRC xx
 代码
 #+END_SRC
是不是有方法可以选中代码,然后用个命令迅速地补充这两行?

个人觉得,第2个问题,org-mode 好像也没有提供方法,不过自己写应该不难实现; 第1个问题似乎有点难度,不过好多编辑器都有这个功能,Emacs应该有轮子了吧?

问题2,不清楚 org-mode 或其它扩展是否已提供这样的函数,自己写一个也不难,可以参考这个:https://emacs-china.org/t/emacs/2491/12,给选中的内容加上 /* */ 注释,变成:

/*
(选中内容)
*/

好吧,其实这些扩展都可以:

问题1 没看明白,emacs/vi 不都可以一键格式化选中内容吗?还是你想在粘贴的同时完成,免去重新选择?

问题一

如果是一般的buffer的话 可以魔改 yank,然后加 indent-region,但是感觉影响太大了

如果是org-mode 可以在 org-edit-src-exit 之前调用一次 (indent-region (point-min) (point-max))

问题二是怎么出现的,为什么会把代码粘贴到org格式里面,这样就算是indent也不知道按什么规则了,而且高亮也没有了。不是应该先org-edit-src然后再粘贴的吗

关于问题 2,如果想要自己写个命令的话,可以试试

(defun org-format-region-as-code-block (beg end)
  (interactive "*r")
  (let ((lang (read-string "Language: "))
        (code (delete-and-extract-region beg end)))
    (insert "#+BEGIN_SRC " lang "\n"
            code (if (string-suffix-p "\n" code) "" "\n")
            "#+END_SRC\n")))
1 个赞

格式化编程语言的代码,比如C语言的,建议用专门的软件,比如Astyle。

Emacs整合Astyle我以前尝试过,你可以参考一下

1 个赞

小弟孤陋寡闻,确实还没在emacs/vi中用过一键格式化选中内容。 :grinning:不小心暴露了小白的身份

对于问题一,在各位的提示下,我搜索了一下,

选中内容,再调用indent-region

似乎已经满足我的要求了

indent 没关系,我只想加上#+BEGIN_SRC#+END_SRC这两行。

@xuchunyang的代码已经基本上实现了我想做的,很赞! 要是能在insert之前先读出代码行的前置空格数,然后在#+BEGIN_SRC#+END_SRC之前加上相同数目的空格,那就更完美了!

indent-region 行不行?

需要缩进 #+BEGIN_SRC#+END_SRC 所在行的话,可以试试:

(defun chunyang-org-format-region-as-code-block (beg end)
  (interactive "*r")
  (let ((lang (read-string "Language: "))
        (ind (save-excursion
               (goto-char beg)
               (back-to-indentation)
               (buffer-substring (line-beginning-position) (point))))
        (code (delete-and-extract-region beg end)))
    (insert ind "#+BEGIN_SRC " lang "\n"
            code (if (string-suffix-p "\n" code) "" "\n")
            ind "#+END_SRC\n")))

(上面缩进大小等于所选中 Region 的第一行的缩进大小)

1 个赞

我觉得indent-region已经够用了

大神信手捏来,如此熟练,真是佩服!