Подтвердить что ты не робот

Emacs эквивалент vim shift-h и shift-l

Мне интересно, есть ли в emacs эти команды перемещения курсора, или если мне нужно будет их написать или найти фрагмент где-нибудь. я нахожу их довольно шикарными и регулярно их использую в vim. Я пока не нашел их в документации emacs.

в vim они выглядят так: shift-h → переместить курсор в верхнюю часть экрана shift-m → перемещать курсор в середину экрана shift-l → переместить курсор в нижнюю часть экрана

просто для уточнения, я не хочу переместить курсор в верхнюю/нижнюю часть документа, только в верхнюю/нижнюю часть видимой в данный момент части документа, то есть на ту часть, которая отображается на экране.

Я нашел один из них до сих пор. alt-r, похоже, эквивалентен vim shift-m. он перемещает курсор в первый столбец средней линии.

4b9b3361

Ответ 1

Использование:

  • Alt+0 Alt+r - верх окна
  • Alt+- Alt+r - внизу окна

Строго, они должны быть записаны как M-0 M-r для верхней части экрана и M-- M-r для нижней части экрана. Где M означает ключ Meta, который обычно отображается на Alt.

Я разработал эти нажатия клавиш следующим образом:

M-r запускается команда move-to-window-line. Я нашел это с помощью C-h k M-r, т.е. Ctrl+h, k, Alt+r. Последовательность клавиш C-h k означает, скажите мне, что делает следующая последовательность клавиш. Он сказал мне имя команды, а также что вы можете передавать числовые аргументы к команде, чтобы выбрать линию, к которой вы хотите перейти. Если вы не пройдете, он перемещает точку в середину окна, как вы видели.

Вы передаете числовые аргументы в команды введите номер, удерживая Мета. Знак минус сам по себе считается равным -1. Теперь, чтобы перейти в верхнюю часть экрана, мы хотим передать строку 0 и нижнюю часть строки экрана -1. Это дает нам ключевые последовательности выше.

Если вы хотите привязать move-to-window-line к другому ключу посмотрите на ответ Джо на этот вопрос.

Ответ 2

Функция, которую вы хотите использовать, move-to-window-line, определение которой:

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.

Вы бы назвали его 0, чтобы перейти в начало страницы и -1, чтобы перейти к нижней части страницы. Они могут быть привязаны к ключу с анонимной функцией или именованной функцией. Приводятся примеры обоих.

Анонимные функции

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

Именованные функции

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

Ответ 3

В Emacs 23.2 M-r делает именно то, что вы хотите.

Первый вызов этой команды перемещает точку в центр текущего видимого окна, а следующие последующие вызовы перемещаются вверх и вниз.

Никакой дополнительной конфигурации или пользовательских функций не требуется.

Ответ 4

Чтобы добавить к ответам Джо и Дейва, вы можете получить среднее значение:

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

(Я добавляю bp в начало всех моих функций, чтобы отличать их от встроенных или других людей... не стесняйтесь удалять это.)

Ответ 5

Я обнаружил, что move-to-window-line не уважает window-buffer-height. Таким образом, на самом деле он не обеспечивает поведение Vim, когда размер буфера меньше, чем окно. Поскольку я не использую Emacs из терминала и не забочусь о минимизации его фрейма, я решил повторно использовать его префиксный ключ, потому что "z" напоминает мне Vim zt, zm и zb (а также потому, что я буду использовать следующее в сочетании с Emacs C-l для достижения такого же общего эффекта).

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

Ответ 6

Если вы используете Emacs 23, просто C-l. В первый раз он пойдет в центр, во второй раз он вернется, а в третий раз он пойдет на дно.

EDIT:

Ой, мой плохой, который помещает текущую строку в центр/верх/низ окна. Еще полезно, хотя:)