Hạn chế hoạt động đối với một phần của mã


10

Có rất nhiều lần trong cuộc sống làm việc hàng ngày của tôi mà tôi cần phải hoạt động trên một chức năng cụ thể, những việc như làm nổi bật hoặc tìm kiếm một biến, nhưng tôi chưa bao giờ quản lý để giới hạn phạm vi chỉnh sửa / tìm kiếm.

Có cách nào để vim nói một cách có chọn lọc, tìm tất cả các tham chiếu $colorbên trong các bộ niềng răng này, hoặc nếp gấp này, v.v. Nếu có thể, lý tưởng này là tương đối chung chung, để nó có thể được áp dụng cho Chỉnh sửa / Thay thế văn bản.

Ví dụ:

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

Mã này là một ví dụ tương đối xấu, tuy nhiên, nếu tôi cần thay thế tất cả các phiên bản của $ color thì làm thế nào một người có thể làm điều này trong ngữ cảnh của hàm PickColor. Một ví dụ khác, sử dụng #*Bạn có thể đi đến phiên bản tiếp theo của đối tượng văn bản đó, làm thế nào bạn sẽ giới hạn phạm vi tìm kiếm chỉ với chức năng này (về cơ bản là tìm kiếm) trái ngược với toàn bộ tệp có thể kéo dài hàng ngàn dòng và mất vị trí của bạn, hoặc thay thế không chính xác một cái gì đó trong một chức năng khác mà bạn không nên có?

Câu trả lời:


15

Dưới đây là một vài cách để làm điều đó.

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;

Tôi đã sửa đổi ví dụ của bạn để bao gồm số dòng.

Vì vậy, bây giờ bạn có thể thay thế các trường hợp $color, bằng cách nói $newColor, theo các cách sau.

Phạm vi số dòng

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

Điều này làm cho sự thay thế hoạt động trên các dòng 1-11.

Phạm vi dòng tương đối

Đặt con trỏ trên dòng 1, sau đó ...

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

Điều này cho biết phạm vi bắt đầu với dòng hiện tại và kết thúc trên dòng 11.

Phạm vi lựa chọn trực quan

Đến dòng 1 và nhấn Shift+Vsau đó G. Điều này trực quan chọn dòng 1. Sau đó ...

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

Điều này giới hạn sự thay thế trong phạm vi được bao phủ bởi lựa chọn của bạn. Vim sẽ tự động chèn '<,'>phạm vi cho bạn khi bạn nhấn :với một lựa chọn hoạt động.


Tôi yêu vim, luôn có thứ gì đó để học hỏi và khám phá để làm cho cuộc sống dễ dàng hơn và hàng ngày :)
Kyle Mcgill

6

Nếu bạn cảm thấy thoải mái khi sử dụng lộ trình plugin, có NrrwRgn .

Bạn trực quan chọn một khối, sau đó chạy :NRlệnh, mở ra một bộ đệm mới (trong một phần tách) với văn bản đã chọn. Bạn có thể sửa đổi bộ đệm này và khi bạn lưu vào bộ đệm, nó cũng được lưu lại vào tệp gốc.

Theo tôi, plugin này giải quyết vấn đề rất tốt, cho phép bạn tập trung vào các hoạt động bạn muốn làm mà không cần suy nghĩ lại cách áp dụng chúng vào một phạm vi cụ thể.


Đây là một trong những plugin tôi thề .. nó giống như có một bộ đệm đầu nhỏ mà bạn có thể cam kết trở lại tệp mã thông thường của mình.
craigp 4/2/2015

3

Bạn chọn khối bạn quan tâm trong chế độ dòng trực quan (shift + v) và sau đó bạn nhập :và lệnh của bạn sẽ áp dụng cho khối.

Vì vậy, nếu bạn muốn thay thế trong lựa chọn, bạn có thể chạy :s/string/replacement_string


đúng; ví dụ:VaB:s/\$color/replaced/g
wchargein

Chỉ cần thêm rằng, điểm tốt :)
Stefan Dorunga

0

Sử dụng đối tượng văn bản dấu ngoặc nhọn '}' và chọn bên trong dấu ngoặc nhọn với 'i}'

trên dòng với dấu ngoặc nhọn mở của hàm:

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

đầu tiên đi đến cuối dòng (sẽ ở trên hoặc bên trong dấu ngoặc mở) sau đó để đi vào lựa chọn trực quan, sau đó chọn sử dụng đối tượng văn bản dấu ngoặc nhọn. 'i}' nằm trong niềng răng 'a}' xung quanh niềng răng.

Đối với các ngôn ngữ thiếu dấu ngoặc nhọn, Vim Text Object: The Definitive Guide gợi ý một số plugin:

  • Đối với các ngôn ngữ như Python và CoffeeScript, Indent Object cung cấp các đối tượng văn bản dựa trên mức độ thụt lề: aibao gồm mức thụt dòng hiện tại và dòng ở trên; iibao gồm mức thụt dòng hiện tại không bao gồm dòng trên.
  • Ruby Block bổ sung hỗ trợ cho các đối tượng văn bản arir, dựa trên sự hiện diện của endtừ khóa.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.