Emacs插入居中注释块

Emacs插入居中注释块,emacs,macros,latex,elisp,center,Emacs,Macros,Latex,Elisp,Center,我想为emacs创建一个宏,该宏将插入一个带有一些中心文本的latex注释块,如: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Comment 1 %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

我想为emacs创建一个宏,该宏将插入一个带有一些中心文本的latex注释块,如:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%                Comment 1                    %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%           Comment 2 Commenttext 3           %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

这在emacs lisp中可能吗?

这里有一个yasnippet,您可以使用:

# -*- mode: snippet -*-
# name: huge_comment
# key: hc
# --
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%${1:$(repeat-char (- 33 (/ (length yas-text) 2)) " ")}$1${1:$(repeat-char (- 74 (length yas-text) (- 33 (/ (length yas-text) 2))) " ")}%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
$0
如何使用:键入
hc
,调用
yas展开
,然后开始键入文本。它将重新调整自己的中心位置 自动地

此代码段将在
latex模式
文本模式
下工作。然而,我注意到一个bug 如果使用AUCTeX,则会弄乱光标位置。在这种情况下,您可以随时切换
对于
文本模式

,问题是在emacs lisp中是否可以。是的。有几种方法可以做到这一点。 我将展示一种方法,您也可以在其中注释几行文本。 也许,第一行是正文部分的标题,第二行是这一部分的作者

更好的方法是建议
LaTeX缩进行
函数。这样可以编辑注释文本并重新缩进。当我有时间的时候,我也会给你看这个变体

用法:以明文形式写下你的评论。用鼠标将文本标记为区域,然后运行以下命令

(以乳胶为中心的注释(b e)
“将区域转换为中心注释。”
(交互式“r”)
(让*((n(计数行b和e)))
(转到字符b)
(行首)
(插入字符?%填充列)
(插入?\n)
(设定值b(点))
(中心线n)
(转到字符b)
(i从1到n do的循环
(替换区域(点)(+(点)3)“%%”)
(行尾)
(插入字符?\(最大值为0(-填充列(-(点)(行起始位置))3)))
(插入“%%”)
(前线)
(插入字符?%填充列)
(插入?\n)
))

Emacs附带了用于此目的的命令
注释框。它生成居中的注释框,尽管框的宽度因内容而异。例如,区域设置在以下行的周围:

This is a comment
调用
M-x注释框时
文本将转换为:

;;;;;;;;;;;;;;;;;;;;;;;
;; This is a comment ;;
;;;;;;;;;;;;;;;;;;;;;;;
我使用了一个修改过的版本,如果区域未激活,则在当前行周围放置注释框,然后退出注释。它还临时减少了填充列,因此注释框的宽度不超过最长的行:

(defun ty-box-comment (beg end &optional arg) 
  (interactive "*r\np")
  (when (not (region-active-p))
    (setq beg (point-at-bol))
    (setq end (point-at-eol)))
  (let ((fill-column (- fill-column 6)))
    (fill-region beg end))
  (comment-box beg end arg)
  (ty-move-point-forward-out-of-comment))

(defun ty-point-is-in-comment-p ()
  "t if point is in comment or at the beginning of a commented line, otherwise nil"
  (or (nth 4 (syntax-ppss))
      (looking-at "^\\s *\\s<")))

(defun ty-move-point-forward-out-of-comment ()
  "Move point forward until it's no longer in a comment"
  (while (ty-point-is-in-comment-p)
    (forward-char)))
(定义框注释(beg end和可选参数)
(交互式“*r\np”)
(何时(非(区域-active-p))
(setq beg(指向bol))
(setq终点(下线点)))
(让((填充列(-填充列6)))
(填充区域(结束))
(注释框beg end arg)
(将点向前移动,不予评论))
(defun ty-point-is-in-comment-p()
如果点位于注释中或注释行的开头,则为t,否则为nil
(或(第4节语法PPS))

(查看“^\\s*\\s为了完整起见,也许你应该包括
ty的定义,将点从注释中向前移动
,或者用标准命令(
向前段落
?)替换它,以便非Lisper可以立即使用它…哎呀,没有注意到我在那里有一些个人功能。修复了!