emacs: Bagaimana cara kembali ke posisi terakhir setelah scroll / halaman atas / bawah?

14

Setelah mengeluarkan scroll-upatau scroll-downdalam emacs, apakah ada cara cepat untuk mengembalikan titik ke posisi sebelumnya (dengan asumsi saya tidak ingat untuk menambahkannya ke cincin tanda)?

Atau adakah cara (tanpa mengganggu cincin tanda) untuk mengubah perilaku pengguliran sehingga menggulir ke atas kemudian menggulir ke bawah (atau sebaliknya) mengembalikan titik ke posisi semula? (mis. membuat scrolling memindahkan titik tepat x garis di mana x adalah tinggi layar)

Saya sedang dalam proses membiasakan diri dengan emacs dan ini adalah salah satu situasi kutukan yang paling umum: Saya menggulirkan sekitar untuk melihat bagian lain dari kode saya tanpa ingat untuk menambahkan baris saya ke cincin tanda dan kemudian menyakitkan untuk mencoba untuk memindahkan baris kode yang sedang saya kerjakan. Karena itu, sementara saya meminta solusi teknis, saya juga tertarik untuk mendengar bagaimana pengguna berpengalaman menghindari masalah ini. Apakah Anda terbiasa mengingat untuk menetapkan tanda, membagi jendela untuk melihat-lihat atau menggunakan beberapa pola lain?

Terima kasih

Ian Mackinnon
sumber

Jawaban:

13
(setq scroll-preserve-screen-position t)

Dengan pengaturan ini , jika halaman Anda naik dan turun, kursor kembali ke baris aslinya. Itu juga mempertahankan kolom aslinya di Emacs versi 23 atau lebih baru.

Anda mungkin atau mungkin tidak suka

(setq scroll-preserve-screen-position 'always)

yang selalu mempertahankan posisi layar kursor saat menggulir, daripada mempertahankan posisi kursor dalam buffer jika posisi aslinya masih terlihat.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Terima kasih dari saya juga! Selama, (umm banyak!) Tahun, saya telah mengetik "<>" sebelum bergulir, hanya memiliki target pencarian untuk kembali.
JRobert
Bagi saya ini menyebabkan scroll-up-line(yang saya gunakan dengan roda gulir saya) menyebabkan kursor bergerak maju satu karakter ketika menyentuh bagian atas atau bawah layar.
penanggung jawab
@asmeurer Saya tidak memperhatikan ini. Pasti ada sesuatu yang aneh di file init Anda atau bug di versi Emacs Anda.
Gilles 'SANGAT berhenti menjadi jahat'
Ya, saya menemukan itu setelah saya memposting ini. Saya membuka pertanyaan baru di emacs.stackexchange.com/questions/12439/… .
penanggung jawab
Saya pikir ini seharusnya (setq scroll-preserve-screen-position 'always). Kalau tidak, C-v M-vjangan meletakkan titik di tempat Anda memulai. (Posisi titik kedua terlihat di layar penuh sehingga titik tidak bergerak kembali.)
Wilfred Hughes
6

Apa yang saya temukan berfungsi dengan baik adalah menggunakan goto-last-change.el, yang memunculkan Anda kembali ke lokasi tempat Anda terakhir mengedit. Saya suka yang mengikat:

(require 'goto-last-change) ;; download this package and install in load-path
(global-set-key (kbd "C-x C-\\") 'goto-last-change)
Trey Jackson
sumber
2
Sama, tanpa perlu paket tambahan: C-_ C-f C-_(undo, move, undo).
Gilles 'SO- stop being evil'
1
@Gilles Benar, tetapi kemudian tumpukan undo Anda hanya tumbuh oleh dua elemen lagi. :)
Trey Jackson
1

Sebagai jawaban atas pertanyaan Anda tentang bagaimana saya menghindari masalah yang Anda gambarkan (mencari di tempat lain dalam kode dan kemudian kembali ke titik di mana saya bekerja) ...

Biasanya, saya akan membagi layar ketika saya perlu melihat sebentar di tempat lain. Lalu saya dapat kembali ke layar asli dengan C-x o, tidak aktif dengan C-x 1dan saya kembali normal.

Saya juga menggunakan maju dan mundur pencarian-i untuk menemukan tempat menarik tertentu dalam kode. Saya menemukan itu cara yang cukup efisien untuk menavigasi kode ketika saya tahu apa yang saya cari.

Mox
sumber
0

Jika saya hanya menggulir beberapa baris dari tempat saya saat ini, saya dapat menggunakan ini untuk menggulir jendela tanpa titik bergerak:

(defun scroll-in-place (scroll-up)
  "Scroll window up (or down) without moving point (if possible).

SCROLL-Up is non-nil to scroll up one line, nil to scroll down."
  (interactive)
  (let ((pos (point))
        (col (current-column))
        (up-or-down (if scroll-up 1 -1)))
    (scroll-up up-or-down)
    (if (pos-visible-in-window-p pos)
        (goto-char pos)
      (if (or (eq last-command 'next-line)
              (eq last-command 'previous-line))
          (move-to-column temporary-goal-column)
        (move-to-column col)
        (setq temporary-goal-column col))
      (setq this-command 'next-line))))

;;;; ------------------------------------------------------------------------
(defun scroll-up-in-place ()
  "Scroll window up without moving point (if possible)."
  (interactive)
  (scroll-in-place t))

;;;; ------------------------------------------------------------------------
(defun scroll-down-in-place ()
  "Scroll window up without moving point (if possible)."
  (interactive)
  (scroll-in-place nil))

(global-set-key (read-kbd-macro "M-<down>") 'scroll-up-in-place)
(global-set-key (read-kbd-macro "M-<up>") 'scroll-down-in-place)

Jika saya pindah ke bagian file yang sama sekali berbeda (atau ke file yang berbeda sama sekali), saya kadang-kadang menggunakan breadcrumbmeskipun ada banyak paket lain yang melakukan hal serupa.

Jika saya perlu melihat dua area kode secara bersamaan, saya akan membagi bingkai secara horizontal menjadi dua jendela dan kemudian membuang jendela kedua ketika saya selesai.

Namun, sebagian besar, saya hanya menggunakan dua frame, satu menjadi frame kerja saya saat ini dan yang lainnya adalah frame referensi saya, digunakan untuk melompati file yang sama atau yang lain.

Joe Casadonte
sumber
Jika semua yang ingin Anda lakukan adalah melihat di atas atau di bawah titik saat ini tanpa pindah ke sana, Anda dapat bersepeda C-l.
penanggung jawab