Emacsにカーソルを画面外に移動させます


23

この質問はもともと/programming/15895313/let-emacs-move-the-cursor-off-screenで尋ねられましたが、私が得たすべての答えは多かれ少なかれ「できません」と言われました、これはemacsでは受け入れられません。

ほとんどのGUIテキストエディタが機能するように、Emacsにカーソルを画面外に移動させることは可能ですか?これは、GUIエディターでEmacsを使用するときに気になる最大のものの1つです。下にスクロールすると、カーソルがバッファの上部に「押し込まれ」ます。

これはEmacsのアーキテクチャに組み込まれているため、これは完全に不可能であると以前は思っていましたが、セカンダリカーソルに対してこれを正確に行う複数のカーソルを見ました(スクロール機能がセカンダリで機能しないようにすると仮定します)カーソル)。複数のカーソルを使用して非表示のバッファーにメインカーソルを配置し、有効なカーソルを実際に編集することは可能ですか?それとも他の巧妙なトリックですか?または多分私のグーグルは私に失敗しました、そして、これは魔法なしで本当にすでに可能ですか?

私は端末emacsを使用しているので、そこで動作するはずです。


複数カーソルパッケージが行うことは、実際の制限の対象ではない偽のカーソルを追加することです。前回の質問の提案に基づいた回答があることを願っています。
wasamasa 14

この問題はスクロールバーの使用に固有のものだと思いますが、そうですか?
nispio 14

1
では、カーソルを持ち込まないと予想されるスクロールコマンドを使用していますか?私の経験では、PgUp / PgDnまたは矢印キーを使用すると、すべてのエディターでカーソルが追従します。
nispio 14

4
@nispioはおそらくマウスホイールでスクロールしますか?
ffevotte 14

2
ページ上およびページ下(CvおよびMv)は、カーソルが画面から移動しない限り、emacsでカーソルを移動しません。スクロールは移動(カーソル)とは異なります。
asmeurer 14

回答:


11

GNU ELPAにscroll-restore、この問題を改善しようとする新しいパッケージがあります。いくつかの異なる動作を選択できますが、自分用に設定した方法(下記参照)により、スクロールコマンド中にカーソルが非表示になり、入力を再開すると元の場所にジャンプします。

これまでのところ、いくつかのバグに遭遇しましたが、ほとんどの場合、パッケージは宣伝どおりに動作するようです。でインストールすることでテストできます

M-x package-install RET scroll-restore RET

パッケージのインストール後、次のコマンドでマイナーモードを有効にできます。

M-x scroll-restore-mode

個人的に、私はそれをScroll Lockキーにバインドしています。これは私のinitファイルに追加するものです:

(require 'scroll-restore)
(scroll-restore-mode 1)
;; Allow scroll-restore to modify the cursor face
(setq scroll-restore-handle-cursor t)
;; Make the cursor invisible while POINT is off-screen
(setq scroll-restore-cursor-type nil)
;; Jump back to the original cursor position after scrolling
(setq scroll-restore-jump-back t)
;; Toggle scroll-restore-mode with the Scroll Lock key
(global-set-key (kbd "<Scroll_Lock>") 'scroll-restore-mode)

1
キーをバインドしている場合、時々無効にしたいと思うでしょう。このモードは通常の編集には迷惑ですか?
T.バーロン14年

1
@ T.Verron現在、かなりバグが多いようです。その失敗モードの1つは、カーソルをある領域に「トラップ」し、放置しないことです。カーソルを再び解放する唯一の方法は、モードを無効にすることです。すべてのバグが解決したら、それを常に使用してもかまいません。
nispio 14年

2
これはどのように機能するはずですか?何もできないように思えます。
asmeurer 14年

5

私がいつも使用する方法は、ジャンプしたい場所にマークを設定することです。そして、バッファを熟読したら、を使用してマークをポップしC-u C-SPCます。歩き回る前にマークを設定するのを忘れた場合でも、マークをポップすると、通常、私が来た場所にかなり近く着地することがわかります。これは、一部のコマンド(isearchたとえば)が気づかないうちにマークを設定するという事実に一部起因しています。そのため、編集の過程で、パンくずリストの痕跡をうっかり残してしまいました。

ドキュメントから:

set-mark-command is an interactive compiled Lisp function in `simple.el'.

It is bound to C-@, C-SPC.

(set-mark-command ARG)

....

With prefix argument (e.g., C-u C-SPC), jump to the mark, and set the mark
from position popped off the local mark ring (this does not affect the global
mark ring).  Use C-x C-@ to jump to a mark popped off the global mark ring
(see `pop-global-mark').

ブックマークやレジスタを設定することはほとんどありませんが、C-u C-SPCまたはを使用して、どこから来たのかをすぐに見つけることができますpop-global-mark


率直に言って、人々がカーソルを画面外に移動できるようにしたい主な理由は、カーソル位置の適切な履歴がないエディタに慣れているからだと思います。また、マークscroll-upscroll-down自動的に設定するように作成することもできます。そうC-u C-SPCすれば、確実に元の場所に戻ることができます。
ラドンロズバラ16

0

次のコードは、マウスホイールのスクロール後に戻るのに十分です。

(advice-add 'mwheel-scroll :before (lambda (arg) (if (not (eq last-command 'mwheel-scroll)) (setq point-before-mwheel-scroll (window-point)))))
(defun jump-back () (goto-char point-before-mwheel-scroll))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.