Saya kembali ke Vim setelah menggunakan Emacs selama beberapa tahun. Saya mencoba grok Vim dengan membaca dan menonton tutorial, dan juga menggunakannya setiap hari.
Saat mengedit teks, saya menemukan perintah Emacs dari Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D dan Alt-Backspace sangat berguna dan intuitif, memungkinkan untuk mengedit lokal cepat dan mudah saat bekerja dengan teks (kata / kode).
Apa cara Vim menerapkan fungsi serupa? Kembali ke NORMAL
mode untuk mengeluarkan satu gerakan, hanya untuk memasukkan kembali INSERT
mode tidak optimal.
Contoh 1: Ketika dalam INSERT
mode untuk memasukkan a (
di awal ekspresi, bagaimana saya harus pindah ke akhir ekspresi atau garis untuk memasukkan yang sesuai )
di Vim?
Contoh 2: Saat mengedit teks, seseorang mungkin sering ingin menghapus kata maju atau mundur saat menulis atau mengedit kalimat atau kode. Tidak lazim memiliki kalimat / kode yang terbentuk sempurna dalam pikiran seseorang, siap untuk mengetik "sekali" sebelumnya; sering sebuah kalimat berubah ketika seseorang bekerja dengan teks. Pembatasan INSERT
mode membuat pengeditan semacam ini sulit bagi saya di Vim. Saya merasa tidak dapat memanipulasi teks secara efektif dalam mode penyisipan, selalu menemukan diri saya harus beralih kembali ke NORMAL
mode untuk gerakan sederhana atau menghapus kata-kata.
PS: Alt-F dan -B menggerakkan kursor maju atau mundur satu kata. Ctrl-a dan -e memindahkan kursor ke awal atau akhir baris. Alt-F menghapus kata di bawah kursor. Alt-Backspace menghapus kata sebelum kursor.
sumber
vim
saat mengedit Anda menghabiskan sebagian besar waktu Anda dalam mode normal bukan dalam mode insert.Jawaban:
1
Anda dapat mencapai itu atau lebih baik (pinky) pemetaan perintah dengan sangat cepat. Saya tidak merekomendasikan solusi ini, tetapi sebagai contoh, jika Anda ingin memindahkan kursor ke awal baris dengan
<C-a>
Anda dapat menjalankan baris berikut setelah memukul:
dari mode normal (atau menambahkan baris ke vimrc Anda)atau, jika awal baris berarti karakter baris pertama yang tidak kosong
Penasaran, saya baru saja menguji pemetaan ini di buffer di mana saya menulis jawaban ini, dan saya bingung sejenak karena mereka tidak berfungsi. Kemudian saya menyadari bahwa saya lupa memasukkan mode. Anda merasa sulit untuk meninggalkan mode masukkan untuk menjalankan perintah mode normal. Anda mungkin menemukan setelah menggunakan Vim untuk sementara waktu bahwa itu adalah kebalikan - bahwa Anda berlama-lama dalam mode normal saat Anda berpikir dan hanya melakukan kunjungan ke mode insert untuk acara-acara tertentu. Vim mungkin hanya (atau sebagian besar) layak dipelajari jika Anda menemukan bahwa Anda melakukan lebih banyak pengeditan daripada menulis teks.
Jadi salah satu bagian dari jawaban untuk pertanyaan Anda tentang menjalankan perintah mode normal dengan cepat dari mode insert adalah
<C-o>
, yang memungkinkan Anda meninggalkan mode insert sementara untuk menjalankan satu perintah mode normal, lalu masuk kembali. Membaca tentang itu di:help i_Ctrl-o
. Ini berguna untuk kenyamanan satu kali saja. Rute yang lebih berkelanjutan mungkin untuk mencoba merangkul mode normal sebagai default untuk navigasi dan pengeditan, dan hanya memasukkan mode insert ketika Anda benar-benar ingin memasukkan karakter baru dengan tangan ke buffer.2
Contoh Anda sangat umum sehingga sulit untuk memberikan jawaban spesifik. Saya akan membuat contoh spesifik dengan harapan cocok atau dapat diterjemahkan ke sesuatu yang Anda temui. Untuk nomor 1 Anda, itu tergantung pada bagaimana Anda tahu di mana tanda kurung seharusnya pergi. katakanlah saya memiliki garis seperti
Ini dimaksudkan sebagai baris VimL, bahasa skrip vim, dan itu (atau sesuatu seperti itu) muncul dalam file sintaks Vim yang saat ini saya tidak setuju. Katakanlah saya ingin mengubah bagian kanan ungkapan ini menjadi pemanggilan fungsi, mungkin karena fungsi tersebut menyediakan default ketika kamus
s:cchar
belum diberi nilai untuk"atx"
kuncinya. Dengan kursor saya (dalam mode normal) pada karakter pertama, 'l', saya bisa mengetikSecara singkat, ini mengatakan
f=
- maju ke '=' (saya bisa mengatakanfs
, tapi saya mungkin tidak akan berhenti cukup lama untuk melihat bahwa 's' yang ingin saya jangkau adalah yang pertama di telepon, jadi saya akan memilih karakter yang jelas unik, dan melanjutkan dari sana)w
- kata berikutnya, sekarang kursor saya ada di 's' of: s: cchar 'cf[
- ubah untuk meneruskan ke '['pada titik ini garisnya seperti
di mana
|
kursor, dan saya dalam mode sisipkan. Saya kemudian mengetikMyFunction(
dan meninggalkan mode insert (<Esc>
).$
- Pindahkan kursor ke ujung garis. Saya bisa saja menggunakanE
kata-kata besar atauf]
maju-ke-] atau gerakan lain, tetapi$
terlintas di benak saya terlebih dahulu.r)
- ganti karakter di bawah kursor dengan ')'Sekarang saya telah mengubah ekspresi penugasan dari menugaskan dari kamus skrip-lokal untuk menggunakan nilai kembali fungsi, dan dengan melakukan itu saya memperkenalkan tanda kurung. Saya tidak tahu bagaimana kebutuhan khusus Anda untuk tanda kurung, mungkin itu sangat berbeda, dalam hal ini akan ada serangkaian perintah yang berbeda untuk mencapainya. Jika saya berhenti untuk memikirkan lebih lama tentang contoh saya yang dibuat-buat, saya mungkin akan menemukan cara yang lebih efisien untuk mencapainya juga, tetapi siapa yang punya waktu untuk berhenti dan berpikir.
(Cobalah, salin-tempel (maaf, nyentak-put) teks dan perintah ke buffer, dan dengan kursor Anda pada karakter pertama, 'f', dari perintah hit
y$
. Sekarang perintahnya ada di register tanpa nama Anda. Pindah ke awal baris pertama dan tekan:normal <C-r>"
ke a) masukkan mode baris perintah, b) mulai jalankan perintah mode normal dari baris perintah, dan c) untuk menempelkan ( atchoo put) register yang tidak disebutkan namanya ke dalam baris perintah seperti biasa perintah mode yang akan dieksekusi. Satu-satunya hal yang perlu Anda ubah dalam perintah ini adalah mengganti<Esc>
serangkaian karakter palsu (karena Anda menyalin atchoo yang disisipkan dari browser Anda) dengan kode kunci Escape yang sebenarnya, jadi hapus dan tekan<C-v>
lalu tombol Esc Anda. Ini akan terlihat seperti^[
. Sekarang tekan kembali untuk menjalankan perintah. Atau ... ketikkan saja string tombol untuk menguji perintah, saya hanya ingin menunjukkan kepada Anda bahwa Anda dapat berinteraksi dengan mode normal dari mode cmdline juga, dan<C-v>
, dan<C-r>
, dan semua kejayaan lain dari Wonderland. Juga, lihat:help Cmdline-mode
.)3
Untuk menghapus kata mundur Anda dapat menggunakan pemetaan standar
<C-w>
(lihat:help i_Ctrl-w
). Saya tidak tahu apakah ada pemetaan default untuk menghapus kata ke depan, tapi saya kira Anda bisa membuatnyaSekali lagi,
<C-o>
akan membawa Anda keluar dari mode penyisipan untuk perintah satu kali dandw
akan "menghapus" atas gerakan "kata". Lihat:help d
,:help w
. Jika kata-kata penerusan yang Anda hapus bukanlah kata-kata aktual tetapi nama # fungsi, Anda mungkin ingin menggunakanW
(lihat:help W
). Jika Anda sebagian besar sudah dalam mode normal, Anda tidak perlu pemetaan ini, cukup lakukandw
,db
atau teman.Beberapa membantu bab untuk melihat lebih dekat
:help <C-o>
:help Insert
:help f
dan bagian berikut (F
,t
,T
,;
dan,
):help word-motions
sumber
Untuk menjawab pertanyaan Anda tentang suntingan lokal: jika Anda dalam mode sisipkan dan tekan
ctrl-O
Anda akan melakukan perintah berikutnya dalam mode sisipkan. Ini bisa berguna jika Anda memutuskan untuk menghapus garis. Ada beberapa perintah lain dalam mode penyisipan untuk hal-hal kecil, seperti menempelkan dari register dan melengkapi kata-kata secara otomatis. Anda dapat membaca semuanya dengan:h ins-special-keys
.Seringkali ada cara yang lebih baik untuk melakukan sesuatu dalam mode normal. Misalnya, katakanlah Anda ingin mengelilingi ekspresi dengan tanda kurung. Beberapa hal yang dapat Anda lakukan adalah
i(<end>)
,i(<esc>A)
,c$()<esc>P
. * Hal favorit saya melibatkan memiliki salah satu "diperlukan" vim plugin, vim-surround . Dengan vim-surround, hanya sajays$)
. Apa yang hebat dari semua ini adalah bahwa begitu Anda tahu bagaimana melakukannya dalam satu situasi, Anda dapat melakukannya dalam semua situasi yang serupa. Bagaimana jika alih-alih menambahkan tanda kurung ke akhir baris, itu hanya tiga kata? Anda bisa menggunakanc3w()<esc>P
atauys3w)
. Bagaimana dengan seluruh lini?cc()<esc>P
atauyss)
.Satu hal yang sangat membantu adalah menambah
inoremap jk <esc>
vimrc Anda. Kemudian Anda dapat keluar dari mode insert dengan menekan jk. Ini menghilangkan sebagian besar overhead dari mode insert sehingga Anda dapatjk<sequenceofcommands>i
melakukan perintah tanpa mengganggu ketikan Anda.sumber
:h ins-special-keys
, periksa:h ins-special-special
lebih banyak pemetaan.Perintah setara dalam mode normal
w
,b
,^
,$
,dw
,db
. Perhatikan logikanya:dw
menghapus apa yang dicakup olehw
dandb
menghapus apa yang dicakup olehb
. Perintah apa yang akan Anda gunakan untuk menghapus apa yang dicakup oleh^
? Atau menariknya?Logika seperti bahasa itu adalah inti dari pengeditan modal; mungkin perlu beberapa waktu untuk menyesuaikannya tetapi tidak ada putar balik.
Perintah setara dalam modus insert adalah:
<C-Right>
,<C-Left>
,<Home>
,<End>
,<C-w>
dan ... apa-apa tetapi Anda dapat membuat pemetaan sederhana:inoremap <C-something> <C-o>dw
.Memang. Pendekatan yang tepat adalah memasukkan mode penyisipan untuk menyisipkan teks sesedikit mungkin dan kembali ke mode normal sesegera mungkin.
Seperti di editor teks atau IDE atau pemroses teks apa pun
<textarea>
:Sekali lagi, mode sisipkan adalah untuk menyisipkan teks. "Memanipulasi teks" dan bergerak di sekitar seharusnya terjadi dalam mode normal.
Silakan ajukan pertanyaan yang lebih tepat.
sumber
End
atau tombol panah) dalamINSERT
mode OK?Yah, bisa dikatakan cara Vim adalah tidak tetap dalam mode INSERT. Momen mencerahkan di Vim datang ketika Anda menyadari bagaimana Anda tidak perlu tetap dalam mode INSERT. Ada banyak cara untuk menyisipkan teks, dan semuanya dimulai dari mode NORMAL.
Yang sedang berkata, saya bukan yang benar sendiri, dan saya memetakan kembali kunci untuk melakukan pekerjaan (à la Windows):
sumber