Emacs中类似Eclipse的行注释

Emacs中类似Eclipse的行注释,eclipse,emacs,comments,elisp,Eclipse,Emacs,Comments,Elisp,在Eclipse中,高亮显示多行并按Ctrl+/注释选择的每一行 Emacs有一个函数comment或uncomment region,它与我想要的很接近,但如果该区域仅部分覆盖了我试图注释的行,则其行为会有所不同 是否有任何方法使函数类似于注释或取消注释区域,但无论如何选择区域,它都会注释区域的每一行 换句话说,我希望函数的作用就像区域占据整行一样,只要区域包含该行,那么它的行为就像Eclipse的选择注释一样 EDIT:我实际上是在使用前面提到的注释或取消注释区域或行函数,而不是Emacs附

在Eclipse中,高亮显示多行并按Ctrl+/注释选择的每一行

Emacs有一个函数
comment或uncomment region
,它与我想要的很接近,但如果该区域仅部分覆盖了我试图注释的行,则其行为会有所不同

是否有任何方法使函数类似于
注释或取消注释区域
,但无论如何选择区域,它都会注释区域的每一行

换句话说,我希望函数的作用就像区域占据整行一样,只要区域包含该行,那么它的行为就像Eclipse的选择注释一样

EDIT:我实际上是在使用前面提到的
注释或取消注释区域或行
函数,而不是Emacs附带的
注释或取消注释区域


我觉得这似乎值得一提,因为前者似乎更多地反映了Eclipse中的行注释是如何工作的。也就是说,如果不存在区域,则注释点所在的线

这里有一个函数,可以实现您所描述的功能:

(defun comment-or-uncomment-region-eclipse-style (beg end &optional arg)
  (interactive "*r\nP")
  (comment-or-uncomment-region
   (save-excursion
     (goto-char beg)
     (beginning-of-line)
     (point))
   (save-excursion
     (goto-char end)
     (end-of-line)
     (point)) arg))

与Juanleon的解决方案相比,mine补充了一个事实,即如果您不选择某个区域,它将(取消)注释当前行并转到下一行(而不是根据您看不到的标记执行操作):

(取消注释或取消注释区域或行()
“注释或取消注释区域或当前行(如果没有活动区域)。”
(互动)
(完)
(如果(区域-active-p)
(setq beg(区域开始)结束(区域结束))
(setq beg(测线起始位置)end(测线结束位置)))
(注释或取消注释区域结束)
(下一行)
;; 将其绑定到F7:
(全局设置键(kbd“”)'comment-or-uncomment-region-or-line)

摘自:

FWIW,我不使用
注释或取消注释区域
。我使用
注释区域
。这是类似的,但它让您决定是取消注释还是注释。它允许您嵌套注释,而不是在区域已被注释掉时自动取消注释。在带有数字前缀arg的情况下,它使用了许多注释开始字符(例如,Lisp中的
;;;
,…等)。用一个普通的
C-u
前缀arg取消注释。我把它绑定到
C-xc-

不管怎样,我认为这是您想要的,使用
注释区域
(有关一般行为,请参见该部分):


这将保存并恢复该区域。如果只选择了一行的一部分,它就可以工作。我甚至可以自己使用它(这意味着很多,因为我已经养成了这种习惯)。

我最终结合了juanleonEhvince的答案,得到了一些更像Eclipse评论的东西

以下是最终产品:

(defun comment-eclipse ()
  (interactive)
  (let ((start (line-beginning-position))
        (end (line-end-position)))
    (when (or (not transient-mark-mode) (region-active-p))
      (setq start (save-excursion
                    (goto-char (region-beginning))
                    (beginning-of-line)
                    (point))
            end (save-excursion
                  (goto-char (region-end))
                  (end-of-line)
                  (point))))
    (comment-or-uncomment-region start end)))

如果有什么问题,请告诉我。

有一个文件提供以下信息

(defun ar-comment-or-uncomment-lor (&optional copy beg end)
  "Comment line or region, unless it's already commented:
uncomment then.
……”

之后,光标位于下一行,这允许重复执行

使用C-u时,当前行被复制并插入为上面的注释-从而在编辑时提醒以前的状态

在这里获取:


请注意,emacs 25有一个新函数
注释行
绑定到
C-x C-;

这里对Ehvince的函数做了一个小小的更改,只有在注释掉文本时,它才会前进到下一行。也就是说,如果取消注释文本,您通常希望光标保持不变

(defun comment-or-uncomment-region-or-line ()
  "Comments or uncomments the region or the current line if there's no active region."
  (interactive)
  (let (beg end)
    (if (region-active-p)
        (setq beg (region-beginning) end (region-end))
      (setq beg (line-beginning-position) end (line-end-position)))
    (comment-or-uncomment-region beg end)
    (when (comment-only-p beg end)
        (next-logical-line))))

我忽略了提到我实际使用的是这个函数,而不是Emacs附带的
注释或取消注释区域
。我想避免的行为仍然发生在这个函数中,因为如果我不选择整行,它不会以我不希望的方式进行注释。我使用的是邪恶模式,所以我没有你的pb:逐行选择区域I press“V”(而不是简单的逐字符“V”)。这是可行的,但我遇到了意外的副作用。当我再次执行该命令时,来自上一个区域的行都未注释。此外,移动该点并再次执行该命令将注释/取消注释从该区域开始的行到该点。如果没有选择区域,是否有方法更改行为,例如,仅对当前行进行注释?同时,我将尝试查看其他地方提到的
注释或取消注释区域或行
,以获得指导。此功能对于临时标记模式的用户是可以的。它不适用于“旧样式区域”的用户。如果您通过
(或(非临时标记模式)更改条件(region-active-p)
功能对这两种用户都可以。谢谢提醒!我不知道瞬态标记模式是一种更现代的东西。@RickyRobinson Emacs 25将在未来几周内到期,如果不是几天:)
(defun ar-comment-or-uncomment-lor (&optional copy beg end)
  "Comment line or region, unless it's already commented:
uncomment then.
(defun comment-or-uncomment-region-or-line ()
  "Comments or uncomments the region or the current line if there's no active region."
  (interactive)
  (let (beg end)
    (if (region-active-p)
        (setq beg (region-beginning) end (region-end))
      (setq beg (line-beginning-position) end (line-end-position)))
    (comment-or-uncomment-region beg end)
    (when (comment-only-p beg end)
        (next-logical-line))))