Emacs эквивалент vim shift-h и shift-l
Мне интересно, есть ли в emacs эти команды перемещения курсора, или если мне нужно будет их написать или найти фрагмент где-нибудь. я нахожу их довольно шикарными и регулярно их использую в vim. Я пока не нашел их в документации emacs.
в vim они выглядят так:
shift-h → переместить курсор в верхнюю часть экрана
shift-m → перемещать курсор в середину экрана
shift-l → переместить курсор в нижнюю часть экрана
просто для уточнения, я не хочу переместить курсор в верхнюю/нижнюю часть документа, только в верхнюю/нижнюю часть видимой в данный момент части документа, то есть на ту часть, которая отображается на экране.
Я нашел один из них до сих пор. alt-r, похоже, эквивалентен vim shift-m. он перемещает курсор в первый столбец средней линии.
Ответы
Ответ 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:
Ой, мой плохой, который помещает текущую строку в центр/верх/низ окна. Еще полезно, хотя:)