Bagaimana cara memindahkan layar tanpa memindahkan kursor di Vim?

598

Saya baru-baru menemukan Ctrl+ Edan Ctrl+ Ycara pintas untuk Vim yang masing-masing bergerak layar atas dan ke bawah dengan langkah satu baris, tanpa menggerakkan kursor .

Apakah Anda tahu perintah yang membuat kursor berada di tempat itu tetapi memindahkan layar sehingga garis yang memiliki kursor menjadi baris pertama? (Memiliki perintah untuk baris terakhir akan menjadi bonus yang menyenangkan).

Saya dapat mencapai ini dengan secara manual menekan Ctrl+ E(atau Ctrl+ Y) beberapa kali, tetapi memiliki perintah yang entah bagaimana melakukan ini secara langsung akan menyenangkan.

Ada ide?

sebelum
sumber
Bukankah seharusnya pertanyaan ini ada di bagian Vim?
John

Jawaban:

877
  • zz- Pindahkan garis saat ini ke tengah layar
    ( Hati-hati denganzz , jika Anda kebetulan Caps Lockkebetulan, Anda akan menyimpan dan keluar vim!)
  • zt - Pindahkan garis saat ini ke bagian atas layar
  • zb - Pindahkan garis saat ini ke bagian bawah layar
Kevin Vaughan
sumber
9
@HappyGreenKidNaps Map yang membatasi kunci kunci untuk mengontrol ASAP!
Aaron
Saya cukup melekat pada topi saya, terutama berurusan dengan banyak makro C, tetapi Anda memiliki opsi lain. Pertama, cari kunci yang belum dipetakan (periksa kedua huruf untuk huruf; coba tambahkan pengubah atau pemimpin, menggunakan simbol atau tombol fungsi, dll.) Dan petakan ke kombinasi huruf 'sensitif' yang peka huruf besar-kecil. Kedua, konfigurasikan vimundo sesuai dengan keinginan Anda sehingga Anda dapat pulih dari oops. (Non-portable hacks incoming :) Ketiga, lakukan hal yang sama tetapi dari konfigurasi keyboard pengguna Anda, mis. Windows key + Z; untuk urutan peta, coba xdotoolatau triggerhappy. Terakhir, perlihatkan status kunci caps Anda (tidak dapat dilakukan dalam Vimscript.) ...
John P
2
Meminta status caps lock Anda sangat bergantung pada lingkungan. Saya telah mendengar bahwa itu tidak dapat dilakukan dalam Vimscript, dan pada titik ini saya telah menerimanya. Jika Anda ingin menyusuri jalan itu, ada xev -q, cat /proc/bus/input/devicesuntuk menemukan perangkat untuk meminta dan evtestatau thd ... --dump /dev/input/event<#>untuk memeriksa keadaan, dll. Jika Anda benar-benar harus membuat remapping seluruh sistem, setidaknya tukar dua kunci seperti caps <--> num - tetapi masalahnya lebih lupa bahwa itu aktif, karena jika Anda menginginkannya sebelumnya, Anda akan terus menggunakannya, dengan peta apa pun. Pemutusan risiko Vim sebelum file / pengguna / sistem.
John P
Opsi skrip Vim lainnya: nyalakan 'konfirmasi' untuk mengonfirmasi berhenti / tinggalkan / dll .; untuk menulis, saya yakin Anda akan memerlukan autocommand untuk BufWritePre confirm(). Selain itu, alih-alih memetakan caps lock ke ctrl, Anda dapat memetakannya ke kunci atau kombinasi yang dipahami tetapi tidak dipetakan oleh Vim, dan kemudian mengemulasi caps lock secara eksklusif saat dalam mode insert / replace, dengan tangan atau dengan sesuatu seperti github.com/tpope/ vim-capslock . Anda mungkin tidak akan membutuhkannya di luar Vim, tetapi jika Anda melakukannya, tulis skrip xmodmap untuk mengembalikan perubahan Anda, atau lihat apakah program mendukung pemetaannya sendiri (dan buat catatan.)
John P
3
zt / zz / zb - kursor tetap dan pindahkan layar ke t op / tengah (bahasa Jerman: ' z entrum') / b ottom <---> H / M / L - layar tetap dan pindahkan kursor ke H igh / M iddle / L posisi ow
eli
626

Selain itu:

  • Ctrl- yMemindahkan layar ke atas satu baris
  • Ctrl- eMemindahkan layar ke bawah satu baris
  • Ctrl- uMemindahkan kursor & layar ke atas ½ halaman
  • Ctrl- dMemindahkan kursor & layar ke bawah ½ halaman
  • Ctrl- bMemindahkan layar ke atas satu halaman, kursor ke baris terakhir
  • Ctrl- fMemindahkan layar ke bawah satu halaman, kursor ke baris pertama

Ctrl- ydan Ctrl- ehanya mengubah posisi kursor jika akan dipindahkan dari layar.

Atas perkenan http://www.lagmonster.org/docs/vi2.html

Paul Wheeler
sumber
91
@ulidtko: efter (setelah dalam bahasa Swedia), dahulu (artinya masa lalu), atas, bawah, belakang, maju. (Kata-kata maju dan mundur lebih panjang daripada naik dan turun, jadi tentu saja mereka memindahkan layar lebih jauh;)
Moberg
12
Saya kira sebelumnya, karena kemarin akan menjadi mnemonik yang lebih baik ^^
Moberg
Baik Ctrl-u dan Ctrl-d memindahkan kursor: " Kursor dipindahkan jumlah baris yang sama ke atas dalam file (jika mungkin; ketika garis membungkus dan ketika memukul akhir file mungkin ada perbedaan). "
Lex R
Terima kasih @LexR, saya telah memperbarui jawaban untuk mencerminkan perbedaan itu.
Paul Wheeler
1
:help CTRL-E kata Mnemonic: Extra lines.
Niko Bellic
39

Vim mengharuskan kursor berada di layar saat ini setiap saat, namun, Anda dapat membookmark posisi saat ini dan kemudian kembali ke posisi semula.

mg  # This book marks the current position as g (this can be any letter)
<scroll around>
`g  # return to g
GWW
sumber
1
perhatikan bahwa jika Anda hanya ingin pergi ke garis bookmark, Anda dapat menggunakan 'g
Matt Briggs
4
"Vim membutuhkan kursor berada di layar saat ini setiap saat" Pengguna Vim suka membual bahwa semuanya dapat dikonfigurasi dalam vim. Yang ini bukan. Saya tidak ingin kursor saya dipindahkan saat saya sedang menggulir file. Dealbreaker for me
gadelat
8
Saya tidak pernah mengalami situasi di mana saya ingin kursor berada di tempat yang tidak dapat Anda lihat. Tentu, kursor bergerak ketika Anda menggulir tetapi Anda dapat kembali ke tempat Anda sepele (sehingga Anda dapat melihat di mana Anda sebenarnya, bukan hanya semacam dugaan). Centang dua kali untuk satu, Ctrl-Ountuk yang lain benar-benar hebat, dan "backtick, titik" mengembalikan Anda ke tempat Anda terakhir mengedit.
dash-tom-bang
3
@gedalat, ini sangat menjengkelkan di editor lain ketika Anda menggeser, tidak tahu di mana kursor Anda lagi dan harus menggunakan mouse untuk mengklik di suatu tempat supaya Anda bisa mendapatkan kursor kembali. Atau Anda pikir Anda "di sini", mulailah mengetik dan tiba-tiba melompat kembali ke tempat kursor berada, pada titik mana Anda tidak dapat melompat kembali ke tempat Anda telah menggulir, karena hanya posisi kursor dilacak. Memiliki kursor mengikuti kemana Anda pergi adalah hal yang baik.
Shahbaz
1
Ini dapat dikonfigurasi, @gadelat. Anda hanya perlu memetakan jawaban ini (tandai posisi dengan mg, gulir sekitar, tandai goto dengan 'gdan Anda selesai. Sekarang Anda dapat memohon kunci yang dapat dikonfigurasi untuk berputar dan akan terasa seperti kursor tidak pernah meninggalkan posisi saat ini. Voilá!
Dr Beco
18

Inilah solusi saya di vimrc:

"keep cursor in the middle all the time :)
nnoremap k kzz
nnoremap j jzz
nnoremap p pzz
nnoremap P Pzz
nnoremap G Gzz
nnoremap x xzz
inoremap <ESC> <ESC>zz
nnoremap <ENTER> <ENTER>zz
inoremap <ENTER> <ENTER><ESC>zzi
nnoremap o o<ESC>zza
nnoremap O O<ESC>zza
nnoremap a a<ESC>zza

Sehingga kursor akan tetap di tengah layar, dan layar akan bergerak ke atas atau ke bawah.

Henry
sumber
Saya kira solusi ini lebih dari apa yang dibutuhkan OP. Saya menerapkannya dan itu berfungsi seperti pesona.
Gustavo Pinsard
9
Bagaimana kalau hanya mengatur 'scrolloff' ke setengah nilai 'lines'?
rld.
sayangnya "nnoremap o <ESC> zza" kehilangan autoindent, tetapi ini berhasil dengan menambahkan dan menghapus karakter sementara '.' "nnoremap o o. <ESC> zzxa"
Neil McGill
Terima kasih @rld, 'scrolloff' juga merupakan solusi yang baik atau mungkin lebih baik. Terima kasih! Berikut rujukannya: vim.wikia.com/wiki/...
Henry
14

Untuk meninggalkan kursor dalam kolom yang sama ketika Anda menggunakan Ctrl+ D, Ctrl+ F, Ctrl+ B, Ctrl+ U, G, H, M, L,gg

Anda harus menentukan opsi berikut:

:set nostartofline
Alexander Rumyantsev
sumber
2
Saya lupa / bingung setiap kali: zt / zz / zb - memperbaiki kursor dan memindahkan layar ke t op / center (Jerman: ' z entrum') / b ottom <---> H / M / L - layar tetap dan pindahkan kursor ke H igh / M iddle / L posisi ow
eli
8

Saya terkejut tidak ada yang menggunakan Scrolloffopsi yang menjaga kursor di tengah halaman. Cobalah dengan:

:set so=999

Ini adalah metode yang direkomendasikan pertama pada Vim wiki dan berfungsi dengan baik.

Jesse Reza Khorasanee
sumber
3
Dan jika Anda tidak ingin kursor selalu berada tepat di tengah, Anda dapat mengaturnya ke nilai yang lebih kecil. Misalnya, :set scrolloff=4akan membutuhkan kursor untuk selalu berada paling tidak 4 baris dari atas atau bawah jendela, sehingga Anda selalu memiliki setidaknya sedikit konteks.
Soren Bjornstad
6

Saya telah menggunakan pintasan ini di masa lalu ( catatan: stroke tombol terpisah yaitu ketuk z , lepaskan, ketuk tombol berikutnya):

z enter -> Memindahkan garis saat ini ke atas layar

z . -> Memindahkan garis saat ini ke tengah layar

z - -> Memindahkan garis saat ini ke bawah

Jika tidak jelas:

enterberarti kunci Returnatau Enter.

. berarti kunci DOT atau "berhenti penuh" (. ).

- berarti kunci HYPHEN (- )

Untuk apa nilainya, z.hindari bahaya menyimpan dan menutup Vi dengan mengetik secara tidak sengaja ZZjika caps-lock aktif.

Kekalapan
sumber
5

Anda dapat mengawali perintah pemindahan kursor dengan angka dan itu akan mengulangi perintah itu berkali-kali

10Ctrl+ Eakan dilakukan Ctrl+ E10 kali alih-alih satu.

Yunzen
sumber
4

zEnter melakukan persis apa yang diminta pertanyaan ini.

Ini bekerja di tempat yang anehnya zztidak akan berfungsi (vim 7.4.1689 di Ubuntu 2016.04 LTS tanpa .vimrc khusus)

Nicolas Raoul
sumber
4

Anda mungkin menemukan jawaban untuk " Menggulir Vim relatif ke kursor, pemetaan khusus " berguna.

Anda dapat menggunakan ScrollToPercent(0)dari pertanyaan itu untuk melakukan ini.

ZyX
sumber
Memang fungsinya bagus. Terima kasih.
ereOn
2

Terkadang berguna untuk menggulir teks dengan tombol Kdan J, jadi saya memiliki fungsi "mode gulir" ini di .vimrc saya (juga terikat pada zs).

Lihat scroll_mode.vim .

Oleg Khalidov
sumber
2

mnemonic saya untuk menggulir ...

Menambahkan ke jawaban lain juga memperhatikan zedan zs, artinya: pindahkan layar ke kiri / kanan kursor (tanpa memindahkan kursor)

+-------------------------------+
^                               |
|c-e (keep cursor)              |
|H(igh)             zt (top)    |
|                   ^           |
|           ze      |      zs   |
|M(iddle)  zh/zH <--zz--> zl/zL |
|                   |           |
|                   v           |
|L(ow)              zb (bottom) |
|c-y (keep cursor)              |
v                               |
+-------------------------------+

juga lihat posisi hdan ldan tdan bdan (dengan keyboard qwertz) c-edan c-y(juga "y" entah bagaimana menunjuk ke bawah) pada keyboard untuk mengingat ke mana layar bergerak.

eli
sumber
1

Saya menulis sebuah plugin yang memungkinkan saya untuk menavigasi file tanpa memindahkan posisi kursor. Ini didasarkan pada melipat garis antara posisi Anda dan posisi target Anda dan kemudian melompati flip, atau membatalkannya dan tidak bergerak sama sekali.

Juga mudah untuk beralih cepat antara kursor di baris pertama, baris terakhir dan kursor di tengah hanya dengan mengklik j, katau lketika Anda berada dalam mode plugin.

Saya kira itu akan cocok di sini.

jepret
sumber
1

Masukkan vim dan ketik:

:help z

zadalah perintah vim untuk redraw, jadi itu akan redraw file relatif ke tempat Anda memposisikan kursor. Opsi yang Anda miliki adalah sebagai berikut:

z+- Gambar ulang file dengan kursor di atas jendela dan karakter non-blank pada baris Anda.

z-- Gambar ulang file dengan kursor di bagian bawah jendela dan karakter non-blank pada baris Anda.

z.- Gambar ulang file dengan kursor di tengah jendela dan karakter non-blank pada baris Anda.

zt- Gambar ulang file dengan kursor di bagian atas jendela.

zb- Gambar ulang file dengan kursor di bagian bawah jendela.

zz- Gambar ulang file dengan kursor di tengah jendela.

Joe
sumber