Emacs-эквивалент Vim's shift-h и shift-l - PullRequest
21 голосов
/ 05 октября 2009

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

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

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

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

Ответы [ 6 ]

29 голосов
/ 05 октября 2009

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

  • 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 означает, скажите мне, что делает следующая последовательность клавиш. Она сообщила мне имя команды, а также, что вы можете передавать числовые аргументы команде, чтобы выбрать строку, к которой вы хотите перейти. Если вы ничего не пропустите, точка переместится в центр окна, как вы видели.

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

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

9 голосов
/ 05 октября 2009

Функция, которую вы хотите использовать: 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)
7 голосов
/ 21 мая 2010

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

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

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

2 голосов
/ 05 октября 2009

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

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

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

1 голос
/ 13 мая 2012

Я обнаружил, что move-to-window-line не уважает window-buffer-height. Таким образом, он фактически не обеспечивает поведение, которое имеет Vim, когда размер буфера меньше окна. Поскольку я не использую Emacs из терминала, и при этом я не забочусь о минимизации его фрейма, я решил повторно использовать его префиксный ключ, потому что 'z' напоминает мне о zt, zm и zb в Vim. (а также потому, что я собираюсь использовать следующее в сочетании с 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)
0 голосов
/ 05 октября 2009

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

EDIT:

Упс, мой плохой, это помещает текущую строку в центр / верх / низ окна. Тем не менее, полезно:)

...