针对js-mode的emacs中的C-k的Defadvice

时间:2012-11-24 03:57:06

标签: emacs elisp paredit

我想使用 C-k 来杀死一个块或者杀死js-mode中当前行的其余部分。

在我搜索谷歌一段时间后,我认为defadvice将是答案,但我不熟悉elisp。所以我希望有人可以帮我写一下:)

我提到的功能类似paredit-mode,但我不想在paredit-mode中启用js-mode,因为我的要求会简单得多。当我写js时,有时我想杀掉跟随块,如:

function test() {
    if () {
    } else {
    }
}

如果光标现在在functiontest之间,那么我使用 C-k 我可以杀死整个块

        test() {
    if () {
    } else {
    }
}

只剩下单词function。这里的'block'仅仅意味着'{}'之间的某种东西。

如果当前行没有跟随一个块, C-k 应该表现为其原始行为,应该是(kill-line &optional ARG),默认情况下会杀掉其余行。

如果您熟悉paredit-mode,您会发现它只是一个非常简单的版本!

我希望你能理解我的意思,因为我的英语已被打破。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:4)

我建议不要使用相关建议,因为您可以在C-k中重新绑定js-mode-map。 E.g。

(defun my-kill-line-or-block (&optional arg)
  "Kill line or whole block if line ends with a block opener."
  (interactive "P")
  (if (looking-at ".*\\({[^{}\n]*$\\)")
      (kill-region (point)
                   (progn (goto-char (match-beginning 1))
                          (forward-sexp 1)
                          (point)))
    (kill-line arg)))

(define-key js-mode-map [?\C-k] 'my-kill-line-or-block)

答案 1 :(得分:1)

(defadvice kill-visual-line (around cus-kill activate)
  (unless (let ((mark-point (point)))
            (if (search-forward "{" (line-end-position) t)
                (kill-region mark-point (scan-sexps (- (point) 1) 1))))
    ad-do-it))

在我的情况下, C-k 绑定到 kill-visual-line 。如果您确保 Ck 绑定到 kill-line (使用 Ch k Ck 进行检查),请更改 kill-visual -line 到该函数中的 kill-line

PS:该功能未经过全面测试。如果{}不平衡,则扫描性别信号会发出警告信号。你可以忽略它。