จะเลื่อนทีละบรรทัดใน GNU Emacs ได้อย่างไร?


87

พูดง่ายๆคือฉันพยายามเลื่อนใน emacs เหมือนในกลุ่มและบรรณาธิการอื่น ๆ ส่วนใหญ่ เมื่อฉันยกตัวอย่างเช่นสองสายจากด้านล่าง / ด้านบนและกดลง / ขึ้น ( Ctrl- p, n, , ) มันจะไปเพียงหนึ่งบรรทัดขึ้นหรือลงไม่ได้ครึ่งหน้าจอ


5
ฉันเชื่อว่าสิ่งนี้จะไม่ได้รับการแก้ไข มันเป็นข้อบกพร่องในช่วง 90 ปีที่ผ่านมาและยังคงพังอยู่ที่นี่ในปี 2010
Steve Kuo

12
@Steve Kuo: เลิกทุบตี - ทำงานได้ตามที่ออกแบบไว้ แต่สามารถเปลี่ยนแปลงได้ (หรือ "คงที่") ด้วยการตั้งค่าง่ายๆ
Teddy

17
@ เท็ดดี้แล้ว "การตั้งค่าง่ายๆ" นี้คืออะไร?
Steve Kuo

1
@ เท็ดดี้ใช่มันคืออะไร?
สกู๊ตเตอร์

@ Rook: อันที่จริงฉันอยากจะแนะนำให้ใช้z.ในกลุ่มบ่อยขึ้นเพื่อให้ได้ความรู้สึก Emacs ;-) มันอาจจะผิดปกติ แต่จริงๆแล้วมีประโยชน์มากกว่าการเลื่อนทีละบรรทัด IMHO
U. Windl

คำตอบ:


52

ดูคำแนะนำบางส่วนเกี่ยวกับ EmacsWIki:

(setq เลื่อน - ขั้นตอนที่ 1
      เลื่อนแบบอนุรักษ์ 10,000)

3
เห็นแล้วจริง - ทั้งคำตอบของคุณและของ jrockway แต่ใน Wiki ไม่แนะนำทั้งสองอย่าง สาเหตุที่ไม่สามารถอธิบายได้อย่างชัดเจน นั่นเป็นเหตุผลที่ฉันโพสต์คำถามโดยหวังว่าจะมีคนค้นพบวิธีการที่ใช้งานได้โดยไม่มีข้อบกพร่อง
Rook

1
ฉันไม่เห็นว่าทำไมจึงไม่แนะนำสิ่งนี้ ฉันใช้การกำหนดค่าที่คล้ายกันและทำงานได้ดีทีเดียว เพื่อให้มั่นใจยิ่งขึ้นโปรดดูเอกสารของขั้นตอนการเลื่อน (สังเกตประโยคสุดท้าย): * จำนวนบรรทัดที่จะลองเลื่อนหน้าต่างโดยเมื่อจุดเลื่อนออก หากไม่สามารถนำจุดกลับมาที่เฟรมได้ให้จุดอยู่ตรงกลางแทน หากนี่เป็นศูนย์จุดจะอยู่กึ่งกลางเสมอหลังจากที่มันเคลื่อนออกจากเฟรม หากคุณต้องการให้การเลื่อนเป็นบรรทัดตลอดเวลาคุณควรตั้งค่า `` เลื่อนอย่างระมัดระวัง '' เป็นค่าขนาดใหญ่แทนที่จะตั้งค่านี้เป็น 1
an0

ใช่มองไปรอบ ๆ อีกหน่อยฉันไม่เห็นอะไรอีกแล้วที่จะสำรองข้อมูลข้อควรระวังใน wiki ตัวอย่างเช่นขั้นตอนการเลื่อนดูเหมือนจะพบได้บ่อยในไฟล์. macs หลายไฟล์ผ่านการค้นหาของ Google บางทีผู้เขียน wiki อาจอ้างถึง emacs เวอร์ชันเก่า?
อา

ไม่เคยมีปัญหาใด ๆ กับ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
อย่าเข้าใจผิด แต่สิ่งที่เกี่ยวข้องกับการเลื่อนทีละบรรทัด? (เช่นคำถาม)
Rook

9
การเสนอเวิร์กโฟลว์ทางเลือกที่ (ในความเห็นของผู้เขียน) เป็นธรรมชาติมากขึ้นด้วยเครื่องมือในมือนั้นสมเหตุสมผล แต่คุณควรนำหน้าด้วยคำปฏิเสธถึงผลกระทบนั้นและอธิบายว่าเหตุใดแนวทางนี้จึง "ดีกว่า" หากทำได้ทั้งหมด
dmckee --- อดีตผู้ดูแลลูกแมว

2
@dmckee - ฉันใช้ vim ... อืมนานแล้ว ดีมากกับมัน อย่างไรก็ตามเนื่องจากฉันกำลังทำอะไรบางอย่างด้วยเสียงกระเพื่อมฉันจึงเริ่มบังคับตัวเองอย่างน้อยต้องจับอีแมคอีกครั้งและวิธีการเคลื่อนไหวแบบ "ทางเลือก" นี้ก็มากเกินไปสำหรับฉันในขณะนี้ อ่านบทช่วยสอนรู้เลย ... แต่มันแปลกเกินไป imho ไม่เป็นธรรมชาติ.
Rook

1
@Idigas: แน่นอน นั่นยุติธรรมและคุณไม่จำเป็นต้องรับคำแนะนำจาก starblue แต่ฉันคิดว่าคำตอบแบบนี้จะมีประโยชน์หากเป็นข้อมูลล่วงหน้าและมีคำอธิบายที่น่าสนใจ
dmckee --- อดีตผู้ดูแลลูกแมว

1
ใช่มันทำงานได้ในสองสามการกดแป้นพิมพ์ (ฉัน Googled "วิธีการเลื่อนทีละบรรทัด" เท่านั้นเพราะดูเหมือนจะเป็นวิธีที่มีประโยชน์ในการค้นหา "วิธีทำให้โค้ดไปที่ที่ฉันต้องการ") ขอบคุณ!
Ennael

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 เพื่อให้ผลลัพธ์ของคุณแสดง
Erik Knowles

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)

จากนั้นมันจะถามคุณว่าคุณต้องการผูกคำสั่งใดและคุณควรตั้งชื่อที่คุณคิดค้นไว้ก่อนหน้านี้เช่นลงหนึ่งบรรทัด

นี่คือที่ที่ฉันได้รับข้อมูลนี้ คุณยังสามารถดูคำแนะนำด้านล่างและที่อื่น ๆ เกี่ยวกับการเพิ่มมาโครลงในไฟล์. macs

ที่นี่สำหรับคำอธิบายความหมายมาโคร

นี่คือวิธีการควบคุมการเลื่อน


23

ฉันใช้สิ่งเหล่านี้ใน.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
นี่ไม่ใช่สิ่งที่ฉันกำลังมองหา ฉันไม่ต้องการให้หน้าจอเลื่อน (เหมือนจะเปิดใช้งาน scroll-lock) แต่เพื่อให้หน้าจอ "ย้าย" ... โอ้ ... แค่ notepad ทำยังไง :)
Rook

12

Simples ทำสิ่งนี้:

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

จากนั้นเมตาเคอร์เซอร์ขึ้นเลื่อนขึ้นและเมตาเคอร์เซอร์ลงเลื่อนลง

QED ไม่แน่ใจว่าคนข้างบนสูบบุหรี่เพราะอะไร!


หรือที่เพิ่งโพสต์ไปคุณสามารถใช้ scroll-up-line และ scroll-down-line
Rajesh J Advani

5

ฉันมีสิ่งต่อไปนี้ในไฟล์. macs ของฉันเพื่อเปิดใช้งานลักษณะการเลื่อน 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)

ฉันเพิ่งลองสิ่งนี้ แต่มันไม่ใช่พฤติกรรมที่ฉันกำลังมองหา ช่วยให้คุณสามารถลงไปที่บรรทัดสุดท้ายบนหน้าจอได้ แต่เมื่อคลิกลงไปมันจะยัง "กระตุกหน้าจอขึ้นหลายบรรทัด" ... ไม่รู้จะอธิบายยังไงดีกว่า
Rook

ฉันชอบความคิดในการทำแผนที่ล้อเมาส์ แต่ View-scroll-line-forward และ View-scroll-line-backward ในตัวจะไม่ทำงาน (หรือ scroll-up-line และ scroll-down-line ที่ใหม่กว่า) แทนการกำหนดฟังก์ชันของคุณเองใช่หรือไม่?
Rajesh J Advani

2

ในการเลื่อน "vim" ให้นำสิ่งนี้ไปยังไฟล์. macs ของคุณ:

(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เพราะมันรบกวน org โหมดซึ่ง overloads คำสั่งเหล่านี้ เพื่อหลีกเลี่ยงปัญหานี้ฉันใช้คำสั่งเหล่านั้นเป็นการส่วนตัวซึ่งรวม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
เห็นแล้วจริง - ทั้งคำตอบของคุณและของ แต่ใน Wiki ไม่แนะนำทั้งสองอย่าง สาเหตุที่ไม่สามารถอธิบายได้อย่างชัดเจน นั่นเป็นเหตุผลที่ฉันโพสต์คำถามโดยหวังว่าจะมีคนค้นพบวิธีการที่ใช้งานได้โดยไม่มีข้อบกพร่อง
Rook

3
จะเป็นประโยชน์ถ้าคุณสามารถสะกดคำว่า noobs ให้พวกเราได้ว่าทำไมนี่จึงไม่ใช่ความคิดที่ดี
Daniel

เหตุผลเดียวที่ฉันคิดได้ว่าทำไมสิ่งนี้จึงไม่ใช่ความคิดที่ดีก็คือการเลื่อนช้าลง: คุณจะต้องเลื่อนทีละบรรทัดเสมอแทนที่จะเป็นค่าเริ่มต้นครึ่งหน้าจอ (ฉันเดา?)
ShreevatsaR

1

หากคุณกำลังมองหาวิธีที่รวดเร็วในการสร้างเอฟเฟกต์คล้ายการเลื่อนให้ป้อนC-nและC-lเลื่อนเคอร์เซอร์ลงตามลำดับจากนั้นจัดกึ่งกลาง


0

หากคุณเริ่ม emac ใน. xsession ในกรณีของฉันการตั้งค่าการเลื่อนอย่างระมัดระวังเป็น 100+ จะไม่ทำงานหรือเลื่อนขั้นที่ 1 แต่ถ้าคุณเริ่ม emacs หลังจาก X มันก็ใช้ได้


0

หากคุณไม่สนใจที่จะใช้เมาส์และมีล้อเลื่อนคุณสามารถปรับแต่งตัวแปรเมาส์ - ล้อ - จำนวนเลื่อนได้โดย:

ch v mouse-wheel-scroll-amount (คลิกที่ปรับแต่งเปลี่ยนค่าเป็น "จำนวนบรรทัดเฉพาะ" 1, ApplyAndSave)

หรือเพิ่มไปที่. emacs ในบรรทัด: '(mouse-wheel-scroll-amount' (1 ((shift). 1) ((meta)) ((control). text-scale)))

มีความเป็นไปได้มากมายที่ระบุไว้ที่ https://www.emacswiki.org/emacs/Scrolling

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.