Membatasi operasi ke bagian kode


10

Ada banyak waktu dalam kehidupan kerja saya sehari-hari sehingga saya perlu mengoperasikan fungsi tertentu, hal-hal seperti menyoroti atau mencari variabel, tetapi saya tidak pernah berhasil membatasi ruang lingkup pengeditan / pencarian.

Apakah ada cara di vim untuk secara selektif mengatakan, menemukan semua referensi $colordi dalam set kawat gigi ini, atau lipatan ini dll. Jika mungkin, akan ideal ini relatif generik, sehingga dapat diterapkan pada Mengedit / Mengganti teks.

Sebagai contoh:

$color = "#fff";
function PickColor () {
  $color = "#bbb";
  $newColors = ["#000", "#fbf", $color];
  foreach ($newColors as $c) {
    if ($c == "#fff") {
       break;
    }
  }
}
$differentColor = $color;

Namun, kode ini adalah contoh yang relatif buruk, jika saya perlu mengganti semua instance $ color bagaimana orang melakukan ini dalam konteks fungsi PickColor. Sebagai contoh lain, menggunakan #dan *Anda dapat pergi ke contoh berikutnya dari objek teks itu, bagaimana Anda membatasi ruang lingkup pencarian hanya fungsi ini (pada dasarnya membungkus pencarian) bertentangan dengan seluruh file yang dapat menjangkau ribuan baris dan kehilangan tempat Anda, atau salah mengganti sesuatu di fungsi lain yang seharusnya tidak Anda miliki?

Jawaban:


15

Berikut ini beberapa cara untuk melakukannya.

1  | $color = "#fff";
2  | function PickColor () {
3  |     $color = "#bbb";
4  |     $newColors = ["#000", "#fbf", $color];
5  |     foreach ($newColors as $c) {
6  |         if ($c == "#fff") {
7  |             break;
8  |         }
9  |     }
10 | }
11 | $differentColor = $color;

Saya telah memodifikasi contoh Anda untuk memasukkan nomor baris.

Jadi sekarang Anda dapat mengganti contoh $color, dengan mengatakan $newColor, dengan cara berikut.

Kisaran Nomor Baris

:1,11s/\$color/$newColor/g

Ini membuat substitusi beroperasi pada jalur 1-11 inklusif.

Rentang Garis Relatif

Tempatkan kursor Anda pada baris 1, lalu ...

:.,11s/\$color/$newColor/g

Ini mengatakan kisaran dimulai dengan garis saat ini dan berakhir pada garis 11.

Kisaran Pemilihan Visual

Pergi ke baris 1 dan tekan Shift+Vkemudian G. Ini secara visual memilih baris 1. Lalu ...

:'<,'>:s/\$color/$newColor/g

Ini membatasi substitusi ke rentang yang dicakup oleh pilihan Anda. Vim akan secara otomatis memasukkan '<,'>rentang untuk Anda ketika Anda menekan :dengan pilihan aktif.


Saya suka vim, selalu ada sesuatu untuk dipelajari dan ditemukan untuk membuat hidup lebih mudah dan setiap hari :)
Kyle Mcgill

6

Jika Anda merasa nyaman mengambil rute plugin, ada NrrwRgn .

Anda memilih blok secara visual, lalu menjalankan :NRperintah, yang membuka buffer baru (dalam split) dengan teks yang dipilih. Anda dapat membuat modifikasi pada buffer ini, dan ketika Anda menyimpannya, buffer itu akan disimpan kembali ke file aslinya juga.

Menurut pendapat saya, plugin ini memecahkan masalah dengan sangat baik, membiarkan Anda fokus pada operasi yang ingin Anda lakukan tanpa memikirkan kembali cara menerapkannya pada rentang tertentu.


Ini adalah salah satu plugin yang saya bersumpah .. ini seperti memiliki sedikit scratch buffer yang dapat Anda komit kembali ke file kode normal Anda.
craigp

3

Anda memilih blok yang Anda minati dalam mode garis visual (shift + v) dan kemudian Anda mengetik :dan perintah Anda yang sekarang akan berlaku untuk blok.

Jadi, jika Anda ingin mengganti dalam seleksi, Anda dapat menjalankan :s/string/replacement_string


Baik; misalnya,VaB:s/\$color/replaced/g
wchargin

Baru saja menambahkan itu, poin bagus :)
Stefan Dorunga

0

Gunakan objek teks kurung '}' dan pilih di dalam kurung dengan 'i}'

pada baris dengan kurung kurawal pembukaan fungsi:

$<C-V>i}:s/\$color/$newColor/g

pertama pergi ke akhir baris (yang akan berada di atau di dalam kurung pembuka) kemudian untuk masuk ke pemilihan visual, kemudian pilih menggunakan objek teks kawat gigi. 'i}' ada di dalam kawat gigi 'a}' ada di sekitar kawat gigi.

Untuk bahasa yang tidak memiliki kawat gigi, Objek Teks Vim: Panduan Definitif menyarankan beberapa plugin:

  • Untuk bahasa seperti Python dan CoffeeScript, Objek Indent menyediakan objek teks berdasarkan level indentasi: aitermasuk level indentasi saat ini dan baris di atas; iitermasuk tingkat indentasi saat ini tidak termasuk baris di atas.
  • Ruby Block menambahkan dukungan untuk objek teks ardan ir, berdasarkan pada keberadaan endkata kunci.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.