2013-08-17 24 views
3

emacs中是否有命令可以取消注释整个注释块,而无需先标记它?取消注释多行而不选择它们的命令

例如,让我们说点是在下面的代码中的注释里:

(setq doing-this t) 
    ;; (progn |<--This is the point 
    ;; (er/expand-region 1) 
    ;; (uncomment-region (region-beginning) (region-end))) 

我想它可将命令这个:

(setq doing-this t) 
    (progn 
    (er/expand-region 1) 
    (uncomment-region (region-beginning) (region-end))) 

这是相当容易写(un)评论单行的命令,但我还没有找到一个尽可能多地取消注释行的命令。有没有可用的?

+0

多个游标是一个极好的包:https://github.com/magnars/multiple-cursors.el你可以去每行或该地区的每个线的右侧的左侧,同时键入或删除多行上的字符。 – lawlist

回答

3

快速回复---代码可以改进,使其更有用。例如,除了​​之外,您可能还想将其扩展到其他类型的评论。

(defun uncomment-these-lines() 
    (interactive) 
    (let ((opoint (point)) 
     beg end) 
    (save-excursion 
     (forward-line 0) 
     (while (looking-at "^;;; ") (forward-line -1)) 
     (unless (= opoint (point)) 
     (forward-line 1) 
     (setq beg (point))) 
     (goto-char opoint) 
     (forward-line 0) 
     (while (looking-at "^;;; ") (forward-line 1)) 
     (unless (= opoint (point)) 
     (setq end (point))) 
     (when (and beg end) 
     (comment-region beg end '(4)))))) 

关键是comment-region。 FWIW,我将comment-region绑定到C-x C-;。只需与C-u一起使用即可取消注释。

+0

作品!非常感谢。 – Malabarba

+0

@Drew如果你喜欢它,看一下变量'comment-start'和'comment-end'来使代码更一般。 – Thomas

+0

是的,它可以通过几种方式进行改进,包括除了';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;是,to, '在大胆。我自己并没有太多的使用这样的命令,但@BruceConnor可能会扩展它。 – Drew

3

您可以使用Emacs的注释处理函数来制作Drew命令的通用版本。

(defun uncomment-current() 
    (interactive) 
    (save-excursion 
    (goto-char (point-at-eol)) 
    (goto-char (nth 8 (syntax-ppss))) 
    (uncomment-region 
    (progn 
     (forward-comment -10000) 
     (point)) 
    (progn 
     (forward-comment 10000) 
     (point))))) 
+1

'forward-comment'“放弃”太容易了;如果点不直接在评论后面,它似乎没有捕捉任何东西。假设注释是行中的第一个非空白字符,可以通过在行程开始处添加'(行首)'来解决。 – scarlet

+1

我会使用'uncomment-region'。我首先用'(goto-char(nth 8(syntax-ppss)))'这样的东西移动到当前注释之外。 – Stefan

+0

已更新,来自scarlet和stefan的建议 –

相关问题