Як прокручувати рядок за рядком у GNU Emacs?


87

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


5
Я впевнений, це ніколи не буде виправлено. Це було дефіцитом ще в останні 90-ті, і воно все ще порушено тут у 2010 році.
Стів Куо,

12
@Steve Kuo: Вихід прочухана - це працює як задумано , але може бути змінений (або «фіксованою») з простою установкою.
Тедді,

17
@Teddy і що це за "проста настройка"?
Стів Куо,

1
@ Тедді так, що це?
Скутер

@Rook: Насправді я б рекомендував використовувати z.in vim частіше, щоб отримати відчуття Emacs ;-) Це може бути незвично, але насправді це корисніше, ніж прокручування рядка за рядком IMHO.
У. Віндл

Відповіді:


51

Перегляньте деякі поради щодо EmacsWIki:

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

3
Побачив, насправді - обидві відповіді, і ваша, і відповідь jrockway, але на Wiki обидві не рекомендуються. На жаль, причини цього не чітко пояснені. Тому я розмістив запитання, сподіваючись, що хтось знайшов метод, який працює без недоліків.
Ладья

1
Я не розумію, чому це не рекомендується. Я використовую подібну конфігурацію, і вона працює досить добре. Щоб запевнити вас далі, дивіться цей документ кроку прокрутки (зверніть увагу на останнє речення): * Кількість рядків, за якими потрібно спробувати прокрутити вікно, коли точка переміщується. Якщо це не дозволяє повернути точку на кадр, точка замість цього центрується. Якщо це нуль, точка завжди відцентрована після того, як вона зміститься з кадру. Якщо ви хочете, щоб прокрутка завжди була рядком за один раз, вам слід встановити велике значення для `` scroll-консервативно '', а не встановлювати це значення 1.
an0

Так, оглядаючись трохи більше, я не бачу набагато більше, щоб підкріпити цю попереджувальну записку у вікі. Наприклад, крок прокрутки здається досить поширеним у багатьох файлах .emacs за допомогою пошуку Google. Можливо, автор wiki має на увазі стару версію 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, і цей "альтернативний" спосіб пересування для мене зараз занадто великий. Прочитайте підручник, знайте це ... але, це занадто дивно, імхо. Не природний.
Ладья

1
@Idigas: Звичайно. Це справедливо, і вам не потрібно приймати поради starblue. Але я думаю, що така відповідь може бути корисною, якщо вона буде заздалегідь і включатиме вагоме пояснення.
dmckee --- кошеня екс-модератора

1
Так, це робить роботу кількома натисканнями клавіш. (Я погуглив "як прокручувати рядок за рядком" лише тому, що це здавалося корисним способом пошуку "як змусити код переходити туди, куди я хочу".) Дякую!
Еннаель,

42

Я трохи запізнився на вечірку, але якщо ви не проти встановити пакет, то плавна прокрутка ( github , також доступний у MELPA ) може бути тим, що ви шукаєте - це, безумовно, працює для мене.

Після того, як ви встановили його, ви можете вставити наступне у ваш init.el:

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

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


7
Я прочитав це, розплакавшись. Цілком впевнений, що це відповідь на запитання.
Eric Brown

3
Так, як користувач Vim, який пробує Emacs, це саме те, що я шукав.
juanjux

я використовував і це рішення, і рішення кроку прокрутки, комбінація захоплює, коли я переходжу до 6-го рядка знизу і натискаю вниз, він прокрутить один рядок, а той самий зверху.
Emad Elsaid

На жаль, плавна прокрутка зараз не вдається досить часто, коли ви переходите по файлу за допомогою, наприклад, режиму подій або пошуку: і те, і інше може вивести точку за межі екрану, і вам потрібно натиснути 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)

Я щойно спробував це, але це не та поведінка, яку я шукав. Це дозволяє вам спуститися до останнього рядка на екрані, але після натискання вниз він все одно буде "смикати екран на кілька рядків вгору" ... не знаю, як це пояснити краще.
Ладья

Мені подобається ідея відображення колеса миші. Але чи не спрацьовують вбудовані функції Перегляд-прокрутка-лінія вперед та Перегляд-Прокрутка-лінія назад (або новіші лінія прокрутки вгору та прокрутка вниз) замість того, щоб визначити власні функції?
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

2

Оскільки це може дратувати використання M-up, M-downоскільки це заважає організаційному режиму, який перевантажує ці команди. Щоб уникнути цієї проблеми, я особисто використовую ті команди, які поєднують 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 обидві не рекомендуються. На жаль, причини цього не чітко пояснені. Тому я розмістив запитання, сподіваючись, що хтось знайшов метод, який працює без недоліків.
Ладья

3
було б зручно, якби ви могли пояснити нам, нуб, чому це не гарна ідея.
Даніель

Єдина причина, чому я можу подумати, чому це не є гарною ідеєю, полягає в тому, що прокрутка стає повільною: вам завжди доведеться прокручувати по одному рядку за раз, замість стандартного напівекранного. (Я здогадуюсь?)
ShreevatsaR

1

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


0

Якщо ви запустите emacs у .xsession, у моєму випадку консервативне прокручування до 100+ не буде працювати, а також крок прокрутки 1. Але якщо ви запустите emacs після X, це працює.


0

Якщо ви не проти користуватися мишею і маєте колесо прокрутки, ви можете налаштувати змінну величину коліщатка миші-прокрутки за допомогою:

Ch v сума прокрутки миші (натисніть на налаштувати, змініть значення на "Конкретна кількість рядків" 1, ApplyAndSave.)

або додайте до .emacs рядок: '(сума прокрутки коліщатка миші' (1 ((shift). 1) ((meta)) ((control). text-scale)))

Існує багато можливостей, перелічених на https://www.emacswiki.org/emacs/Scrolling

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.