Как прокручивать построчно в GNU Emacs?


87

Проще говоря, я пытаюсь получить прокрутку в emacs, как в vim и большинстве других редакторов; когда я, например, две строки из нижней / верхней части, и я нажимаю вниз / вверх ( Ctrl- p, n, ↑, ↓) она идет только одна линия вверх или вниз, а не половину экрана.


5
Я уверен, что это никогда не будет исправлено. Это был недостаток еще в прошлые 90-е, и он все еще сломан здесь в 2010.
— Стив Куо

12
@Steve Kuo: Выйти из трепа - это работает как задумано , но может быть изменено (или «исправлено») с помощью простой настройки.
— Тедди

17
@Teddy, а что это за "простая настройка"?
— Стив Куо,

1
@ Тедди, да, что это?
— Scooter

@Rook: На самом деле я бы рекомендовал использовать z.vim чаще, чтобы почувствовать себя Emacs ;-) Это может быть необычно, но на самом деле это более полезно, чем прокрутка строка за строкой ИМХО.
— U. Windl 06

Ответы:


51

См. Некоторые предложения по EmacsWIki:

(setq scroll-step 1
      прокрутка консервативно 10000)

3
На самом деле видел - оба ответа, ваш и jrockway, но в Wiki оба не рекомендуются. К сожалению, причины этого четко не объяснены. Вот почему я разместил вопрос, надеясь, что кто-то нашел метод, который работает без ошибок.
— Rook

1
Я не понимаю, почему это не рекомендуется. Я использовал аналогичную конфигурацию, и она работала достаточно хорошо. Чтобы убедиться в этом, см. Этот документ о шаге прокрутки (обратите внимание на последнее предложение): * Число строк, на которые нужно попробовать прокрутить окно, когда точка перемещается. Если это не помогает вернуть точку в кадр, вместо этого она центрируется. Если это ноль, точка всегда центрируется после того, как она уходит за пределы кадра. Если вы хотите, чтобы прокрутка всегда
— выполнялась построчно

Да, осмотревшись еще немного, я не вижу ничего, что могло бы подтвердить это предостережение в вики. Например, шаг прокрутки довольно часто встречается в нескольких файлах .emacs при поиске в Google. Может быть, автор вики имеет в виду старую версию emacs?
— ars

Никогда не было проблем с scroll-conservatively. Предупреждения против этого немного странные - если это вызывает проблемы, достаточно легко удалить строку из вашего init.el!
— dbr

1
@ars groups.google.com/group/gnu.emacs.help/browse_thread/thread/… поэтому с emacs <23.1 и большими файлами он может иногда перемещать курсор в середину, что не кажется самой большой проблемой
— dbr

51

Если вы хотите точно расположить экран, вы можете использовать Ctrl-L.

  • По умолчанию он помещает текущую строку в середину экрана.

  • ESC 0 Ctrl-L помещает текущую строку вверху.


14
Не поймите неправильно, но при чем тут прокрутка по строкам? (т.е. вопрос)
— Ладья

9
Разумно предложить альтернативный рабочий процесс, который (по мнению автора) более естественен с имеющимся инструментом. Но вы должны предварять его заявлением об этом и объяснять, почему этот подход «лучше», если это вообще возможно.
— dmckee --- котенок экс-модератора

2
@dmckee - Я использовал vim ... ммм, давно. Очень хорошо с этим. Однако, поскольку я что-то делаю с шепелявым, я начал заставлять себя по крайней мере снова разобраться с emacs, и этот «альтернативный» способ перемещения для меня в данный момент слишком сложен. Прочтите руководство, знайте ... но это слишком странно, imho. Неестественно.
— Rook

1
@Idigas: Конечно. Это честно, и вам не нужно прислушиваться к советам Starblue. Но я думаю, что такой ответ может быть полезным, если он предварительный и включает убедительное объяснение.
— dmckee --- котенок экс-модератора

1
Ура, это делает свою работу за пару нажатий клавиш. (Я погуглил «как прокручивать строку за строкой» только потому, что это показалось мне полезным способом поиска «как заставить код работать там, где я хочу».) Спасибо!
— Эннаэль

42

Я немного опоздал на вечеринку, но если вы не против установки пакета, то плавная прокрутка ( github , также доступна в MELPA ) может быть тем, что вы ищете - это определенно работает для меня.

После того, как вы его установили, вы можете добавить в свой init.el следующее:

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

Последняя строка не обязательна; он начинает прокручиваться ближе к краю экрана, а не к нему, поэтому у вас всегда есть небольшой контекст вокруг точки. Настроить по вкусу.


7
Я заплакал, когда прочитал это. Совершенно уверен, что это ответ на вопрос.
— Эрик Браун

3
Да, как пользователь Vim, пробующий Emacs, это именно то, что я искал.
— juanjux 06

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

К сожалению, плавная прокрутка теперь довольно часто дает сбой, когда вы прыгаете по файлу, используя, например, режим выполнения или поиск: и то, и другое может вывести точку за пределы экрана, и вам нужно нажать CL, чтобы отобразить результат.
— Эрик Ноулз

27

Мое решение состоит не в том, чтобы изменить прокрутку Emac по умолчанию, а в том, чтобы создать команду последовательности клавиш из макроса. Таким образом, у вас будет удобный способ прокрутки по одной строке за раз, когда захотите. Не идеально, но очень просто. Так уж случилось, что доступны M- (↓) и M- (↑), вот что я использовал.

Вот как я это сделал. Во-первых, вам нужно записать макрос для прокрутки одной строки вверх и вниз.

Начать макрос

C-x ( 

Прокрутите вниз на один

C-u 1 C-v

Остановить макрос

C-x )

Для прокрутки вверх используйте

C-u 1 M-v

Далее вам нужно назвать макрос.

M-x name-last-kbd-macro

При появлении запроса дайте ему имя, например:

down-one-line

Затем просто используйте следующее, чтобы связать последовательность клавиш с этим именем команды:

M-x global-set-key

И при появлении запроса используйте что-то вроде:

M-(down arrow)

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

Вот откуда я получил эту информацию. Вы также можете найти инструкции по добавлению макроса в файл .emacs ниже и в других местах.

Здесь для объяснения определения макроса

Вот как управлять прокруткой


22

Я использую их в своем .emacsфайле с 2000 года.

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

Таким образом, я могу сохранить поведение Emacs по умолчанию, а также прокручивать одну строку за раз, в зависимости от того, что я делаю.

Это работало по крайней мере до GNU Emacs 22. Я недавно обновлен до Emacs 24 и обнаружил , что View-scroll-line-forwardи View-scroll-line-backwardбольше не доступны. После некоторой охоты я обнаружил, что прокрутка вверх и вниз работают. Так что, если вы используете Emacs 24, вы можете использовать это.

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

Я в основном пропустил Emacs 23, поэтому, если вы используете эту версию, вы можете поэкспериментировать с обоими вышеупомянутыми.

Примечание: на scroll-up-lineсамом деле прокручивается на одну строку вниз , потому что буфер перемещается на одну строку вверх.


Спасибо, это работает ... но я столкнулся с другой проблемой, о которой спрашивал здесь: stackoverflow.com/questions/19256551/…
— scorpiodawg

13

Я повторно привязываю свои клавиши со стрелками для выполнения операций прокрутки.

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

2
Это не совсем то, что я искал. Я не хочу, чтобы экран прокручивался (как бы он хотел, чтобы была включена блокировка прокрутки), но чтобы экран "двигался" ... о, ... как это делает блокнот :)
— Ладья

12

Простые делают это:

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

затем мета-курсор вверх перемещается вверх, а мета-курсор вниз - вниз.

QED. Не уверен, что курили все вышеперечисленные люди!


Или, как я только что написал, вы можете использовать прокрутку вверх и вниз.
— Rajesh J Advani

5

В моем файле .emacs есть следующее, чтобы включить удобную прокрутку ctrl-up и ctrl-down. Я также использую это для колесика мыши.

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

Я только что пробовал это, но это не то поведение, которое я искал. Он позволяет вам перейти к последней строке на экране, но при нажатии кнопки вниз он все равно будет «рывком подниматься на несколько строк вверх» ... не знаю, как это лучше объяснить.
— Ладья

Мне нравится идея отображения колеса мыши. Но разве не будут работать встроенные View-scroll-line-forward и View-scroll-line-backward (или более новые scroll-up-line и scroll-down-line) вместо определения ваших собственных функций?
— Rajesh J Advani

2

Чтобы прокрутка "vim" поместила это в ваш файл .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)

@Matt для меня
— jjpikoov 08

2

Поскольку использование класса может раздражать M-up, M-downпотому что это мешает работе org-mode, который перегружает эти команды. Чтобы избежать этой проблемы, я лично использую те команды, которые объединяют M-page-up M-page-down". Здесь я определил прокрутку вверх и вниз до 1 строки.

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

1

M-x customize-variable scroll-conservatively

Установите его на 1.

Однако вы действительно не хотите этого делать.


5
На самом деле видел - оба ответа, ваш и ars, но в Wiki оба не рекомендуются. К сожалению, причины этого четко не объяснены. Вот почему я разместил вопрос, надеясь, что кто-то нашел метод, который работает без ошибок.
— Rook

3
было бы удобно, если бы вы могли объяснить нам, новичкам, почему это не очень хорошая идея.
— Daniel

Единственная причина, по которой я могу думать, почему это не очень хорошая идея, заключается в том, что прокрутка становится медленной: вам всегда придется прокручивать по одной строке за раз, а не по умолчанию на половину экрана. (Я думаю?)
— ShreevatsaR

1

Если вы ищете быстрый способ создать эффект прокрутки, введите C-nи C-lпоследовательно, который перемещает курсор вниз, а затем центрирует его.


0

Если вы запустите emacs в .xsession, в моем случае установка scroll-conservatively на 100+ не будет работать, ни шаг прокрутки 1. Но если вы запустите emacs после X, это сработает.


0

Если вы не против использования мыши и у вас есть колесо прокрутки, вы можете настроить переменную mouse-wheel-scroll-amount одним из следующих способов:

Ch v колесико мыши-количество прокрутки (щелкните по настройке, измените значение на «Определенное количество строк» ​​1, ApplyAndSave.)

или добавьте в .emacs строку: '(mouse-wheel-scroll-amount' (1 ((shift). 1) ((meta)) ((control). text-scale)))

Есть много возможностей, перечисленных на https://www.emacswiki.org/emacs/Scrolling

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.