2011-12-10 34 views
5

này liên quan đến câu hỏi này: How to redirect ex command output into current buffer or file?Làm cách nào để nắm bắt đầu ra của lệnh vim trong sổ đăng ký, không có dòng mới?

Tuy nhiên, vấn đề với việc sử dụng :redir là nó gây ra 3 hoặc 4 dòng mới thêm ở phía trước của đầu ra, và họ dường như rất khó để loại bỏ bằng cách sử dụng chức năng thay thế.

Ví dụ, nếu tôi làm như sau:

:redir @a 
:pwd 
:redir END 

Nội dung @a bao gồm ba dòng trống và sau đó sản lượng dự kiến ​​thông thường.

Tôi cố gắng để gửi quá trình với một cái gì đó như thế này:

:let @b = substitute(@a, '\s*\(.\{-}\)\s*', '\1', '') 

Nhưng kết quả là @b có nội dung tương tự như @a.

Có ai biết cách hiệu quả hơn (tức là hoạt động) để xử lý sau hoặc thay thế cho :redir không có các dòng bổ sung đó không?

+3

Bạn đã thử với ': let @b = replace (@a, '\ n', '', 'g')'? – Raimondi

+0

Tôi vừa thử. Điều đó làm việc rất tốt! Bây giờ tôi cảm thấy ngu ngốc. = P – merlin2011

Trả lời

4

Giá trị trong thanh ghi b không thay đổi so với giá trị trong số đăng ký vì regexp của bạn không khớp.

  1. Bạn cần phải viết các dấu ngoặc đơn nhóm và dấu ngoặc mở đầu lặp lại với dấu gạch chéo ngược.
    Xem :help /magic; hiệu quả, tùy chọn magic luôn bật cho substitute() regexps.
  2. \s only matches SP and TAB (không phải LF); nhưng \_s does include LF (luân phiên, bạn có thể sử dụng \n để khớp với LF).
  3. Bạn cần neo phần cuối của biểu thức sao cho \{-} không "từ bỏ" mà không khớp với bất kỳ thứ gì (mọi thứ trừ các dòng mới ban đầu chưa từng có và do đó không được thay thế từ chuỗi đầu vào).

Đây là một phiên bản sửa đổi của sự thay thế của bạn:

:let @b = substitute(@a,'\_s*\(.\{-}\)\_s*$','\1','') 

Nó có thể đơn giản chỉ nghĩ về việc xóa hàng đầu và dấu khoảng trắng thay vì phù hợp với tất cả mọi thứ ở giữa. Điều này có thể được thực hiện trong một thay thế đơn bằng cách sử dụng công cụ sửa đổi thay thế g (thay thế lặp lại) với một regexp sử dụng alternation operator trong đó một thay thế được neo vào đầu chuỗi (%^) và khác được neo vào cuối chuỗi (%$).

substitute(@a,'\v%^\_s+|\_s+%$','','g') 

regexp này sử dụng \v để tránh phải thêm dấu xồ nguợc cho %^, +, |, và %$.

Thay đổi cả hai lần xuất hiện \_s thành \n nếu bạn chỉ muốn cắt đường dẫn đầu/cuối (thay vì SP, TAB hoặc NL).

+0

Theo tài liệu, 'replace()' luôn hoạt động như thể 'ma thuật' được thiết lập. – ZyX

+0

@ZyX: Điểm tốt; được cập nhật cho phù hợp. –

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