Bagaimana cara menggulir baris demi baris di GNU Emacs?

87

Sederhananya, saya mencoba menggulir di emacs seperti di vim dan sebagian besar editor lainnya; ketika saya misalnya, dua baris dari bawah / atas, dan saya tekan ke bawah / atas ( Ctrl- p, n, , ) ia pergi hanya satu baris atas atau bawah, tidak setengah layar.

Benteng
sumber
5
Saya yakin ini tidak akan pernah diperbaiki. Itu adalah defisiensi di 90-an terakhir dan masih rusak di sini pada 2010.
Steve Kuo
12
@Steve Kuo: Hentikan serangan - ini berfungsi seperti yang dirancang , tetapi dapat diubah (atau "diperbaiki") dengan pengaturan sederhana.
Teddy
17
@ Teddy dan apa ini "pengaturan sederhana"?
Steve Kuo
1
@Teddy ya, ada apa?
Scooter
@Rook: Sebenarnya saya akan merekomendasikan untuk menggunakan z.vim lebih sering untuk mendapatkan perasaan Emacs ;-) Ini mungkin tidak biasa, tetapi sebenarnya lebih berguna daripada menggulir baris demi baris IMHO.
U. Windl

Jawaban:

52

Lihat beberapa saran di EmacsWIki:

(setq scroll-langkah 1
      gulir secara konservatif 10000)
ars
sumber
3
Melihatnya, sebenarnya - kedua jawaban, milik Anda dan jrockway, tetapi di Wiki keduanya tidak disarankan. Sayangnya, alasannya tidak dijelaskan dengan jelas. Itu sebabnya saya memposting pertanyaan, berharap seseorang menemukan metode yang berfungsi tanpa cacat.
Benteng
1
Saya tidak mengerti mengapa ini tidak disarankan. Saya telah menggunakan konfigurasi serupa dan telah bekerja dengan cukup baik. Untuk meyakinkan Anda lebih lanjut, lihat dokumen langkah gulir ini (perhatikan kalimat terakhir): * Jumlah baris untuk mencoba menggulir jendela saat titik bergerak keluar. Jika itu gagal mengembalikan titik ke bingkai, titik di tengah sebagai gantinya. Jika ini nol, titik selalu berada di tengah setelah bergerak keluar bingkai. Jika Anda ingin pengguliran selalu menjadi satu baris pada satu waktu, Anda harus menyetel `gulir secara konservatif 'ke nilai yang besar daripada menyetelnya ke 1.
an0
Ya, melihat-lihat sedikit lagi, saya tidak melihat lebih banyak untuk mendukung catatan peringatan di wiki. Misalnya, langkah gulir tampaknya cukup umum di beberapa file .emacs melalui pencarian google. Mungkin penulis wiki mengacu pada emacs versi lama?
ars
Tidak pernah ada masalah dengan scroll-conservatively. Peringatan terhadap ini agak aneh - jika itu menyebabkan masalah, cukup mudah untuk menghapus baris dari init.el Anda!
dbr
1
@ars groups.google.com/group/gnu.emacs.help/browse_thread/thread/… jadi dengan emacs <23.1 dan file besar, terkadang kursor melompat ke tengah, yang tampaknya bukan masalah terbesar
dbr
51

Jika Anda ingin memposisikan layar dengan tepat, Anda dapat menggunakan Ctrl-L.

  • Secara default, ini memposisikan garis saat ini di tengah layar.

  • ESC 0 Ctrl-L memposisikan baris saat ini di atas.

starblue
sumber
14
Jangan salah paham, tapi apa hubungannya dengan menggulir baris demi baris? (yaitu pertanyaan)
Benteng
9
Menawarkan alur kerja alternatif yang (menurut penulis) lebih alami dengan alat yang ada adalah masuk akal. Tetapi Anda harus memulainya dengan pelepasan tanggung jawab hukum untuk efek tersebut, dan menjelaskan mengapa pendekatan ini "lebih baik" jika memungkinkan.
dmckee --- kucing mantan moderator
2
@dmckee - Saya telah menggunakan vim ... uhmm, lama sekali. Sangat bagus dengan itu. Namun, karena saya melakukan sesuatu dengan cadel, saya mulai memaksa diri saya untuk setidaknya menguasai emacs lagi, dan cara bergerak "alternatif" ini terlalu berlebihan bagi saya saat ini. Baca tutorialnya, tahu itu ... tapi, itu terlalu aneh, imho. Tidak alami.
Benteng
1
@Idigas: Tentu. Itu adil, dan Anda tidak perlu menerima nasihat starblue. Tapi menurut saya jawaban semacam ini bisa membantu jika di muka dan menyertakan penjelasan yang meyakinkan.
dmckee --- kucing mantan moderator
1
Yay, ini berhasil dalam beberapa kali penekanan tombol. (Saya mencari "cara menggulir baris demi baris" di Google hanya karena itu tampak seperti cara yang berguna untuk mencari "cara membuat kode pergi ke tempat yang saya inginkan".) Terima kasih!
Ennael
42

Saya agak terlambat ke pesta, tetapi jika Anda tidak keberatan menginstal paket maka pengguliran lancar ( github , juga tersedia dalam MELPA ) mungkin yang Anda cari - ini pasti berhasil untuk saya.

Setelah Anda menginstalnya, Anda dapat memunculkan perintah berikut di init.el Anda:

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

Baris terakhir adalah opsional; itu mulai bergulir di dekat tepi layar daripada di atasnya, jadi Anda selalu memiliki sedikit konteks di sekitar intinya. Sesuaikan dengan selera.

Stuart Hickinbottom
sumber
7
Saya menangis tersedu-sedu saat membaca ini. Cukup yakin ini adalah jawaban atas pertanyaan tersebut.
Eric Brown
3
Ya, sebagai pengguna Vim yang mencoba Emacs, inilah yang saya cari.
juanjux
Saya menggunakan solusi ini dan solusi langkah gulir, kombinasinya menarik ketika saya pindah ke baris ke-6 dari bawah dan menekan ke bawah itu akan menggulir satu baris, dan sama dari atas.
Emad Elsaid
Sayangnya, pengguliran halus sekarang gagal cukup sering ketika Anda melompat-lompat file Anda menggunakan, misalnya, mode terjadi atau mencari: keduanya dapat membawa titik keluar layar dan Anda harus menekan CL untuk menampilkan hasil Anda.
Erik Knowles
27

Solusi saya bukanlah mengubah pengguliran default Emac, melainkan membuat perintah urutan kunci dari makro. Dengan cara ini Anda memiliki cara yang mudah untuk menggulir satu baris pada waktu yang Anda inginkan. Tidak ideal, tapi sangat mudah. Kebetulan M- (↓) dan M- (↑) tersedia, jadi itulah yang saya gunakan.

Beginilah cara saya melakukannya. Pertama, Anda perlu merekam makro untuk gulungan satu baris, atas dan bawah.

Mulailah makro

C-x ( 

Gulir ke bawah satu

C-u 1 C-v

Hentikan makro

C-x )

Untuk gulir ke atas, gunakan

C-u 1 M-v

Selanjutnya Anda perlu memberi nama makro.

M-x name-last-kbd-macro

Beri nama saat diminta seperti:

down-one-line

Kemudian gunakan saja yang berikut ini untuk mengikat urutan kunci ke nama perintah itu:

M-x global-set-key

Dan saat diminta, gunakan sesuatu seperti:

M-(down arrow)

Kemudian ia akan menanyakan perintah mana yang ingin Anda ikat, dan Anda harus memberinya nama yang Anda temukan sebelumnya, misalnya, down-one-line.

Di sinilah saya mendapatkan informasi ini. Anda juga dapat menemukan petunjuk di bawah dan di tempat lain tentang menambahkan makro Anda ke file .emacs.

Di sini untuk penjelasan definisi makro

Berikut cara mengontrol pengguliran

Josh Cason
sumber
23

Saya telah menggunakan ini di .emacsfile saya sejak tahun 2000.

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

Dengan cara ini, saya dapat mempertahankan perilaku default Emacs serta menggulir satu baris pada satu waktu, tergantung pada apa yang saya lakukan.

Ini bekerja sampai setidaknya GNU Emacs 22. Saya baru-baru ini meningkatkan ke Emacs 24 dan menemukannya View-scroll-line-forwarddan View-scroll-line-backwardtidak lagi tersedia. Setelah beberapa kali berburu, saya menemukan bahwa scroll-up-line dan scroll-down-line berfungsi. Jadi jika Anda menggunakan Emacs 24, Anda dapat menggunakan ini.

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

Saya kebanyakan melewatkan Emacs 23, jadi jika itu adalah versi yang Anda gunakan, Anda dapat bereksperimen dengan keduanya.

Catatan: scroll-up-linesebenarnya menggulung satu baris ke bawah , karena buffer dipindahkan satu baris ke atas.

Rajesh J Advani
sumber
Terima kasih, ini berfungsi ... tetapi saya mengalami masalah lain yang saya tanyakan di sini: stackoverflow.com/questions/19256551/…
scorpiodawg
13

Saya memasang kembali tombol panah saya untuk melakukan operasi pengguliran.

(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)))
Derek Slager
sumber
2
Ini bukanlah yang saya cari. Saya tidak ingin layar menggulir (karena penguncian gulir diaktifkan), tetapi layar "bergerak" ... oh, ... bagaimana notepad melakukannya :)
Benteng
12

Simples melakukan ini:

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

lalu kursor meta ke atas bergerak ke atas dan kursor meta ke bawah bergerak ke bawah.

QED. Tidak yakin apa yang semua orang di atas sedang merokok!

Adam
sumber
Atau, seperti yang baru saja saya posting, Anda dapat menggunakan scroll-up-line dan scroll-down-line.
Rajesh J Advani
5

Saya memiliki yang berikut ini di file .emacs saya untuk mengaktifkan perilaku gulir ctrl-up dan ctrl-bawah yang bagus. Saya juga menggunakan ini untuk roda mouse.

(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)
Alex B
sumber
Saya baru saja mencoba ini, tetapi itu bukan perilaku yang saya cari. Ini memungkinkan Anda untuk turun ke baris terakhir di layar, tetapi setelah mengklik ke bawah itu masih akan "menyentak layar dengan beberapa baris ke atas" ... tidak tahu bagaimana menjelaskannya dengan lebih baik.
Benteng
Saya suka ide memetakan roda mouse. Tapi bukankah built-in View-scroll-line-forward dan View-scroll-line-backward (atau scroll-up-line dan scroll-down-line) berfungsi, alih-alih mendefinisikan fungsi Anda sendiri?
Rajesh J Advani
2

Untuk mendapatkan "vim" scrolling ini ke file .emacs Anda:

(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.dll
sumber
@Matt itu untuk saya
jjpikoov
2

Karena dapat mengganggu untuk menggunakan M-up, M-downkarena mengganggu mode-org yang membebani perintah-perintah ini. Untuk menghindari masalah ini saya pribadi menggunakan perintah-perintah yang menggabungkan M-page-up M-page-down". Di sini saya mendefinisikan gulir ke atas dan ke bawah menjadi 1 baris.

;;;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
sumber
1

M-x customize-variable scroll-conservatively

Setel ke 1.

Anda tidak benar-benar ingin melakukan ini.

jrockway
sumber
5
Melihatnya, sebenarnya - kedua jawaban, milik Anda dan ars tetapi di Wiki keduanya tidak disarankan. Sayangnya, alasannya tidak dijelaskan dengan jelas. Itu sebabnya saya memposting pertanyaan, berharap seseorang menemukan metode yang berfungsi tanpa cacat.
Benteng
3
akan berguna jika Anda bisa menjelaskan kepada kami noobs mengapa ini bukan ide yang baik.
Daniel
Satu-satunya alasan saya dapat berpikir mengapa ini bukan ide yang baik adalah bahwa pengguliran menjadi lambat: Anda harus selalu menggulir satu baris pada satu waktu, alih-alih layar setengah layar default. (Saya kira?)
ShreevatsaR
1

Jika Anda mencari cara cepat untuk membuat efek seperti gulir, masuk C-ndan C-lsecara berurutan yang menggerakkan kursor ke bawah dan kemudian memusatkannya.

Michael David Watson
sumber
0

Jika Anda memulai emacs di .xsession, dalam kasus saya, pengaturan scroll-konservatif ke 100+ tidak akan berfungsi, atau scroll-langkah 1. Tetapi jika Anda memulai emacs setelah X, itu berhasil.

seb
sumber
0

Jika Anda tidak keberatan menggunakan mouse dan memiliki roda gulir, Anda dapat menyesuaikan jumlah gulir roda-mouse variabel dengan:

Ch v mouse-wheel-scroll-number (klik sesuaikan, ubah nilai menjadi "Specific # of lines" 1, ApplyAndSave.)

atau tambahkan ke .emacs baris: '(mouse-wheel-scroll-number' (1 ((shift). 1) ((meta)) ((control). text-scale)))

Ada banyak kemungkinan yang terdaftar di https://www.emacswiki.org/emacs/Scrolling

Philip
sumber