emacs: Kaydırma / sayfa yukarı / aşağıdan sonra son konuma nasıl dönülür?


14

Verdikten scroll-upveya scroll-downemacs yaptıktan sonra , noktayı önceki konumuna geri döndürmenin hızlı bir yolu var mı (işaret halkasına eklemeyi hatırlamadığımı varsayarak)?

Alternatif olarak, kaydırma davranışını değiştirmenin herhangi bir yolu (işaret halkasına müdahale etmeden), böylece yukarı kaydırma ve sonra aşağı kaydırma (veya tersi) noktayı orijinal konumuna döndürür? (örneğin, kaydırmanın noktayı tam olarak x satır hareket ettirmesini sağlayın; burada x, ekran yüksekliğidir)

Kendimi emac'lara alıştırma sürecindeyim ve bu en yaygın lanet olası durumlardan biridir: Kodumu başka bir parçasını işaretleme halkasına eklemeyi hatırlamaksızın kaydırıyorum ve sonra denemek acı verici üzerinde çalıştığım kod satırını değiştirmek için. Bu nedenle, teknik bir çözüm isterken, deneyimli kullanıcıların bu sorunu nasıl önlediğini de duymak isterim. Sadece bir işaret belirlemeyi, etrafa bakmak için pencereyi bölmeyi veya başka bir desen kullanmayı hatırlamaya alışıyor musunuz?

Teşekkürler

Yanıtlar:


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

Bu ayar ile , yukarı ve aşağı sayfa açarsanız, imleç orijinal satırına döner. Ayrıca orijinal sütununu Emacs sürüm 23 veya daha yeni bir sürümde tutar.

Tercih edebilir veya etmeyebilirsiniz

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

orijinal konum hala görünür durumdaysa, imlecin arabellekteki konumunu korumak yerine, kaydırma sırasında her zaman imlecin ekran konumunu korur.


2
Benden de teşekkürler! (Umm birçok!) Yıl boyunca, kaydırma yapmadan önce "<>" yazdım, sadece geri dönmek için bir arama hedefi var.
JRobert

Benim için bu scroll-up-line, imlecin ekranın üstüne veya altına çarptığında imlecin bir karakter ileri gitmesine neden olmasına neden olur (kaydırma tekerleğim ile kullandığım şey).
asmeurer

@asmeurer Bunu gözlemlemiyorum. İnit dosyanızda garip bir şey veya Emacs sürümünüzde bir hata olmalı.
Gilles 'SO- kötü olmayı bırak'

Evet, bunu gönderdikten sonra anladım. Emacs.stackexchange.com/questions/12439/… adresinde yeni bir soru açtım .
asmeurer

Bunun olması gerektiğini düşünüyorum (setq scroll-preserve-screen-position 'always). Aksi takdirde, C-v M-vnoktayı başladığınız yere geri koymaz. (İkinci nokta konumu ilk taramada görünür, bu yüzden nokta geri hareket etmez.)
Wilfred Hughes

6

İyi çalıştığımı bulduğum şey goto-last-change.el, sizi en son düzenleme yaptığınız yere geri götürüyor. Bağlamayı seviyorum:

(require 'goto-last-change) ;; download this package and install in load-path
(global-set-key (kbd "C-x C-\\") 'goto-last-change)

2
Aynı şekilde, ek bir pakete gerek kalmadan: C-_ C-f C-_(geri al, taşı, geri al).
Gilles 'SO- kötü olmayı bırak'

1
@Gilles True, ancak geri alma yığınınız iki öğe daha büyüdü. :)
Trey Jackson

1

Açıkladığınız sorunu nasıl önlediğime dair sorunuza cevap olarak (kodun başka bir yerine bakın ve sonra çalıştığım noktaya geri dönün) ...

Tipik olarak, başka bir yere kısaca bakmam gerektiğinde ekranı bölerim. Sonra ile orijinal ekranına dönebilirim C-x o, ile ayrılır C-x 1ve normale dönerim.

Ben de kod belirli bir ilgi noktası bulmak için ileri ve geri i-arama kullanın. Ne aradığımı bildiğimde kodda gezinmenin oldukça etkili bir yolu olduğunu düşünüyorum.


0

Şu anda bulunduğum yerden sadece birkaç satır kaydırıyorsam, pencereyi hareket noktası olmadan kaydırmak için bunu kullanabilirim:

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

Bir dosyanın tamamen farklı bir bölümüne (veya tamamen farklı bir dosyaya) geçiyorsam, bazen breadcrumbbenzer şeyler yapan birçok paket olsa da kullanıyorum .

Görsel olarak aynı anda iki kod alanını görmem gerekirse, çerçeveyi yatay olarak iki pencereye bölerim ve bitince ikinci pencereyi atarım.

Çoğunlukla, sadece iki çerçeve kullanıyorum, biri mevcut çalışma çerçevem ​​ve diğeri de aynı veya başka dosyaların etrafında atlamak için kullanılan referans çerçevem.


Yapmak istediğiniz tek şey oraya gitmeden mevcut noktanın üstünde veya altında görmekse, bisiklete binebilirsiniz C-l.
asmeurer

0

Paket Geri Yükleme Noktası , tam olarak tarif ettiğiniz şeyi kutudan çıkarır.

Bir dizi (yapılandırılabilir) komutun yürütülüp yürütülmediğini kontrol eder (varsayılan olarak, komutları işaretle, kaydırma ve sayfa yukarı / aşağı) ve daha sonra keyboard-quitgenellikle C-gveya öğesine bağlı olarak önceki nokta (imleç) konumuna geri dönmenizi sağlar ESC.

Feragatname: Bu paketin yazarıyım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.