Bagaimana cara mencapai pemilihan panjang teks yang berbeda pada baris yang berbeda?

10

anggap saya memiliki teks berikut:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

Saya ingin melakukan seleksi seperti di bawah ini:

aaa-dd-e:"aaa",
bb-x:"bb",
c-9:"c"

Saya mencoba menggunakan cv untuk membuat blok visual, tetapi setelah saya membuat seleksi pada kolom pertama dan saya menekan "f:" (saya bermaksud memperluas seleksi menjadi tanda titik dua pada setiap baris seperti di atas), yang saya dapatkan adalah:

aaa-dd-e: "aaa",:
bb-x"bb",
c-9:"c"

seleksi berhenti di usus besar pertama dan membuat persegi panjang.

Aaron Shen
sumber
6
Apa yang ingin Anda capai dengan pilihan itu, mungkin ada cara lain
Arjen Dijkstra
Jika dipisahkan oleh karakter, Anda dapat mencoba menyelaraskan kembali blok pertama dan memilihnya kemudian. Lihat: Sejajarkan teks hanya pada pemisah pertama di VIM
kenorb

Jawaban:

6

Seleksi secara umum merupakan tujuan untuk mencapai tujuan, lebih-lebih dalam Vim di mana seleksi seringkali tidak diperlukan sejak awal.

Dengan asumsi Anda masih ingin menempatkan kutipan di sekitar nama properti di file non-JSON Anda untuk mengubahnya menjadi JSON yang tepat:

  1. pilih garis untuk dimodifikasi, karakter-bijaksana atau garis-bijaksana, tidak masalah,
  2. :'<,'>norm I"^[f:i"( '<,'>secara otomatis dimasukkan untuk Anda dan ^[diperoleh dengan <C-v><Esc>).

Jika Anda memiliki plugin surround yang indah, langkah 2 menjadi:

:'<,'>norm ^vt:S"

Dengan substitusi, langkah 2 bisa menjadi:

:'<,'>s/^\s*\([^:]*\):/"\1"
romainl
sumber
kalian benar, sekarang saya menemukan bahwa pemilihan visual mungkin tidak perlu. dengan bantuan atau :g/regex/norm, saya dapat dengan mudah mencapai apa pun yang ingin saya lakukan.
Aaron Shen
Apakah ada cara saya bisa meletakkan seluruh blok yang dipilih ke clipboard sistem dan menempelkannya di file lain?
Aaron Shen
Tentu saja. Dengan asumsi Vim Anda dikompilasi dengan dukungan clipboard yang dapat Anda lakukan "+yatau "*y, tergantung pada clipboard yang ingin Anda targetkan. Ada banyak pertanyaan terkait di sekitar sini.
romainl
14

Vim hanya mendukung pilihan blok persegi panjang, dengan pengecualian batas kanan bergerigi ketika Anda menekan $.

Ada beberapa plugin (seperti vim multiple cursors ) yang dapat meniru banyak pilihan, tetapi Anda juga harus dapat mencapai tujuan Anda yang sebenarnya (yang sayangnya tidak Anda sebutkan) dengan perintah Vim murni, misalnya :globaldan :substitute(jika Anda dapat memformulasikan sebuah reguler ekspresi yang cocok dengan seleksi di setiap baris), atau dengan mengulangi makro (jika ada gerakan tertentu yang mencakup seleksi di setiap baris).

Ingo Karkat
sumber
bagaimana jika saya ingin memotong garis-garis itu dan menempelkan ke buffer lain?
Aaron Shen
1

Hanya untuk melemparkan topi lain ke atas ring, jika Anda benar-benar ingin menggunakan pemilihan visual, Anda dapat menggunakan plugin Tabular untuk meluruskan titik dua, kemudian buat pilihan visual Anda.

Jika Anda mengambil teks asli Anda:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

:Tab /:\zs akan menyelaraskan semuanya setelah titik dua, seperti di bawah ini

aaa-dd-e:  "aaa",
bb-x:      "bb",
c-9:       "c"

Dan kemudian Anda dapat membuat pilihan blok visual Anda.

Seperti yang dikatakan orang lain, pemilihan visual mungkin tidak diperlukan dalam situasi ini. Menggunakan normatau mengganti mungkin dapat mencapai apa yang Anda inginkan tanpa repot dengan pilihan visual.

Zach Ingbretsen
sumber
1

Saya telah menemukan solusi untuk masalah ini yang sangat sederhana! Mulai mode blok visual dari bagian bawah pemilihan teks yang ingin Anda salin dan pilih ke atas! Ini akan memperluas blok saat Anda naik, sedangkan jika Anda menyorot ke bawah tampaknya membuat pilihan lebih kecil.

Arthur Bowers
sumber
Tapi dengan cara ini akan selalu menjadi blok persegi panjang, bukan? Ketika saya membacanya, ini bukan yang diinginkan OP (mereka menyebutkan mereka mencoba mode blok visual).
Martin Tournoij
Tidak. Itu akan selalu menjadi blok persegi panjang jika semua garis memiliki panjang yang sama. Saya telah menemukan bahwa mulai dari bawah dan menyorot ke atas dan kemudian menekan $ untuk pergi ke akhir baris akan menghasilkan semua garis yang disorot disorot ke akhir baris.
Arthur Bowers