Apa yang dilakukan: buka lakukan di vim?

18

Dokumentasi Vim mengatakan ini tentang :openperintah:

This command is in Vi, but Vim only simulates it:

                                                        *:o* *:op* *:open*
:[range]o[pen]                      Works like |:visual|: end Ex mode.
                                {Vi: start editing in open mode}

:[range]o[pen] /pattern/    As above, additionally move the cursor to the
                                column where "pattern" matches in the cursor
                                line.

Vim does not support open mode, since it's not really useful.  For those
situations where ":open" would start open mode Vim will leave Ex mode, which
allows executing the same commands, but updates the whole screen instead of
only one line.

Itu tidak mengomentari sifat "simulasi", dan mengapa ini dianggap sebagai simulasi daripada perintah nyata dengan perilaku yang berbeda. Ketika dijalankan dari mode ex (Q), itu memang berperilaku seperti yang dijelaskan.

Namun, tampaknya ada perintah terbuka yang berbeda. Ketika dijalankan dari baris perintah normal, atau dari mode ex dengan argumen yang berbeda, tampaknya menjadi sinonim untuk :edit. Ketika dijalankan dari mode perintah dengan a /pattern/, ia memposisikan kursor dan ternyata berjalan :edit(dengan posisi kursor hanya menjadi bukti jika: edit gagal.) Itu juga dapat dijalankan sebagai :open /pattern/ file, yang menempatkan kursor dan berjalan:edit file

Pertanyaan saya adalah: Mengapa ini tidak didokumentasikan? Apakah ada perbedaan dari :edityang saya tidak perhatikan? Adalah :opensekali sinonim untuk :editdan hanya diubah kemudian dalam upaya untuk setengah mematuhi POSIX?

Random832
sumber

Jawaban:

13

"Mode terbuka" vi berguna untuk terminal yang memiliki satu baris, seperti terminal hardcopy. Dalam mode terbuka, vi memiliki "tampilan baris tunggal" file. Memindahkan kursor di sekitar akan menggambar ulang seluruh baris, dan karakter yang dihapus dicetak berbeda.

"Simulasi" yang dilakukan vim hanyalah mendukung perintah, membuatnya bertindak (seperti yang dikatakan dalam dokumentasi) seperti :visualdan karena :visual"sebaliknya sama dengan :edit," itu mungkin mengapa Anda melihatnya bertindak seperti itu :edit.

Dari perspektif kode sumber, :opendiimplementasikan dalam ex_docmd.c( ex_open()). Itu melakukan beberapa hal untuk menangani kasus di mana disediakan ekspresi reguler, tetapi selalu berakhir dengan panggilan ke do_exedit().

Implementasi :edit, :badddan :visualterkandung dalam ex_edit()fungsi dalam file yang sama, dan fungsi itu adalah panggilan langsung ke do_exedit()(tidak ada yang lain). Jadi, selain ketika menangani parameter ekspresi reguler, kode yang sama dipanggil. do_exedit()agak berbulu, dan perilakunya dimodifikasi berat berdasarkan pada perintah aktual yang dikeluarkan, tetapi tidak pernah secara eksplisit memeriksa token perintah untuk open / edit / visual. Dengan demikian, tiga perintah menghasilkan lebih atau kurang kode yang sama dijalankan do_exedit().


sumber
8

Dari Pengantar ke Editing Layar dengan Vi :

Jika Anda berada di terminal hardcopy atau terminal yang tidak memiliki kursor yang dapat bergerak keluar dari garis bawah, Anda masih dapat menggunakan set perintah vi, tetapi dalam mode yang berbeda. Saat Anda memberi perintah vi, editor akan memberi tahu Anda bahwa itu menggunakan mode terbuka. Nama ini berasal dari perintah terbuka di ex, yang digunakan untuk masuk ke mode yang sama.

Satu-satunya perbedaan antara mode visual dan mode terbuka adalah cara teks ditampilkan.

Dalam mode terbuka, editor menggunakan jendela baris tunggal ke dalam file, dan bergerak mundur dan maju dalam file menyebabkan baris baru ditampilkan, selalu di bawah garis saat ini. Dua perintah vi bekerja secara berbeda di tempat terbuka: z dan ^ R. Perintah z tidak mengambil parameter, tetapi menggambar jendela konteks di sekitar baris saat ini dan kemudian mengembalikan Anda ke baris saat ini.

Jika Anda berada di terminal hardcopy, perintah ^ R akan mengetik ulang baris saat ini. Pada terminal seperti itu, editor biasanya menggunakan dua baris untuk mewakili baris saat ini. Baris pertama adalah salinan dari baris ketika Anda mulai mengeditnya, dan Anda bekerja pada baris di bawah baris ini. Ketika Anda menghapus karakter, editor mengetik sejumlah untuk menunjukkan kepada Anda karakter yang dihapus. Editor juga mencetak ulang garis saat ini segera setelah perubahan tersebut sehingga Anda dapat melihat seperti apa garis itu lagi.

Terkadang berguna untuk menggunakan mode ini pada terminal yang sangat lambat yang dapat mendukung vi dalam mode layar penuh. Anda dapat melakukan ini dengan memasukkan ex dan menggunakan perintah terbuka.

:openadalah artefak asal Vim sebagai klon Vi yang sama sekali tidak berguna hari ini. Saya hanya dapat berasumsi bahwa ia tetap ada untuk kompatibilitas POSIX.

Meskipun kesamaan jelas, :openadalah tidak alternatif :editoleh imajinasi.

romainl
sumber