Biarkan Emacs memindahkan kursor ke layar

23

Pertanyaan ini awalnya ditanyakan di /programming/15895313/let-emacs-move-the-cursor-off-screen , tetapi semua jawaban yang saya dapat kurang lebih mengatakan "tidak bisa dilakukan" , yang dengan emacs saya tidak terima.

Apakah mungkin membiarkan Emacs memindahkan kursor ke layar, seperti kebanyakan editor teks GUI bekerja? Ini adalah salah satu hal terbesar yang mengganggu saya ketika saya menggunakan Emacs atas editor GUI mana pun. Ketika saya gulir ke bawah, kursor "didorong ke depan" oleh bagian atas buffer.

Saya sebelumnya berpikir bahwa ini benar-benar mustahil, karena ini terprogram dalam arsitektur Emacs, tetapi kemudian saya melihat multi-kursor, yang melakukan hal ini untuk kursor sekunder (dengan asumsi Anda mencegah fungsi gulir dari bekerja pada sekunder) kursor). Apakah mungkin menggunakan beberapa kursor untuk memiliki kursor utama dalam beberapa buffer tersembunyi, dan kursor efektif adalah yang sebenarnya saya sunting? Atau mungkin beberapa trik pintar lainnya? Atau mungkin Googling saya telah mengecewakan saya dan ini benar-benar mungkin terjadi tanpa sihir?

Saya menggunakan terminal emacs, jadi itu seharusnya berfungsi di sana.

penilai
sumber
Perlu diingat bahwa semua paket multi-kursor tidak menambahkan kursor palsu yang tidak tunduk pada pembatasan yang asli. Saya harap akan ada jawaban berdasarkan saran dari pertanyaan Anda sebelumnya.
wasamasa
Saya berasumsi bahwa masalah ini khusus untuk menggunakan bilah gulir, apakah itu benar?
nispio
1
Jadi, perintah gulir apa yang Anda gunakan yang Anda harapkan tidak membawa kursor? Dalam pengalaman saya, kursor mengikuti Anda di semua editor saat menggunakan PgUp / PgDn atau tombol panah.
nispio
4
@nispio mungkin bergulir dengan roda mouse?
ffevotte
2
Halaman naik dan turun (Cv dan Mv) tidak memindahkan kursor dalam emacs kecuali kursor bergerak dari layar. Menggulir berbeda dari bergerak (kursor).
penanggung jawab

Jawaban:

11

Ada paket baru yang tersedia di GNU ELPA yang disebut scroll-restoreyang mencoba untuk memperbaiki masalah ini. Ada beberapa perilaku berbeda untuk dipilih, tetapi cara saya mengonfigurasinya sendiri (lihat di bawah) menyebabkan kursor menjadi tidak terlihat selama perintah bergulir, dan kemudian melompat kembali ke lokasi semula ketika saya mulai mengetik lagi.

Sejauh ini, saya telah menemukan beberapa bug, tetapi paket tersebut tampaknya berfungsi seperti yang diiklankan sebagian besar. Anda dapat mengujinya dengan menginstalnya dengan

M-x package-install RET scroll-restore RET

Setelah paket diinstal, Anda dapat mengaktifkan mode minor dengan

M-x scroll-restore-mode

Secara pribadi, saya mengikatnya pada Scroll Lockkunci karena tampaknya sangat luar biasa! Inilah yang saya tambahkan ke file init saya:

(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)
nispio
sumber
1
Jika Anda telah mengikat kunci untuk itu, saya kira Anda ingin menonaktifkannya kadang-kadang. Apakah mode ini mengganggu untuk pengeditan normal?
T. Verron
1
@ T. Verron Tampaknya cukup bermasalah saat ini, dan salah satu mode kegagalannya adalah "menjebak" kursor Anda di suatu daerah dan tidak membiarkannya pergi. Satu-satunya cara saya menemukan untuk membebaskan kursor saya lagi adalah menonaktifkan mode. Setelah semua bug diselesaikan, saya tidak keberatan menggunakannya sepanjang waktu.
nispio
2
Bagaimana cara kerjanya? Sepertinya saya tidak bisa melakukan apa pun.
penanggung jawab
5

Metode yang selalu saya gunakan adalah untuk menetapkan tanda di mana saya ingin melompat kembali ke, dan kemudian ketika saya selesai membaca buffer, saya pop menggunakan tanda C-u C-SPC. Bahkan ketika saya lupa untuk menetapkan tanda sebelum berkeliaran, saya menemukan bahwa bermunculan tanda biasanya mendarat saya cukup dekat dengan tempat saya berasal. Ini sebagian disebabkan oleh fakta bahwa beberapa perintah (seperti isearchmisalnya) menetapkan tanda tanpa Anda sadari. Jadi selama proses pengeditan Anda, Anda secara tidak sengaja meninggalkan sedikit remah roti.

Dari dokumentasi:

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').

Saya hampir tidak pernah repot dengan mengatur bookmark atau register, tetapi saya hampir selalu dapat menemukan jalan kembali dari mana saya berasal dengan cepat menggunakan salah satu C-u C-SPCatau pop-global-mark.

nispio
sumber
Terus terang, saya pikir alasan utama orang ingin kursor dapat keluar dari layar adalah karena mereka terbiasa dengan editor yang tidak memiliki riwayat posisi kursor yang tepat. Anda juga dapat membuatnya sehingga scroll-updan scroll-downsecara otomatis mengatur tanda, sehingga C-u C-SPCpasti akan membawa Anda kembali ke tempat asal Anda.
Radon Rosborough
0

Kode berikut cukup baik bagi saya untuk melompat kembali setelah gulir roda mouse:

(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))
Ahung
sumber