Làm thế nào để có được một bản xem trước cho lệnh thay thế?


9

Rất thường xuyên, tôi thấy mình cần thực hiện một sự thay thế sẽ có các kết quả trùng khớp trên một tệp lớn và với các biểu thức tìm kiếm và thay thế không tầm thường.

Ví dụ, nói rằng tôi có một số cuộc gọi chức năng như okFunction(arg1, arg2 arg3). Các đối số sẽ khác nhau với mỗi cuộc gọi chức năng, tất nhiên. Bây giờ nói rằng tôi đã phát hiện ra một chức năng tốt hơn mà không cần arg2. Tôi có thể dễ dàng điều chỉnh toàn bộ tập tin với

:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc

Mặc dù về mặt khái niệm đơn giản, tôi không chắc mình đã có cú pháp đúng trong mẫu khá dài này. Các ccờ thực sự giúp ở đây, nhưng vấn đề là khi yêu cầu xác nhận, vim sẽ không hiển thị gì trận đấu sẽ được thay thế bằng. Ý tôi là, nó sẽ hiển thị biểu thức thay thế, nhưng không phải là kết quả được đánh giá. Nếu tôi xác nhận thay thế bằng y, vim sẽ ngay lập tức nhảy sang trận đấu tiếp theo và tôi sẽ không được xem liệu tôi có phạm lỗi gì không.

Tôi đã tìm thấy plugin vim-over giải quyết một phần vấn đề, nhưng chỉ khi tất cả các phép toán được hiển thị trên màn hình khi bạn đang gõ lệnh. Khi bạn nhấn enter, hành vi giống hệt như tôi đã mô tả ở trên và tôi không nhận được bản xem trước.

Vì vậy, có cách nào để vim đánh giá biểu thức thay thế khi yêu cầu xác nhận các lệnh thay thế không?


2
đó là một mục trong danh sách người theo dõi vim-bug (xin lỗi hiện tại không tìm thấy nó)
Christian Brabandt

2
Để biết giá trị của nó, tôi thường sử dụng thay thế trên dòng đầu tiên để thay thế mà không có %, kiểm tra xem kết quả có đúng như tôi mong đợi không và sau đó sử dụng thay thế bằng %(chỉ một vài lần nhấn phím :<up><c-b>%:). Rõ ràng một tùy chọn xem trước sẽ hiệu quả hơn nhiều. Mặc dù không có bản vá nào, có lẽ người ta có thể bọc sự thay thế trong chức năng vimscript bằng loại tùy chọn này nhưng nghe có vẻ nhiều việc ...
statox

2
@ChristianBrabandt Tìm thấy nó . Đó là ưu tiên chưa được phân loại ...
Vitor Eiji

2
@VitorEiji đó không phải là người tôi đã nghĩ đến. Nhưng nó không thực sự quan trọng, vì hiện tại nó không thể. Neovim cung cấp tùy chọn 'inccommand', có thể hoạt động (hoặc không, tôi thực sự không phải bây giờ)
Christian Brabandt

Cái ác xem trước sự thay thế; Tôi không biết làm thế nào nó làm điều đó, mặc dù.
Geremia

Câu trả lời:


2

Một cách giải quyết là macro. Làm nổi bật tất cả các khu vực có vấn đề và thực hiện thay thế trên một dòng tại một thời điểm. Sau đó quyết định xem bạn có muốn hay không. Khi bạn thực hiện nđến khu vực tiếp theo.

Đối với trường hợp của bạn cụ thể:

  1. Tìm kiếm các khu vực: /\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
  2. Bắt đầu ghi một macro qq.
  3. Ứng dụng :s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
  4. Dừng ghi macro q
  5. Hoặc hoàn tác ( u) hoặc đi đến kết quả tìm kiếm tiếp theo ( n).
  6. Áp dụng vĩ mô @q.
  7. Lặp lại các bước 5 và 6 khi cần thiết.

Rõ ràng không hoàn toàn những gì bạn đang tìm kiếm, nhưng đây thường là những gì tôi làm.


thật tuyệt Tôi không bao giờ nhận ra rằng khi bạn thực hiện tìm kiếm với /nó cũng hoạt động như một lựa chọn trực quan - tốt đẹp.
the_velour_fog

@the_velour_fog " /... hoạt động như một lựa chọn trực quan." Thật ra thì không. Lý do tại sao điều này hoạt động là vì :s//hành động trên dòng hiện tại và việc sử dụng nsẽ đưa bạn đến lần xuất hiện tiếp theo.
Tumbler41

1
Nếu bạn không chỉ định một mẫu cho :s/pattern/replacementnó sẽ sử dụng chuỗi tìm kiếm cuối cùng, vì vậy trong bước 3, bạn thực sự có thể áp dụng :s//betterFunction(\1, \3)/gđể lưu một số cách gõ.
Haegin

@ Tumbler41 ah, cảm ơn đã làm rõ. Có, tôi cũng thực hiện kỹ thuật tìm kiếm cơ bản này , sau đó áp dụng macro , tôi thường điền vào đối số trước và sử dụng :vimgrep /pattern/ ##sau đó áp dụng macro , theo cách đó, nếu hóa ra mô hình của tôi thực sự phù hợp và điều macro quá tẻ nhạt, sau đó tôi có thể nhanh chóng trở lại :argdo %s/.../..../gcvà bắt đầu bay qua hoạt động
the_velour_fog
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.