对于粘贴到文件(或buffer)的代码段,我有两个问题想请教大家:
-
粘贴到一个文件中的代码段,有没有什么方法快速将其格式化?
举例说明:新建了一个.c 的文件,从别的文件(如pdf)中复制一段代码,粘贴进.c文件,经常出现代码段的所有缩进都丢失的情况。是不是可以选中这段代码,然后用个命令迅速格式化代码,使其变得比较规范。
-
在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 个赞
Chris
7
格式化编程语言的代码,比如C语言的,建议用专门的软件,比如Astyle。
Emacs整合Astyle我以前尝试过,你可以参考一下
1 个赞
小弟孤陋寡闻,确实还没在emacs/vi中用过一键格式化选中内容。
不小心暴露了小白的身份
indent 没关系,我只想加上#+BEGIN_SRC
和#+END_SRC
这两行。
@xuchunyang的代码已经基本上实现了我想做的,很赞! 要是能在insert
之前先读出代码行的前置空格数,然后在#+BEGIN_SRC
和#+END_SRC
之前加上相同数目的空格,那就更完美了!
需要缩进 #+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 个赞