Làm cách nào để áp dụng một bộ tổ hợp phím cho mỗi lần xuất hiện của một từ?


13

Nếu tôi muốn xóa từng từ, điều đó thật dễ dàng, bởi vì tôi sẽ làm một cái gì đó như thế này:

:s%/WORD//g

Nhưng nếu tôi muốn làm gì xyzcho mỗi lần xuất hiện của "WORD" thì sao? Ví dụ: giả sử tôi muốn xóa mọi dòng có chứa "WORD". Tôi có thể nghĩ ra một vài cách để làm điều này, nhưng không ai trong số chúng có vẻ lý tưởng.

1)

/WORD

và sau đó nhấn thủ công ddnddnddnddn...cho đến khi không còn xảy ra nữa. Nhưng điều này là tốn thời gian nếu có nhiều dòng để làm điều này trên.

2)

qd/WORD<enter>ddq

và sau đó đoán xem có bao nhiêu lần WORD xảy ra, và sau đó, ví dụ:

500@d 

Nhưng điều này sẽ làm A) bỏ lỡ một loạt các dòng hoặc B) xóa một loạt các dòng bổ sung.

Có cách nào tốt hơn để làm điều này?


3
Chỉ để bạn biết, 500@dnhư bạn mô tả là thực sự an toàn. Phát lại macro sẽ dừng lại khi không tìm thấy cụm từ tìm kiếm. Vì vậy, bạn sẽ chỉ thấy một lỗi "Không tìm thấy mẫu: WORD" sau khi tất cả các dòng chứa nó đã bị xóa.
tự đại diện

@Wildcard Thankyou, điều đó thực sự tốt để biết!
DJMcMayhem

Câu trả lời:


17

Bạn có thể sử dụng các lệnh :global:normalcho việc này. Các :globallệnh có cú pháp sau:

:global/{pattern}/{command}

Điều này sẽ chạy "lệnh" trên mỗi lần xuất hiện của "mẫu". Sau đó, bạn có thể sử dụng :normallệnh để chạy một loạt các lần nhấn phím trên mỗi lần xuất hiện của một từ bằng cách sử dụng :global. Thích như vậy:

:g/WORD/normal {keystrokes}

Nếu các tổ hợp phím đó liên quan đến các phím đặc biệt như <Ctrl>, bạn có thể kết hợp nó với :executelệnh như sau:

:g/WORD/exe "normal {keystrokes}"

Xin lưu ý rằng bạn phải đặt dấu gạch chéo ngược trước mỗi lần xuất hiện của một khóa đặc biệt.

Để biết thêm về các lệnh này, xem :help :normal:help :global.


Đánh tôi với nó; Tôi đoán tôi đã gõ quá chậm. :)
tự đại diện

3

Để hoàn thiện, bạn có thể sử dụng :substitute, nếu bạn khớp - trong ví dụ của bạn (xóa toàn bộ dòng có WORD) - toàn bộ dòng chứa WORD, ví dụ:

:%s/^.*\<WORD\>.*\n

Điều này có một "thay thế khớp không có gì" ngầm định, tức là nó là dạng ngắn hơn của:

:%s/^.*\<WORD\>.*\n//

Kết hợp với \zs, \ze, \(- \)(nhóm), và \=(trong phần thay thế) với submatch(), :substitutecó thể rất mạnh mẽ.


2

Có vẻ như bạn đang tìm kiếm :global.

:g/WORD/d_

Những gì gạch dưới làm gì?
tự đại diện

Điều này hoạt động, nhưng không có lệnh nào tôi biết làm việc. Tôi tiếp tục nhận được "không phải là một lệnh biên tập".
DJMcMayhem

1
@Wildcard: Dấu gạch dưới loại bỏ những gì đang bị cắt. Lệnh được thực thi là thực tế :deletevà không phải là hoạt động chế độ bình thường d.
Luc Hermitte

@DJMcMayhem: cho các hoạt động bình thường khác, bạn sẽ cần :normal. Và nếu bạn cần các khóa đặc biệt, bạn thậm chí có thể cần :exe-> `exe" aFooFar bình thường \ <esc> "
Luc Hermitte
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.