1

単語を殺す関数をemacsに実装するにはどうすればよいですか。その後、すぐに再度呼び出されると、おそらく と呼ばれる行全体が殺されkill-word-or-lineます。私は少し elisp n00b ですが、誰かが同じように動作する関数、つまり 2 回続けて呼び出されたときに異なるアクションを実行する関数を教えてくれれば、自分でできるかもしれません。

キルラインバージョンが呼び出された場合、キルリングに完全な行が含まれているとよいでしょう。つまり、行がキルされる前に、キルされた単語を再度挿入する必要があると思います。以下に例を示します: ('|' はポイント位置を示します)

This is an exam|ple line.

; kill-word-or-line初めて電話して、次のようなものを入手してください...

This is an | line.

; もう一度電話kill-word-or-lineして...

| |

キルリングには と が含まれている必要がexampleありますThis is an example line.

4

2 に答える 2

4

last-command変数には、対話的に実行された最後のコマンドが含まれます。これを使用して、同じコマンドが連続して 2 回呼び出されるかどうかをテストできます。

(defun kill-word-or-line ()
  (interactive)
  (if (eq last-command 'kill-word-or-line)
      (message "kill line")
    (message "kill word")))

このメカニズムは、たとえば次の実装で使用されます。undo

于 2013-06-04T12:22:00.483 に答える
2

次のアドバイスを使用してkill-region、選択した領域を削除するか、最初にポイントの単語を削除してから行全体を削除することができます。

単語または行を殺す
(defadvice kill-region (before slick-cut-line first activate compile)
  "When called interactively kill the current word or line.

Calling it once without a region will kill the current word.
Calling it a second time will kill the current line."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
    (if (eq last-command 'kill-region)
        (progn
          ;; Return the previous kill to rebuild the line
          (yank)
          ;; Add a blank kill, otherwise the word gets appended.
          ;; Change to (kill-new "" t) to remove the word and only
          ;; keep the whole line.
          (kill-new "")
          (message "Killed Line")
          (list (line-beginning-position)
                (line-beginning-position 2)))
      (save-excursion
        (forward-char)
        (backward-word)
        (mark-word)
        (message "Killed Word")
        (list (mark) (point)))))))

これは同じことを行いますが、殺すのではなくコピーします。

単語または行をコピーする
(defadvice kill-ring-save (before slick-copy-line activate compile)
  "When called interactively with no region, copy the word or line

Calling it once without a region will copy the current word.
Calling it a second time will copy the current line."
    (interactive
     (if mark-active (list (region-beginning) (region-end))
       (if (eq last-command 'kill-ring-save)
           (progn
             ;; Uncomment to only keep the line in the kill ring
             ;; (kill-new "" t)
             (message "Copied line")
             (list (line-beginning-position)
                   (line-beginning-position 2)))
         (save-excursion
           (forward-char)
           (backward-word)
           (mark-word)
           (message "Copied word")
           (list (mark) (point)))))))

どちらも、このブログ投稿のコマンドを基にしています。

于 2013-06-05T14:10:52.440 に答える