Jak przewijać wiersz po wierszu w GNU Emacs?

87

Mówiąc prościej, próbuję przewijać w emacsie, takim jak w vimie i większości innych edytorów; kiedy jestem na przykład dwie linie od dołu / góry i pędzę górę / w dół ( Ctrl- p, n, , ) to idzie tylko jeden wiersz w górę lub w dół, a nie pół ekranu.

Wieża
źródło
5
Jestem przekonany, że to nigdy nie zostanie naprawione. To był brak w ostatnich latach 90-tych i nadal jest zepsuty w 2010 roku.
Steve Kuo
12
@Steve Kuo: Przestań walić - to działa zgodnie z założeniami , ale można je zmienić (lub „naprawić”) za pomocą prostego ustawienia.
Teddy
17
@Teddy i co to za „proste ustawienie”?
Steve Kuo
1
@Teddy yeah, co to jest?
Scooter
@Rook: Właściwie zalecałbym częstsze używanie z.w vimie, aby uzyskać wrażenie Emacsa ;-) Może to być niezwykłe, ale w rzeczywistości jest bardziej przydatne niż przewijanie linia po linii IMHO.
U. Windl

Odpowiedzi:

51

Zobacz niektóre sugestie dotyczące EmacsWIki:

(krok przewijania setq 1
      scroll-konserwatywnie 10000)
ars
źródło
3
Widziałem to, właściwie - obie odpowiedzi, twoja i jrockway's, ale na Wiki nie są zalecane. Niestety przyczyny takiego stanu rzeczy nie są jasno wyjaśnione. Dlatego opublikowałem pytanie, mając nadzieję, że ktoś znalazł metodę, która działa bez wad.
Rook
1
Nie rozumiem, dlaczego nie jest to zalecane. Używałem podobnej konfiguracji i działa całkiem dobrze. Aby zapewnić ci więcej, zapoznaj się z tym dokumentem przewijania kroku (zwróć uwagę na ostatnie zdanie): * Liczba linii, w których należy spróbować przewinąć okno, gdy punkt się przesunie. Jeśli to nie spowoduje przywrócenia punktu z powrotem do ramki, punkt jest wyśrodkowany. Jeśli jest to zero, punkt jest zawsze wyśrodkowany po przesunięciu się poza ramkę. Jeśli chcesz, aby przewijanie zawsze było wierszem na raz, powinieneś ustawić `scroll-conservatives 'na dużą wartość, zamiast ustawiać ją na 1.
an0
Tak, rozglądając się trochę więcej, nie widzę wiele więcej na poparcie tego ostrzeżenia na wiki. Na przykład scroll-step wydaje się być dość powszechny w wielu plikach .emacs w wyszukiwarce Google. Może autor wiki odnosi się do starej wersji emacsa?
ars
Nigdy nie miałem żadnych problemów scroll-conservatively. Ostrzeżenia przed tym są trochę dziwne - jeśli powoduje to problem, łatwo jest usunąć linię z twojego init.el!
dbr
1
@ars groups.google.com/group/gnu.emacs.help/browse_thread/thread/... więc z emacsem <23.1 i dużymi plikami może czasami przeskoczyć kursor do środka, co nie wydaje się być największym problemem
dbr
51

Jeśli chcesz dokładnie ustawić ekran, możesz użyć Ctrl-L.

  • Domyślnie umieszcza bieżącą linię na środku ekranu.

  • ESC 0 Ctrl-L umieszcza bieżącą linię na górze.

starblue
źródło
14
Nie zrozum tego źle, ale co to ma wspólnego z przewijaniem linia po linii? (czyli pytanie)
Rook
9
Zaproponowanie alternatywnego przepływu pracy, który jest (zdaniem autora) bardziej naturalny z dostępnym narzędziem, jest rozsądne. Ale powinieneś poprzedzić go zrzeczeniem się odpowiedzialności i wyjaśnić, dlaczego to podejście jest „lepsze”, jeśli w ogóle możliwe.
dmckee --- kociak ex-moderator
2
@dmckee - Używałem vim ... uhmm, długo. Bardzo dobrze z tym. Jednakże, ponieważ robię coś z seplenieniem, zacząłem zmuszać się przynajmniej do ponownego uporania się z emacsem, a ten „alternatywny” sposób poruszania się jest dla mnie w tej chwili zbyt trudny. Przeczytaj samouczek, wiedz o tym ... ale to po prostu zbyt dziwne, imho. Nie naturalnie.
Rook
1
@Idigas: Jasne. To sprawiedliwe i nie musisz korzystać z rady Starblue. Ale myślę, że tego rodzaju odpowiedź może być pomocna, jeśli jest z góry i zawiera przekonujące wyjaśnienie.
dmckee --- ex-moderator kitten
1
Tak, to wystarczy po kilku naciśnięciach klawiszy. (Wyszukałem w Google „jak przewijać wiersz po wierszu” tylko dlatego, że wydawało się to przydatnym sposobem wyszukiwania „jak sprawić, by kod trafił tam, gdzie chcę”). Dzięki!
Ennael
42

Trochę spóźniłem się na imprezę, ale jeśli nie masz nic przeciwko zainstalowaniu pakietu, to płynne przewijanie ( github , również dostępny w MELPIE ) może być tym, czego szukasz - na pewno działa dla mnie.

Po zainstalowaniu możesz umieścić następujące elementy w swoim init.el:

(require 'smooth-scrolling)
(smooth-scrolling-mode 1)
(setq smooth-scroll-margin 5)

Ostatnia linia jest opcjonalna; zaczyna się przewijać w pobliżu krawędzi ekranu, a nie przy nim, więc zawsze masz mały kontekst wokół tego punktu. Dostosuj do smaku.

Stuart Hickinbottom
źródło
7
Kiedy to przeczytałem, załamałem się i płakałem. Jestem prawie pewien, że to odpowiedź na pytanie.
Eric Brown,
3
Tak, jako użytkownik Vima wypróbowujący Emacsa właśnie tego szukałem.
juanjux,
Użyłem zarówno tego rozwiązania, jak i rozwiązania scroll-step, kombinacja jest fascynująca, gdy przejdę do szóstej linii od dołu i naciśnę, przewinie się o jedną linię i to samo od góry.
Emad Elsaid
Niestety, płynne przewijanie zawodzi teraz dość często, gdy przeskakujesz po pliku, używając np. Trybu występowania lub wyszukiwania: oba mogą przenieść punkt poza ekran i musisz nacisnąć CL, aby wyświetlić wynik.
Erik Knowles
27

Moim rozwiązaniem nie jest zmiana domyślnego przewijania Emaca, ale raczej utworzenie polecenia sekwencji klawiszy z makra. W ten sposób masz wygodny sposób przewijania jednej linii na raz, kiedy chcesz. Nie jest to idealne, ale bardzo łatwe. Tak się składa, że ​​M- (↓) i M- (↑) są dostępne, więc właśnie tego użyłem.

Tak to zrobiłem. Najpierw musisz zarejestrować makro dla przewijania jednej linii, w górę iw dół.

Rozpocznij makro

C-x ( 

Przewiń jeden w dół

C-u 1 C-v

Zatrzymaj makro

C-x )

Aby przewinąć w górę, użyj

C-u 1 M-v

Następnie musisz nazwać makro.

M-x name-last-kbd-macro

Nadaj mu nazwę po wyświetleniu monitu, na przykład:

down-one-line

Następnie użyj następującego polecenia, aby powiązać sekwencję klawiszy z nazwą polecenia:

M-x global-set-key

Po wyświetleniu monitu użyj czegoś takiego:

M-(down arrow)

Następnie zapyta cię, które polecenie chcesz powiązać i powinieneś nadać mu nazwę, którą wymyśliłeś wcześniej, np. W dół.

Tutaj mam te informacje. Poniżej i w innych miejscach można znaleźć instrukcje dotyczące dodawania makra do pliku .emacs.

Tutaj wyjaśnienie definicji makr

Tutaj, jak kontrolować przewijanie

Josh Cason
źródło
22

Używam ich w moim .emacspliku od 2000 roku.

(global-set-key (quote [M-down]) (quote View-scroll-line-forward))
(global-set-key (quote [M-up]) (quote View-scroll-line-backward)) 

W ten sposób mogę zachować domyślne zachowanie Emacsa, a także przewijać jedną linię na raz, w zależności od tego, co robię.

To działało aż przynajmniej GNU Emacs 22. Niedawno przeniesieni do Emacs 24 i odkrył, że View-scroll-line-forwardi View-scroll-line-backwardnie są już dostępne. Po pewnym polowaniu odkryłem, że działa przewijanie w górę iw dół. Więc jeśli używasz Emacsa 24, możesz tego użyć.

(global-set-key (quote [M-down]) (quote scroll-up-line))
(global-set-key (quote [M-up]) (quote scroll-down-line)) 

Przeważnie pomijałem Emacsa 23, więc jeśli jest to wersja, której używasz, możesz eksperymentować z obydwoma powyższymi.

Uwaga: scroll-up-linefaktycznie przewija jeden wiersz w dół , ponieważ bufor jest przenoszony o jeden wiersz w górę.

Rajesh J Advani
źródło
Dzięki, to działa ... ale trafiłem na inny problem, o który tutaj zapytałem: stackoverflow.com/questions/19256551/ ...
scorpiodawg
13

Ponownie przypisuję klawisze strzałek, aby wykonywać operacje przewijania.

(global-set-key [up] (lambda () (interactive) (scroll-down 1)))
(global-set-key [down] (lambda () (interactive) (scroll-up 1)))

(global-set-key [left] (lambda () (interactive) (scroll-right tab-width t)))
(global-set-key [right] (lambda () (interactive) (scroll-left tab-width t)))
Derek Slager
źródło
2
To nie jest dokładnie to, czego szukałem. Nie chcę, żeby ekran się przewijał (jakby chciał, żeby blokada przewijania była włączona), ale żeby ekran się "poruszał" ... och, ... jak to robi notatnik :)
Rook
12

Upraszczają to:

(global-set-key [M-up] (lambda () (interactive) (scroll-up 1)))
(global-set-key [M-down] (lambda () (interactive) (scroll-down 1)))

następnie kursor meta w górę przesuwa się w górę, a kursor meta w dół przesuwa się w dół.

CO BYŁO DO OKAZANIA. Nie jestem pewien, co palili wszyscy powyżsi ludzie!

Adam
źródło
Lub, jak właśnie napisałem, możesz użyć scroll-up-line i scroll-down-line.
Rajesh J Advani
5

Mam następujące elementy w moim pliku .emacs, aby włączyć ładne zachowanie przewijania ctrl-up, ctrl-down. Używam tego również do kółka myszy.

(defun scroll-down-in-place (n)
  (interactive "p")
  (previous-line n)
  (scroll-down n))

(defun scroll-up-in-place (n)
  (interactive "p")
  (next-line n)
  (scroll-up n))

(global-set-key [mouse-4] 'scroll-down-in-place)
(global-set-key [mouse-5] 'scroll-up-in-place)
(global-set-key [C-up] 'scroll-down-in-place)
(global-set-key [C-down] 'scroll-up-in-place)
Alex B.
źródło
Właśnie tego próbowałem, ale nie takiego zachowania szukałem. Pozwala zejść do ostatniej linii na ekranie, ale po kliknięciu nadal „szarpie ekran o kilka linii w górę”… nie wiem, jak to lepiej wyjaśnić.
Rook
Podoba mi się pomysł mapowania kółka myszy. Ale czy wbudowane View-scroll-line-forward i View-scroll-line-backward (lub nowsza wersja scroll-up-line i scroll-down-line) nie działałyby zamiast definiować własne funkcje?
Rajesh J Advani
2

Aby przewijać "vim", umieść to w swoim pliku .emacs:

(defun next-line-and-recenter () (interactive) (next-line) (recenter))
(defun previous-line-and-recenter () (interactive) (previous-line) (recenter))
(global-set-key (kbd "C-n") 'next-line-and-recenter)
(global-set-key (kbd "C-p") 'previous-line-and-recenter)
jjpikoov
źródło
@Matt to robi dla mnie
jjpikoov
2

Ponieważ używanie polecenia może być denerwujące M-up, M-downponieważ koliduje z trybem org, który przeciąża te polecenia. Aby uniknąć tego problemu, osobiście używam tych poleceń, które łączą się M-page-up M-page-down. ”Tutaj zdefiniowałem przewijanie w górę iw dół do 1 linii.

;;;scroll by `number-of-lines' without the cursor attached to the screen
(global-set-key [M-prior] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-down number-of-lines)
                                                  (forward-line (- number-of-lines)))))
(global-set-key [M-next] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-up number-of-lines)
                                                  (forward-line number-of-lines))))

;;;scroll by `number-of-lines' with the cursor attached to the screen
(global-set-key [S-M-prior] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-down number-of-lines))))
(global-set-key [S-M-next] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-up number-of-lines))))
romwel
źródło
1

M-x customize-variable scroll-conservatively

Ustaw go na 1.

Jednak naprawdę nie chcesz tego robić.

jrockway
źródło
5
Widziałem to, właściwie - obie odpowiedzi, twoja i ars, ale na Wiki nie są zalecane. Niestety przyczyny takiego stanu rzeczy nie są jasno wyjaśnione. Dlatego opublikowałem pytanie, mając nadzieję, że ktoś znalazł metodę, która działa bez wad.
Rook
3
przydałoby się, gdybyś mógł wyjaśnić nam, noobsom, dlaczego to nie jest dobry pomysł.
Daniel
Jedynym powodem, dla którego mogę pomyśleć, dlaczego nie jest to dobry pomysł, jest to, że przewijanie staje się powolne: zawsze będziesz musiał przewijać o jedną linię na raz, zamiast domyślnego półekranowego. (Chyba?)
ShreevatsaR
1

Jeśli szukasz szybkiego sposobu na stworzenie efektu podobnego do przewijania, wprowadź C-ni C-lsekwencyjnie przesuwaj kursor w dół, a następnie wyśrodkuj go.

Michael David Watson
źródło
0

Jeśli uruchomisz emacsa w .xsession, w moim przypadku ustawienie scroll-konserwatywne na 100+ nie zadziała, ani scroll-step 1. Ale jeśli uruchomisz emacsa po X, zadziała.

seb
źródło
0

Jeśli nie masz nic przeciwko używaniu myszy i masz kółko przewijania, możesz dostosować zmienną wielkość przewijania kółkiem myszy, wykonując jedną z poniższych czynności:

Ch v ilość przewijania kółkiem myszy (kliknij dostosuj, zmień wartość na „Określona liczba wierszy” 1, Zastosuj i zapisz).

lub dodaj do .emacs wiersz: '(mouse-wheel-scroll-amount' (1 ((shift). 1) ((meta)) ((control). text-scale)))

Istnieje wiele możliwości wymienionych na https://www.emacswiki.org/emacs/Scrolling

Philip
źródło