4

我想用C-kjs-mode 来杀死一个块或杀死当前行的其余部分。

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

我提到的功能有点像paredit-mode,但我不想启用paredit-modejs-mode因为我的要求会简单得多。当我写 js 时,有时我想杀死下面的块,比如:

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

如果光标现在介于functionand之间test,那么我使用C-kI can kill the entire block

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

只剩下一个字function。这里的 'block' 仅仅意味着 '{}' 之间的东西。

如果当前行后面没有块,C-k则应表现为其原始行为,应为(kill-line &optional ARG),默认情况下杀死行的其余部分。

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

我希望你能明白我的意思,因为我的英语很烂。任何帮助将不胜感激 !

4

2 回答 2

4

我建议不要为此使用建议,因为您可以重新绑定C-kjs-mode-map例如

(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)
于 2012-11-24T14:37:24.310 回答
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))

就我而言,Ck绑定到kill-visual-line。如果您确保Ck绑定到kill-line (使用Ch k Ck检查它),则在该函数中将kill-visual-line更改为kill-line

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

于 2012-11-24T06:14:25.783 回答