Gerakan Grok Vim dan suntingan sederhana

8

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 NORMALmode untuk mengeluarkan satu gerakan, hanya untuk memasukkan kembali INSERTmode tidak optimal.

Contoh 1: Ketika dalam INSERTmode 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 INSERTmode 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 NORMALmode 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.

SabreWolfy
sumber
1
Cara Vim mungkin menggunakan plugin seperti algoritme.com.au/code/vimacs . : P Dapatkah Anda memasukkan penjelasan tentang apa yang dilakukan perintah ini di emacs? Daftar Ctrl / Alt / Meta-foo / bar cukup berarti bagi siapa saja yang tidak menggunakan emacs. Dan Ctrl-W menghapus kata sebelum kursor. Saya juga merasa ini agak terlalu luas.
muru
1
Jika kita menggunakan cara plugin, Anda harus memeriksa github.com/tpope/vim-rsi
dkns
3
Saat pindah dari bahasa pemrograman "A" ke "B". Yang terbaik adalah tidak menulis "B" dengan gaya "A" tetapi belajar idiom standar "B" (ini pelajaran yang sulit bagi kebanyakan pengembang). Aturan yang sama berlaku untuk editor. Jangan mencoba dan menerapkan alur kerja standar editor "A" ke editor baru Anda "B". Lebih suka mempelajari idiom menggunakan "B" secara langsung. Kurva belajar lebih besar tetapi jauh lebih produktif dalam jangka panjang. Pada vimsaat mengedit Anda menghabiskan sebagian besar waktu Anda dalam mode normal bukan dalam mode insert.
Martin York

Jawaban:

6

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)

inoremap <C-a> <C-o>0

atau, jika awal baris berarti karakter baris pertama yang tidak kosong

inoremap <C-a> <C-o>^

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

let cchar = s:cchar["atx"]

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:ccharbelum diberi nilai untuk "atx"kuncinya. Dengan kursor saya (dalam mode normal) pada karakter pertama, 'l', saya bisa mengetik

f=wcf[MyFunction(<Esc>$r)

Secara singkat, ini mengatakan

  • f=- maju ke '=' (saya bisa mengatakan fs, 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

let cchar = |"atx"]

di mana |kursor, dan saya dalam mode sisipkan. Saya kemudian mengetik MyFunction(dan meninggalkan mode insert ( <Esc>).

  • $- Pindahkan kursor ke ujung garis. Saya bisa saja menggunakan Ekata-kata besar atau f]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 membuatnya

inoremap <C-S-w> <C-o>dw

Sekali lagi, <C-o>akan membawa Anda keluar dari mode penyisipan untuk perintah satu kali dan dwakan "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 menggunakan W(lihat :help W). Jika Anda sebagian besar sudah dalam mode normal, Anda tidak perlu pemetaan ini, cukup lakukan dw, dbatau teman.

Beberapa membantu bab untuk melihat lebih dekat

  • :help <C-o>
  • :help Insert
  • :help fdan bagian berikut ( F, t, T, ;dan ,)
  • :help word-motions
jjaderberg
sumber
5
Menulis TIDAK linier. Siapa pun yang dapat menulis prosa (atau kode) dari awal hingga selesai tanpa melakukan semacam penyuntingan adalah gila atau memiliki kekuatan Dewa. Untuk kita semua, kita melakukan lebih banyak pengeditan daripada menulis dan karena itu memikirkan editor Anda sebagai melakukan perintah edit (mode NORMAL) pertama dan menulis (mode INSERT) kedua lebih efisien. Dan inilah inti sebenarnya mengapa editor seperti Emacs, MS Word, Notepad, dll. Mundur dalam pendekatan mereka. Sangat disayangkan bahwa konsep mode-kurang ada tetapi harus ada penyebut umum terendah.
Sukima
12

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).

Untuk menjawab pertanyaan Anda tentang suntingan lokal: jika Anda dalam mode sisipkan dan tekan ctrl-OAnda 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.

Contoh 1: Ketika dalam mode INSERT untuk memasukkan (di awal ekspresi, bagaimana saya harus pindah ke akhir ekspresi atau baris untuk memasukkan yang sesuai) di Vim?

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 saja ys$). 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 menggunakan c3w()<esc>Patau ys3w). Bagaimana dengan seluruh lini? cc()<esc>Patau yss).

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 mode INSERT 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 mode NORMAL untuk gerakan sederhana atau menghapus kata-kata.

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 dapat jk<sequenceofcommands>imelakukan perintah tanpa mengganggu ketikan Anda.

Hovercouch
sumber
Selain itu :h ins-special-keys, periksa :h ins-special-speciallebih banyak pemetaan.
Lithis
9

Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D dan Alt-Backspace

Perintah setara dalam mode normal w, b, ^, $, dw, db. Perhatikan logikanya: dwmenghapus apa yang dicakup oleh wdan dbmenghapus apa yang dicakup oleh b. 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.

Kembali ke NORMALmode untuk mengeluarkan satu gerakan, hanya untuk memasukkan kembali INSERTmode tidak optimal.

Memang. Pendekatan yang tepat adalah memasukkan mode penyisipan untuk menyisipkan teks sesedikit mungkin dan kembali ke mode normal sesegera mungkin.

Contoh 1: Ketika dalam INSERTmode untuk memasukkan a (di awal ekspresi, bagaimana saya harus pindah ke akhir ekspresi atau garis untuk memasukkan yang sesuai )di Vim?

Seperti di editor teks atau IDE atau pemroses teks apa pun <textarea>:

<End>)

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 INSERTmode 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 NORMALmode untuk gerakan sederhana atau menghapus kata-kata.

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.

romainl
sumber
Menggunakan gerakan (seperti Endatau tombol panah) dalam INSERTmode OK?
SabreWolfy
4
Tentu saja, apa pun yang membuat pekerjaan Anda lebih mudah.
romainl
3

Apa cara Vim menerapkan fungsi serupa? Kembali ke mode NORMAL untuk mengeluarkan satu gerakan, hanya untuk memasukkan kembali mode INSERT tidak optimal.

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):

nmap <C-BACKSPACE> dbi
nmap <C-DEL> dei
imap <C-BACKSPACE> <ESC>ldbi
imap <C-DEL> <ESC>ldei
tharibo
sumber