gpt4 book ai didi

用于 R 注释的正则表达式 Emacs

转载 作者:太空宇宙 更新时间:2023-11-03 18:48:18 25 4
gpt4 key购买 nike

我想在 Emacs 中构建一个正则表达式来清理我的 R 代码。

我遇到的一个问题是有不同类型的评论:你有一些有一定数量的空白 (1),例如:

        # This is a comment:
# This is also a comment

或者你有这样的情况(2):

require(lattice) # executable while the comment is informative

我的想法是,当它们是第二类时(在可执行的东西之后),我想对齐评论,同时排除第一类。

理想情况下,它会将所有评论与第一类评论对齐,而不是第一类评论。

例子:

funfun <- function(a, b) {
# This is a function
if (a == b) { # if a equals b
c <- 1 # c is 1
}
}
#

收件人:

funfun <- function(a, b) {
# This is a function
if (a == b) { # if a equals b
c <- 1 # c is 1
}
}
#

我找到了一个正则表达式来替换第一类的正则表达式,这样我就可以按段落对齐它们 (mark-paragraph)。效果不错。

问题是反向替换:

(replace-regexp "^\\s-+#+" "bla" nil (point-min) (point-max))

这将从一行的开头替换为任意数量的空格和任意数量的注释字符,例如:

     #########   

进入

     bla

问题是我想将它们替换回原来的样子,所以“bla”必须回到相同数量的空格和相同数量的#。

希望有人理解我正在尝试做的事情并且对方法有更好的想法或者知道如何解决这个正则表达式部分。

enter image description here

最佳答案

好吧,这是一些我认为你想要做的疯狂尝试。它似乎有效,但它需要大量的测试和完善:

(defun has-face-at-point (face &optional position)
(unless position (setq position (point)))
(unless (consp face) (setq face (list face)))
(let ((props (text-properties-at position)))
(loop for (key value) on props by #'cddr
do (when (and (eql key 'face) (member value face))
(return t)))))

(defun face-start (face)
(save-excursion
(while (and (has-face-at-point face) (not (bolp)))
(backward-char))
(- (point) (save-excursion (move-beginning-of-line 1)) (if (bolp) 0 -1))))

(defun beautify-side-comments ()
(interactive)
;; Because this function does a lot of insertion, it would
;; be better to execute it in the temporary buffer, while
;; copying the original text of the file into it, such as
;; to prevent junk in the formatted buffer's history
(let ((pos (cons (save-excursion
(beginning-of-line)
(count-lines (point-min) (point)))
(- (save-excursion (end-of-line) (point)) (point))))
(content (buffer-string))
(comments '(font-lock-comment-face font-lock-comment-delimiter-face)))
(with-temp-buffer
(insert content)
(goto-char (point-min))
;; thingatpt breaks if there are overlays with their own faces
(let* ((commentp (has-face-at-point comments))
(margin
(if commentp (face-start comments) 0))
assumed-margin pre-comment commented-lines)
(while (not (eobp))
(move-end-of-line 1)
(cond
((and (has-face-at-point comments)
commentp) ; this is a comment continued from
; the previous line
(setq assumed-margin (face-start comments)
pre-comment
(buffer-substring-no-properties
(save-excursion (move-beginning-of-line 1))
(save-excursion (beginning-of-line)
(forward-char assumed-margin) (point))))
(if (every
(lambda (c) (or (char-equal c ?\ ) (char-equal c ?\t)))
pre-comment)
;; This is the comment preceded by whitespace
(setq commentp nil margin 0 commented-lines 0)
(if (<= assumed-margin margin)
;; The comment found starts on the left of
;; the margin of the comments found so far
(save-excursion
(beginning-of-line)
(forward-char assumed-margin)
(insert (make-string (- margin assumed-margin) ?\ ))
(incf commented-lines))
;; This could be optimized by going forward and
;; collecting as many comments there are, but
;; it is simpler to return and re-indent comments
;; (assuming there won't be many such cases anyway.
(setq margin assumed-margin)
(move-end-of-line (1- (- commented-lines))))))
((has-face-at-point comments)
;; This is the fresh comment
;; This entire block needs refactoring, it is
;; a repetition of the half the previous blockp
(setq assumed-margin (face-start comments)
pre-comment
(buffer-substring-no-properties
(save-excursion (move-beginning-of-line 1))
(save-excursion (beginning-of-line)
(forward-char assumed-margin) (point))))
(unless (every
(lambda (c)
(or (char-equal c ?\ ) (char-equal c ?\t)))
pre-comment)
(setq commentp t margin assumed-margin commented-lines 0)))
(commentp
;; This is the line directly after a block of comments
(setq commentp nil margin assumed-margin commented-lines 0)))
(unless (eobp) (forward-char)))
;; Retrieve back the formatted contnent
(setq content (buffer-string))))
(erase-buffer)
(insert content)
(beginning-of-buffer)
(forward-line (car pos))
(end-of-line)
(backward-char (cdr pos))))

为了更好的可读性,我还在 pastebin 上复制了它:http://pastebin.com/C2L9PRDM

编辑:这应该恢复鼠标位置但不会恢复滚动位置(可以工作,也许我只需要查看滚动的存储方式)。

关于用于 R 注释的正则表达式 Emacs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13439218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com