Как прокручивать построчно в 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)
jjpikoov
источник
@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))))
Romwel
источник
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

Филип
источник