4

C-kjsモードでブロックを強制終了するか、現在の行の残りを強制終了するためにを使用したいと思います。

しばらくグーグルを検索した後defadvice、答えになると思いますが、私はelispに精通していません。だから誰かが私がそれを書くのを手伝ってくれることを願っています:)

私が言及した機能は次のようなものですが、要件がはるかに単純になるため、有効にしparedit-modeたくありません。私がjsを書いているとき、時々私は次のようなフォローブロックを殺したいです:paredit-modejs-mode

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

カーソルがとの間functionにあるtest場合はC-k、ブロック全体を強制終了できます。

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

残りの単語だけでfunction。ここで、「ブロック」は単に「{}」の間の何かを意味します。

現在の行の後にブロックがない場合はC-k、元の動作として動作する必要があります。これは(kill-line &optional ARG)、デフォルトで残りの行を強制終了します。

あなたが精通しているならparedit-mode、あなたはそれの非常に単純なバージョンを見つけるでしょう!

私の英語が壊れているので、私が何を意味するのか理解していただければ幸いです。どんな助けでも大歓迎です!

4

2 に答える 2

4

C-k代わりに再バインドできるので、そのためのアドバイスを使用しないことをお勧めしますjs-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-linekill-lineに変更します。

PS:機能は完全にはテストされていません。{}のバランスが取れていない場合、scan-sexpsによって警告が通知されます。あなたはそれを無視することができます。

于 2012-11-24T06:14:25.783 に答える