Gerakan kursor setelah $ motion

Aug 22 2020

Saya memainkan game hebat yang disebut petualangan VIM (dari mana adalah gambar di bawah). Pertanyaannya berasal dari game, tetapi juga dapat direproduksi di VIM jadi ini adalah tempat yang saya tanyakan.

Anggaplah Anda sedang masuk normal mode, berdiri di beberapa baris ndan kolom m. Jika Anda menekan tombol j, posisi Anda menjadi garis n+1dan kolom yang sama m. Jika baris n+1memiliki kolom kurang dari m, katakanlah o, Anda ditempatkan di kolom o. Tekan lagi j. Anda dipindahkan ke baris n+2, di kolom m(centang yang sama seperti sebelumnya). Lihat, kolom tempat Anda mulai m,, diingat. Ini bisa dilihat pada gambar pertama, dengan garis merah mewakili jgerakan.

Namun, jika Anda masuk normal modedan menekan tombol $, Anda akan dipindahkan ke akhir baris saat ini. Sekarang perhatikan urutan gerakan yang sama seperti yang dijelaskan di paragraf sebelumnya. Setiap gerakan jakan memindahkan Anda ke karakter terakhir di baris itu. mtidak diingat dalam kasus ini. Ini bisa dilihat pada gambar kedua. Dengan menekan terlebih dahulu $, coursor ditempatkan di akhir baris pertama. Kemudian, dengan menekan beberapa jgerakan, masing-masing mendarat di akhir baris, mengabaikan m, yang diingat di paragraf pertama.

Saya tidak dapat menemukannya di dokumentasi VIM mana pun. Dapatkah Anda menjelaskan kepada saya bagaimana mekanisme mengingat ini bekerja atau mengarahkan saya ke bagian dokumentasi yang menjelaskan hal ini?


Jawaban

2 filbranden Aug 22 2020 at 16:58

Memang, tidak ada referensi langsung ke perilaku ini dalam dokumentasi $perintah itu sendiri.

Dokumentasi g$gerakan sebenarnya mengacu pada perilaku ini, dalam menjelaskan g$perbedaannya dari $:

Berbeda dengan $saat karakter terakhir baris tidak ada di layar atau saat hitungan digunakan. Selain itu, gerakan vertikal menahan kolom, bukan ke akhir baris.

Selain melalui dokumentasi, Anda dapat mengintip bagaimana Vim sebenarnya mengimplementasikan pelacakan kolom ini, karena fungsinya seperti getcurpos()mengekspor informasi tersebut sebagai atribut "curswant":

The curswantnomor adalah kolom yang disukai ketika memindahkan kursor secara vertikal.

(Anda juga akan menemukan atribut "curswant" di Dict yang dikembalikan oleh winsaveview().)

Misalnya, jika Anda telah berpindah secara horizontal pada garis panjang ke kolom 24, lalu vertikal ke garis yang hanya memiliki 17 kolom, Anda akan melihat ini:

: echo getcurpos ()
[0, 39, 17 , 0, 24 ]

Jadi Anda dapat melihat Anda berada di kolom 17, tetapi "curswant" adalah kolom 24 dan Vim akan pergi ke kolom hingga 24 jika sebuah baris memiliki kolom yang cukup.

Setelah Anda menekan $dan melihat lagi getcurpos()hasilnya, Anda sekarang akan melihat:

: echo getcurpos ()
[0, 39, 17, 0, 2147483647 ]

Jadi, Anda akan melihat Vim mengimplementasikan $perilaku dengan menyetel "curswant" ke angka yang sangat besar, yang merupakan jumlah kolom terbesar yang mungkin dapat disimpan Vim dalam satu baris.

(Angka itu sebenarnya adalah 2 31 - 1, yang merupakan bilangan bulat positif maksimum yang dapat Anda simpan dalam inttipe bertanda tangan dalam bahasa C.)