17

JetBrains 製品には、編集を行ったすべてのスポットにアクセスできる非常に便利なキー バインディングがあります。キーを 1 回押すと最後の編集 (ファイルと場所) に移動し、キーを押し続けると以前の編集に戻ります。通常、同じ場所を何度も編集したいのは編集時です。多くのバッファが開いていて、その多くが編集されていない場合、これはさらに便利です。

Emacs にはマーク リングがありますが、それはまったく同じものではありません。

関連するメモとして、emacs gitアドオンであるmagitに編集にジャンプする機能はありますか?

4

5 に答える 5

6

元に戻す場所のチェーンを前後に移動できるようにするGotoChgがあります。サンプルの初期化コード スニペット:

(require 'goto-chg)
(global-set-key [(control ?.)] 'goto-last-change)
(global-set-key [(control ?,)] 'goto-last-change-reverse)

(他の代替手段、GotoLastChange および session.el と同様に、バッファ間をジャンプすることはできません)

于 2013-12-11T03:28:25.237 に答える
3

session.elにはコマンドsession-jump-to-last-changeがあり、元に戻す場所のチェーンに沿って移動できます。初期化コード スニペット:

(require 'session)
(setq session-jump-undo-threshold 80)  ; default was 240
(global-set-key [(control ?.)] 'session-jump-to-last-change)

(他の選択肢である GotoLastChange と GotoChg と同様に、バッファ間をジャンプすることはできません)

于 2013-12-11T03:35:25.147 に答える
3

グローバル、マルチバッファgoto-last-change:

;;; record two different file's last change. cycle them
(defvar feng-last-change-pos1 nil)
(defvar feng-last-change-pos2 nil)

(defun feng-swap-last-changes ()
  (when feng-last-change-pos2
    (let ((tmp feng-last-change-pos2))
      (setf feng-last-change-pos2 feng-last-change-pos1
            feng-last-change-pos1 tmp))))

(defun feng-goto-last-change ()
  (interactive)
  (when feng-last-change-pos1
    (let* ((buffer (find-file-noselect (car feng-last-change-pos1)))
           (win (get-buffer-window buffer)))
      (if win
          (select-window win)
        (switch-to-buffer-other-window buffer))
      (goto-char (cdr feng-last-change-pos1))
      (feng-swap-last-changes))))

(defun feng-buffer-change-hook (beg end len)
  (let ((bfn (buffer-file-name))
        (file (car feng-last-change-pos1)))
    (when bfn
      (if (or (not file) (equal bfn file)) ;; change the same file
          (setq feng-last-change-pos1 (cons bfn end))
        (progn (setq feng-last-change-pos2 (cons bfn end))
               (feng-swap-last-changes))))))

(add-hook 'after-change-functions 'feng-buffer-change-hook)
;;; just quick to reach
(global-set-key (kbd "M-`") 'feng-goto-last-change)

http://shenfeng.me/emacs-last-edit-location.htmlから

この実装は、任意のバッファーの最後の 2 つの変更に対して機能します。変更リストの長さを 2 を超えて拡張することはそれほど難しくないと思います。

于 2016-12-26T20:23:06.003 に答える
3

シングルバッファ

編集を追跡し、編集が行われた場所に戻るかどうかは、編集の種類によって異なります。
編集で何かを追加した場合は、かなり単純な方法で元に戻すことができます:

(goto-char (car(cadr  buffer-undo-list)))

削除した場合は、次の方法で元に戻すことができます。

(goto-char (abs (cdr(cadr  buffer-undo-list))))

そして、ミニバッファーで削除したものを表示したいかもしれません:

(progn
 (goto-char (abs (cdr(cadr  buffer-undo-list))))
 (message "DEL->: %s"  (substring-no-properties (car(cadr  buffer-undo-list)))))

要約:

(defun last-edit ()
  "Go back to last add/delete edit"
  (interactive)
  (let* ((ubuf (cadr buffer-undo-list))
     (beg (car ubuf))
     (end (cdr ubuf)))
    (cond
     ((integerp beg) (goto-char beg))
     ((stringp beg) (goto-char (abs end))
      (message "DEL-> %s" (substring-no-properties beg)))
     (t (message "No add/delete edit occurred")))))

読んC-h v buffer-undo-listで、テキスト プロパティの設定など、それほど微妙でない編集のためにこれを統合することができます (本当に必要であると仮定します)。

マルチバッファ

変数を使用buffer-undo-listしてタスクを実行しました。バッファごとに個別のリストがあり、私の知る限り、グローバルな取り消しリストはありません。ほとんどの場合、何かを入力したバッファーを知っていて、Emacs に編集した場所に移動させたいと考えています。この場合、global-mark-ring行ったバッファのシーケンスを記録する単一の変数があります。

コマンド Meta-Xpop-global-markまたは単に Ctrl- X Ctrl-を連続して使用すると、Space以前にアクセスしたバッファー (およびマーク位置) に移動します。ターゲット バッファに到達したら、Meta- Xlast-edit(またはバインドされたキー) をトリガーできます。

于 2014-08-18T19:09:23.063 に答える