2012-06-22 25 views
8

Tôi có một tình huống mà tôi muốn thay thế FOO bằng BAR qua một tệp; tuy nhiên, tôi chỉ muốn làm điều đó ở những nơi nhất định, nói giữa các dòng 68-104, 500-537 và 1044-1195. Trên thực tế Anh đã đánh rơi đánh dấu (ma, mb, mc, ...) tại các dòng của lãi suất, và tôi chạy như sau:Tìm kiếm và thay thế Vim - giới hạn ở một số dòng nhất định

:'a,'b s/FOO/BAR/g | 'c,'d s/FOO/BAR/g | 'e,'f s/FOO/BAR/g 

tôi phải lặp lại hàng chục này lần với tìm kiếm khác nhau và thay thế thuật ngữ s/CAT/DOG, vv, mà đã trở thành một nỗi đau phải có để viết lại dòng lệnh mỗi lần. Tôi đã may mắn ở chỗ tôi chỉ có 3 nơi mà tôi muốn giới hạn tìm kiếm của mình (tưởng tượng nếu có 30 hoặc 40, dòng lệnh sẽ lộn xộn như thế nào).

Viết ngắn chức năng, có cách nào khác để thực hiện việc này không?

Trên ghi chú liên quan. Tôi sao chép FOO đến 's' (tìm kiếm) đăng ký, và Bar đến 'r' (thay thế) và cố gắng một dòng lệnh của

:'a,'b s/\[email protected]/\[email protected]/ | 'c,'d s/\[email protected]/\[email protected]/ | 'e,'f s/\[email protected]/\[email protected]/ 

này sẽ có lưu tôi phải viết lại dòng lệnh mỗi thời gian, nhưng than ôi, nó không hoạt động. Bit thay thế là tốt \ = @ r, nhưng các \ = @ s trong mẫu tìm kiếm đã đưa ra một lỗi.

Mọi mẹo sẽ được đánh giá cao.

+0

Bạn cũng có thể sử dụng Control-P và KIỂM SOÁT -N (Tôi nghĩ) để chuyển qua các lệnh trước đó. Điều này sẽ loại bỏ sự cần thiết phải gõ lại lệnh. – jahroy

+0

bình thường là chấp nhận câu trả lời, nếu nó hữu ích. – epsilonhalbe

Trả lời

2

Thay vì sử dụng sử dụng marker này:

:68,104s/FOO/BAR/g << substitue from line 68 to 104

này nên làm cho công việc của bạn một chút dễ dàng hơn và rõ ràng hơn.

5

Nếu bạn cần thực hiện một loạt các thao tác dòng (như thay thế) trên một loạt các dòng khác nhau, một mẹo bạn có thể sử dụng là làm cho các dòng này trông khác nhau bằng cách thêm tiền tố đầu tiên t được chia sẻ bởi bất kỳ dòng nào khác).

Cách tôi thường làm điều này là thụt lề toàn bộ tệp với một số thứ như >G được thực hiện trên dòng đầu tiên, sau đó sử dụng các lệnh :s/^ /X/ hoặc chặn hình ảnh để thay thế các khoảng trắng đầu tiên bằng X trên các dòng tôi muốn.

Sau đó, sử dụng :g kết hợp với :s. ví dụ:

:%g/^X/s/FOO/BAR/g 
:%g/^X/s/BAZ/QUUX/g 

Cuối cùng, hãy xóa các tiền tố tạm thời.

+0

Tôi thấy những gì bạn đang ở - đặt dấu tạm thời trong cột đầu tiên cho mỗi dòng trong phạm vi của tôi. Đó là một ý tưởng tuyệt vời cảm ơn. (Thật không may nó sẽ không hoạt động trong trường hợp này vì tập tin văn bản là mã nguồn, và tôi muốn biên dịch như tôi đã đi theo.) –

+1

Bạn có thể đặt chú thích ở mỗi dòng kết thúc để phân biệt các dòng mã, không nên can thiệp với biên dịch. – epsilonhalbe

2

Với q:, bạn có thể nhớ lại dòng lệnh trước và chỉnh sửa chúng như một bộ đệm Vim bình thường, vì vậy bạn có thể nhanh chóng thay thế FOOBAR với cái gì khác, sau đó lại thực hiện phù hợp với Nhập.

s/\[email protected]/\[email protected]/ không hoạt động; như bạn đã nói, điều này chỉ hoạt động trong phần thay thế. Nhưng đối với các mô hình, bạn có thể sử dụng tổ hợp phím Ctrl + RCtrl +Rs để chèn nội dung của đăng ký s, thay vì \[email protected]. Tốt hơn là sử dụng thanh ghi mặc định, sau đó nó đơn giản là s//, nhưng bạn có thể đã biết điều đó rồi.

+0

_q: _ có nghĩa là gì? – jahroy

+0

Ah! Tôi không biết q: lệnh - tốt! –

3

lấy cảm hứng từ @ VDT của câu trả lời:

Tôi không chắc chắn nhưng bạn có thể viết tất cả các thay xuống trong một tập tin và nguồn mà nộp tôi nghĩ. substitutions.vim:

68,104s/FOO/BAR/g 
168,204s/FOO/BAR/g 
618,644s/FOO/BAR/g 
681,1014s/FOO/BAR/g 
. 
. 
. 
68,104s/BAZ/BOOO/g 
168,204s/BAZ/BOOO/g 

và sau đó :so substitutions.vim có lẽ bạn cũng có thể sử dụng cho nhiều file của cùng một cấu trúc. bạn có thể thêm e để thêm thông báo lỗi bỏ qua, nếu không rõ là các thay thế được tìm thấy trên các khối dòng tương ứng.

+0

Vâng, điều đó cũng có hiệu quả. Tôi không biết lá cờ 'e' - cảm ơn. –

+0

cho 'e' tôi phải cung cấp cho đạo cụ để http://stackoverflow.com/questions/11146763/about-a-key-binding-to-remove-trailing-spaces-and-save/11146887#11146887 câu trả lời này bởi @ pb2q – epsilonhalbe

+0

ps Tôi vừa thử nó trên một tập tin thử nghiệm, và nó hoạt động như một sự quyến rũ. Cảm ơn bạn. –

2

Khi được thực hiện trên một nếp gấp, các thay thế được giới hạn ở nếp gấp đó.

  1. gấp từng vùng
  2. đặt con trỏ trên một đóng gấp
  3. thực hiện việc thay thế: :s/foo/bar<CR>
  4. chuyển sang tiếp theo đóng gấp với zj hoặc zk
  5. sử dụng lịch sử dòng lệnh: :<C-p><CR> hoặc :<Up><CR> để thực hiện cùng một thay thế
  6. lặp lại…

Bạn cũng có thể thêm cờ c vào cuối thay thế để Vim yêu cầu bạn xác nhận trước khi thực sự thực hiện nó. Điều này có thể tẻ nhạt nếu bạn có nhiều trận đấu.

4

Để thoát khỏi sự cần thiết phải nhập lại mô hình tìm kiếm, thay chuỗi và cờ, một cách đơn giản có thể sử dụng lệnh :& với & cờ:

:'a,'bs/pat/str/g|'c,'d&&|'e,'f&& 
+0

: & là một cái mới về tôi. Cảm ơn, nó sẽ rất tiện dụng. –

+0

@Dave: Thực sự rất hữu ích. Nếu tôi hiểu câu hỏi một cách chính xác, sử dụng lệnh ': &' giải quyết vấn đề đã nêu, phải không? –

+0

Trong ví dụ tôi đưa ra, vâng, đó là lời cảm ơn hoàn hảo. Tuy nhiên, nếu tôi có nhiều địa điểm mà tôi muốn tìm kiếm, tôi nghĩ rằng câu trả lời của @ eipson-2-halbe có thể thực tế hơn. Giả sử tôi có 40 vị trí, sau đó tìm nguồn cung ứng tệp văn bản bên ngoài có thể dễ quản lý hơn khi đặt 40 'xxx,' yyy && mục nhập trên dòng lệnh. Một sự kết hợp của cả hai phương pháp của bạn có lẽ là cách để đi! –

Các vấn đề liên quan