2016-08-17 2 views
1

Emacsがマークリングに現在の位置をスクロールしてスクロールアップしたり、1ページ上にスクロールさせたりするような一般的な方法があるかどうかを尋ねます、行にジャンプ、新しいバッファにジャンプ、テキストを検索...、私は歴史に簡単に戻ることができるように?Emacsが大きな動きごとにマークリングに移動するようにする

私の現在のソリューションは、(以下のサンプルコードのように)、関連する機能の一部をdef-adviceすることであるが、それはすべてのケースをカバーしていない、と私はdef-advice

共有してください必要があります他に何かわかりませんこの問題についてのあなたの経験どんな助けでも大歓迎です。

(defun my-set-mark() 
    (interactive) 
    (push-mark (point) t nil)) 

(defadvice find-file (before set-mark activate) (my-set-mark)) 
(defadvice goto-char (before set-mark activate) (my-set-mark)) 
(defadvice goto-line (before set-mark activate) (my-set-mark)) 
(defadvice isearch-update (before set-mark activate) (my-set-mark)) 
(defadvice beginning-of-buffer (before set-mark activate) (my-set-mark)) 
(defadvice end-of-buffer (before set-mark activate) (my-set-mark)) 
+1

非対話的に最もよく使われる関数の一つであり、おそらく* 'find-file'でもないので、' goto-char'にアドバイスしません。関数のリストで 'pre-command-hook'を使うことを考えてみましょう。たとえば、'((バッファの先頭をバッファーにするgoto-line) ) ' – lawlist

+0

' goto-line'、 'begin-of-buffer'と' end-of-buffer'は、マーク自体を残すでしょう。 – songyuanyao

+0

@songyuanyao:そうではありません。私はそれを確認してから、「解読」しなければならない。 –

答えて

1

これはうまくいくはずの解決策ですが、Emacsが遅くなる可能性があります。私はそれが少し原子力のように私はそれを使用することをお勧めしたいとは思わないが、あなたはおそらく核の解決策を必要とするこの動作を自動化したい場合。

これはテストされていないので、調整が必要な場合があります。

;; Variable to store the current point 
(defvar last-point nil) 
(defvar last-buffer nil) 
;; What constitutes a "large movement", in characters. 
(defvar large-movement 1000) 

(defun store-last-point() 
    (setq last-point (point)) 
    (setq last-buffer (current-buffer))) 

(defun magnitude (number) 
    ;; Couldn't find a built-in magnitude function. 
    ;; If anyone knows one, feel free to edit. 
    (if (>= number 0) 
     number 
    (- 0 number))) 

(defun push-mark-if-large-movement() 
    ;; If point is in the same buffer and has moved 
    ;; significantly, push mark at the original location 
    (if (and (eq last-buffer (current-buffer)) 
      (> (magnitude (- last-point (point))) large-movement)) 
     (push-mark last-point))) 

(add-hook 'pre-command-hook 'store-last-point) 
(add-hook 'post-command-hook 'push-mark-if-large-movement) 

これにより、複数の大きな動きを使用して大きなテキストセクションを選択できなくなります。それを修正したい場合は、push-mark-if-large-movementコマンドにチェックを追加する必要があります(マークが有効な場合はマークを押さないでください)。

+0

提案していただきありがとうございます。それはかなりハックな解決策です。しかし、それはすべてのコマンドにフックするので、Emacsを遅くする可能性があります。 –

+0

しかし、それは自動的にするためにすべてのコマンドにフックする必要があります。遡って古いカーソルの位置を確認することはできません。また、コマンドが実行前にポイントを移動するかどうかを確認することはかなり複雑になります。大きな移動コマンドのリストを手動で作成し、これらの関数をそれぞれのアドバイスとして追加する方が効率的です。 – JackCC

+0

ええ、私はいくつかの機能のリストにフックしています。作品ですが、一般的ではありません –

関連する問題