Tiếp tục một lệnh chế độ ex sau khi chuẩn Norm?


8

Tôi thường sử dụng các macro cực dài khi xử lý chỉnh sửa và tái cấu trúc lặp đi lặp lại. Bất cứ khi nào có thể tôi đều viết chúng dưới dạng các lệnh của chế độ cũ thay vì ghi chúng dưới dạng macro, bởi vì chúng dễ dàng chỉnh sửa tương tác theo cách đó (với cửa sổ lệnh).

Tuy nhiên, đôi khi tôi cần thêm vào một vài lệnh chế độ thông thường, ví dụ: chỉ lấy một phần của dòng chứ không phải toàn bộ dòng để sử dụng sau này trong macro của tôi hoặc sắp xếp một số văn bản theo cách tôi muốn.

Có cách nào để tiếp tục lệnh ex mode sau khi normđược đưa vào không?

(Đối với một ví dụ thực tế về loại phức tạp mà tôi đang nói đến :)

:'a+s/\_^\s*\(\S*\)::\_[^>]*>\s*\("[^"]*"\)\s*;\_s*\_$/    "\1", \2,/ | m 'a- | norm f,50a ^[d44|

Có cách nào để tôi có thể thêm nhiều văn bản vào cuối và để nó thực thi như một lệnh chế độ cũ không?


1
Bạn có muốn ngăn :normallệnh tiêu thụ phần còn lại của dòng không? Nếu vậy bạn có thể gói nó bên trong một chuỗi mà bạn có thể thực thi bằng :executelệnh : :exe 'norm f,50a ^[d44|' | other Ex command.
saginaw

:executesẽ chỉ truyền chuỗi dưới dạng đối số :normalvà vì vậy, phần sau sẽ không thấy những gì sau dòng lệnh, cho phép bạn thêm các lệnh Ex khác. Chỉ có một điều cần chú ý, nếu chuỗi chứa các ký tự điều khiển không theo nghĩa đen như \eđối với <Esc>bạn phải sử dụng dấu ngoặc kép để cho phép Vim diễn giải chúng, nếu không, các trích dẫn đơn sẽ ngăn việc giải thích bất cứ điều gì bên trong chuỗi.
saginaw

Câu trả lời:


10

Nếu bạn có một chuỗi các lần nhấn phím mà bạn muốn thực thi ở chế độ bình thường từ dòng lệnh, bạn có thể sử dụng :normallệnh.

Tuy nhiên, theo mặc định, :normallệnh không thể được theo sau bởi một lệnh khác vì như trợ giúp nói:

    This command cannot be followed by another command,
    since any '|' is considered part of the command.

Vì vậy, nếu bạn muốn thêm một lệnh Ex khác sau :normal, bạn có thể gói toàn bộ :normallệnh bên trong một chuỗi, sau đó thực hiện :executelệnh thực thi lệnh sau. Nó có thể cung cấp một cái gì đó như:

:exe 'norm {your keystrokes}' | Other Ex command

Trái với :normal, :executesẽ không coi đường ống là một phần trong lập luận của nó. Nó sẽ coi nó như là một sự chấm dứt lệnh và sẽ chỉ thực hiện những gì bên trong chuỗi.
:normalsẽ không thấy những gì sau dòng lệnh, nó sẽ chỉ nhìn thấy những gì còn lại trong chuỗi.
Do đó, bạn có thể thêm một lệnh Ex khác sau đó mà không cần :normalgõ nó trong chế độ bình thường.

Có chỉ là một điều nhỏ bé để chú ý đến:
nếu bạn bao quanh chuỗi với dấu nháy đơn, Vim sẽ không giải thích bất cứ điều gì bên trong nó, có thể là một vấn đề nếu bạn muốn :normalđánh ký tự điều khiển như <Esc>, <CR>, <Tab>hoặc <C-V>bằng cách viết ký tự đặc biệt, tương ứng: \e, \r, \t\<C-V>.
Những nhân vật đặc biệt được mô tả trong :help expr-quote.
Trong trường hợp này, bạn có thể sử dụng dấu ngoặc kép thay vì dấu ngoặc đơn để bao quanh chuỗi, để Vim có thể diễn giải chúng chính xác.
Nếu các ký tự điều khiển của bạn là bằng chữ (nghĩa là nếu bạn thấy ký hiệu dấu mũ của chúng: ^[cho Escape, ^Mcho Enter, ^Icho Tab, ^Vcho<C-V>), bạn không cần dấu ngoặc kép.

Khi bạn ghi một macro, cái sau sẽ lưu các ký tự điều khiển của bạn dưới dạng chữ, nó không sử dụng loại ký tự đặc biệt được mô tả trong đó :h expr-quote, vì vậy bạn không cần dấu ngoặc kép. Và nếu bạn muốn chỉnh sửa một macro bằng cách tự thêm một ký tự điều khiển bằng chữ, bạn có thể thêm tiền tố vào đó <C-V>(xem :h i_ctrl-vđể biết thêm thông tin). Ví dụ: để thêm một lối thoát theo nghĩa đen bên trong thanh ghi nơi macro của bạn được lưu trữ hoặc bên trong chuỗi các lần nhấn phím được truyền dưới dạng đối số :normal, bạn có thể nhấn <C-V><Esc>.

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.