2009-10-05 14 views
20

Zastanawiam się, czy emacs ma wbudowane komendy ruchu kursora, czy też będę musiał je zapisać lub znaleźć jakiś fragment. uważam je za dość spore i stosuję je regularnie w vimie. nie znalazłem ich dotychczas w dokumentacji emacsa.emacs odpowiednik vima's shift-h i shift-l

w vim wyglądają następująco: przesunięcie H -> ruch kursora na górę ekranu przesuwnego-M -> ruch kursora na środek ekranu przesunięcie l -> kursora przesunięcie do dolna część ekranu:

żeby wyjaśnić, nie chcę przesuwać kursora do górnej/dolnej części dokumentu, tylko do górnej/dolnej części aktualnie widocznej części dokumentu, tj. części, która jest aktualnie wyświetlana wyświetlane na ekranie.

Znalazłem jeden z nich do tej pory. alt-r wydaje się być odpowiednikiem shift-m vima. przesuwa kursor do pierwszej kolumny środkowej linii.

Odpowiedz

28

Zastosowanie:

  • Alt+0 Alt+r - górnej części okna
  • Alt+- Alt+r - dołu okna

Ściśle, to powinno być napisane jak M-0 M-r na górze ekranu i M-- M-r na dole ekranu. Gdzie M oznacza klucz, który jest zwykle mapowany na Alt.

Pracowałem z tych klawiszy w następujący sposób:

M-r uruchamia polecenie move-to-window-line. Znalazłem to z C-h k M-r, tj. Ctrl+h, k, Alt+r. The key sequence C-h k means tell me what the next key sequence does. Powiedział mi nazwę polecenia, a także, że możesz przekazać argumenty numeryczne do polecenia, aby wybrać linię, do której chcesz przejść. Jeśli nie przejdziesz żadnego, przesuwa punkt na środek okna, tak jak widziałeś.

Możesz przekazywać argumenty liczbowe do poleceń przez typing a number while holding down Meta. Sam znak minus przyjmuje wartość -1. Teraz, aby przejść na górę ekranu, chcemy przejść linię 0 i na dole linii ekranu -1. Daje nam to kluczowe sekwencje powyżej.

Jeśli chcesz powiązać move-to-window-line z innym kluczem look at Joe's answer to this question.

+2

stosowania: - 'M- = Mr' - pośrodku okna – huntar

+0

smartparens wiąże' 'Mr' do sp-splice-s-wyrażenie zabijania-around', więc może okazać się pomocne, aby zmienić domyślną Emacs ('move-to-window-line-top-bottom') do' MR'. –

8

Funkcja chcesz użyć jest move-to-window-line, którego definicja brzmi:

move-to-window-line is an interactive built-in function in `C source 
code'. 

It is bound to M-r. 
(move-to-window-line arg) 

Position point relative to window. 
With no argument, position point at center of window. 
An argument specifies vertical position within the window; 
zero means top of window, negative means relative to bottom of window. 

nazwałbyś go z 0 iść do góry strony i -1 aby przejść do dołu strony . Mogą być powiązane z kluczem z anonimową funkcją lub nazwaną funkcją. Podano przykłady obu.

anonimowych Funkcje

(global-set-key [(f4)] (function 
         (lambda() 
          "Go to top of page." 
          (interactive) 
          (move-to-window-line 0)))) 

(global-set-key [(f4)] (function 
         (lambda() 
          "Go to bottom of page." 
          (interactive) 
          (move-to-window-line -1)))) 

funkcjach nazwanych

(defun my-top-of-page() 
    "Go to top of page." 
    (interactive) 
    (move-to-window-line 0)) 

(defun my-bottom-of-page() 
    "Go to bottom of page." 
    (interactive) 
    (move-to-window-line -1)) 

(global-set-key [(f4)] 'my-top-of-page) 
(global-set-key [(shift f4)] 'my-bottom-of-page) 
0

Jeśli używasz Emacs 23, to po prostu C-l. Za pierwszym razem trafi do centrum, za drugim razem trafi na sam szczyt, za trzecim razem pójdzie na sam dół.

EDIT:

Ups, mój błąd, że stawia bieżącą linię w centrum/górnej/dolnej części okna. Nadal przydatny chociaż :)

2

Aby dodać do Joe i odpowiedzi Dave'a, można uzyskać środku z:

(defun bp-goto-center() 
    "move cursor to middle line" 
    (interactive) 
    (move-to-window-line (/ (window-height) 2))) 

(dodam bp do przodu wszystkich moich funkcji, aby odróżnić je od wbudowanych wtyczek, lub inne osoby ... możesz je usunąć.)

+2

Chciałbym dać +1 tej odpowiedzi, ale twój blok kodu nie jest sformatowany (tak, jestem pedantyczny!) – mgalgs

+0

Potrzebowałem wykonać następujące czynności, aby uzyskać środek do pracy, '(przesunięcie do linii okna (/ (okno) -buffer-height (get-buffer-window)) 2)) '. –

7

W Emacs 23.2, Pan robi dokładnie to, co chcesz.

Pierwsze wywołanie tego polecenia powoduje przesunięcie punktu do środka aktualnie widocznego okna, kolejne kolejne wywołania są przenoszone na górę i na dół.

Nie są potrzebne żadne dodatkowe funkcje konfiguracyjne ani niestandardowe.

1

Zauważyłem, że move-to-window-line nie przestrzega window-buffer-height. W rzeczywistości nie zapewnia on zachowania, które ma Vim, gdy rozmiar bufora jest mniejszy niż okno. Ponieważ nie używam Emacsa z terminala, ani nie dbam o zminimalizowanie jego ramki, wybrałem ponowne użycie jego klucza prefiksu, ponieważ "z" przypomina mi Vima o zt, zm i zb (a także dlatego, że " zamierzam użyć poniższych w połączeniu z Emacsem 'C-l, aby osiągnąć ten sam ogólny efekt).

(define-prefix-command 'ctl-z-map) 
(defun move-to-window-line-top() 
    (interactive) 
    (move-to-window-line 0)) 
(defun move-to-window-line-middle() 
    (interactive) 
    (let* ((wb-height (window-buffer-height (get-buffer-window))) 
     (actual-height (if (> wb-height (window-height)) 
          (window-height) 
         wb-height))) 
    (move-to-window-line (/ actual-height 2)))) 
(defun move-to-window-line-bottom() 
    (interactive) 
    (move-to-window-line -1) 
    (beginning-of-line)) 
(define-key ctl-z-map (kbd "h") 'move-to-window-line-top) 
(define-key ctl-z-map (kbd "m") 'move-to-window-line-middle) 
(define-key ctl-z-map (kbd "l") 'move-to-window-line-bottom) 
(global-set-key (kbd "C-z") 'ctl-z-map)