Làm cách nào để dừng ghi âm trong dòng lệnh?


18

Khi tôi đang ghi macro qvà tôi đã hoàn tất, tôi có thể nhập:

  • q dừng ghi nếu tôi ở chế độ bình thường hoặc trực quan.
  • <c-o>q để dừng ghi nếu tôi đang ở chế độ chèn.
  • ..

    Làm cách nào để dừng ghi nếu macro của tôi kết thúc ở chế độ lệnh?


Trường hợp sử dụng của bạn cho việc này là gì? Tôi thực sự chỉ tò mò :)
PhilippFrank

2
@PhilippFrank Tôi sẽ thường xuyên tìm kiếm và thay thế cùng một mẫu bằng các mẫu khác nhau trong các khối văn bản khác nhau. Với macro như vậy, việc chọn khối, viết mẫu tìm kiếm thực tế và đặt con trỏ vào vị trí tốt để nhập chuỗi thay thế có thể được thực hiện tự động. Khi tôi chơi nó, nó sẽ chọn khối, nhập chế độ lệnh, nhập :'<,'>s/toBeReplaced//grồi đặt con trỏ vào giữa hai //cái để tất cả những gì tôi phải làm là gõ newString<cr>và tôi đã hoàn thành. :)
iago-lito

Vì vậy, nó giống như một macro với một tham số. Ý tưởng rất hay, cảm ơn bạn!
PhilippFrank

@PhilippFrank loại, vâng. Tôi vui vì bạn thích nó. :)
iago-lito

Câu trả lời:


11

Một giải pháp khác là khi ở chế độ dòng lệnh, sử dụng Ctrl-fvà nhấn qđể dừng ghi.

Ctrl-fcho phép bạn mở cửa sổ dòng lệnh, trong đó bạn có thể chỉnh sửa lệnh ở chế độ bình thường. Để xác thực lệnh, chỉ cần sử dụng enter.


Do đó, sau khi đã thêm một cái gì đó như:

cnoremap <c-q> <c-f>i<c-o>q

trong của bạn .vimrc, bạn có thể sử dụng <c-q>để dừng ghi macro trong khi ở chế độ lệnh.


Hoa


Bạn vẫn phải xóa ký tự <Cf> ( ^F) khỏi cuối macro, phải không? Ít nhất đó là những gì tôi thấy.
VanLaser

Sắp đến rồi! Thực sự hữu ích (tôi không biết về cửa sổ dòng lệnh nhưng nó rất tuyệt), nhưng .. aargh! Có vẻ như việc nhập các cửa sổ này từ chế độ chèn sẽ làm mất khu vực bạn đã chọn. Có cách nào để làm cho lệnh bạn khởi chạy từ cửa sổ dòng lệnh hoạt động trên một khu vực được chọn không?
iago-lito

@VanLaser Không, vì bạn có thể tiếp tục nhập lệnh của mình trong cửa sổ dòng lệnh. Macro của bạn sẽ như thế qqSTARTMACRO:STARTCOMMANDLINEPART<c-f>i<c-o>qvà vì vậy bản ghi đã thực sự dừng trong khi bạn đang gõ phần lệnh. Để sử dụng macro: @qFINISHYOURCOMMAND<cr>và bạn đã hoàn tất: không cần chỉnh sửa nó. Thật không may, điều này dường như không hoạt động từ chế độ trực quan (hoặc nó mất lựa chọn) .. hoặc tôi đã bỏ lỡ điều gì?
iago-lito

Ah, đúng :) BTW, tôi có thể chọn một loạt hình ảnh, sau đó làm @qvà phạm vi đã được bổ sung khi khởi động lệnh '<,'>- miễn là vĩ mô bắt đầu với :....
VanLaser

@ lago-lito Trên thực tế, có vẻ như ngay cả khi bạn không thấy lựa chọn của mình, phạm vi được chỉ định (nghĩa là '<,'>) vẫn khớp với lựa chọn khi xác thực lệnh.
fflorent

17

Một cách để làm điều đó:

  • bắt đầu macro của bạn như bình thường (ví dụ qq... các ký tự khác)
  • Khi bạn đạt đến chế độ cmdline, hãy viết tất cả các ký tự bạn muốn
  • bạn muốn kết thúc macro ở đây. Nhấn ESCđể thoát khỏi chế độ cmdline, qđể kết thúc macro của bạn.
  • xóa ESCkhỏi qsổ đăng ký của bạn (*): bạn có thể dán nó vào bộ đệm, xóa ^[ký tự, chọn lại toàn bộ nội dung (ký tự thông minh) và kéo nó trở lại để đăng ký q.
  • đó là: chạy macro của bạn : @q.

Về cơ bản, bạn "hậu xử lý" macro của mình một chút, vì nó được lưu trữ trong một thanh ghi :)

(*) Một cách nhanh chóng để loại bỏ ký tự cuối cùng khỏi macro được lưu trong thanh ghi qsẽ là:

:let @q = @q[:-2]

Haha! Đây thực sự là hack của tôi cho đến nay = D. Không có một cách "kinh điển" để làm như vậy? (cũng nhanh hơn )
iago-lito

Tôi không biết về một cái, nhưng tôi không sử dụng macro quá nhiều (thay vào đó tôi thích viết các hàm nhỏ hơn). Macros cảm thấy khó hiểu đối với tôi, khi tôi nhìn chúng sau đó.
VanLaser

@VanLaser: bạn có thể cho biết thêm một chút chi tiết về dòng này :let @q = @q[:-2]không? Đặc biệt là làm việc như thế nào [:-2]? :-)
statox

Đó là "cắt" và hoạt động trên danh sách và chuỗi (đó là cách tôi truy cập / thiết lập @qở trên). Một số ví dụ ở đây
VanLaser

@VanLaser họ thực sự trông khó hiểu. Tuy nhiên, có những điều hữu ích để lặp lại, những điều nhỏ nhặt tinh vi bạn cần làm trong những trường hợp rất cụ thể .. bạn biết loại vấn đề này chỉ xuất hiện một lần và chỉ tồn tại trong một vài phút. Có thể đối phó với chúng bằng cách tạo các macro một cách nhanh chóng và không phải viết và gỡ lỗi một chức năng chuyên dụng chỉ là .. thật tuyệt vời! ^ ^
iago-lito

3

Sau khi đọc bình luận của bạn về trường hợp sử dụng, có vẻ như bạn có thể sử dụng ánh xạ khóa thay vì macro.

Tôi có dòng này trong .vimrc của tôi (không nhớ nơi tôi tìm thấy nó):

nnoremap <Leader>s :%s/\<<C-r><C-w>\>//g<Left><Left>

Nó có tác dụng tương tự như trường hợp sử dụng mà bạn mô tả, đưa bạn vào dòng lệnh để việc duy nhất bạn phải làm là nhập thay thế và nhấn enter, nhưng trong trường hợp này, thay thế tất cả các lần xuất hiện của từ nằm dưới con trỏ của bạn .

Để chỉ thay thế trong khối hiện tại, tôi nghĩ một cái gì đó như sau sẽ hoạt động:

nnoremap <Leader>s m'va{<ESC>``:'<,'>s/\<<C-r><C-w>\>//g<Left><Left>

Tất nhiên, bạn có thể ánh xạ nó tới bất kỳ khóa nào bạn muốn.

Những gì ở trên làm: đánh dấu vị trí hiện tại bằng cách sử dụng điểm đánh dấu chưa đặt tên, chọn trực quan khối hiện tại, để chế độ trực quan và đưa con trỏ về vị trí đã lưu (các dấu chọn hình ảnh vẫn được đặt), nhập chế độ lệnh và nhập lệnh thay thế , chèn từ nằm dưới con trỏ <C-r><C-w>và định vị con trỏ của bạn để gõ từ thay thế.


Vâng, tôi cũng có cái này. Tuy nhiên, trong trường hợp sử dụng cụ thể của tôi, toBeReplacedmẫu không đơn giản như "từ dưới con trỏ", đó là lý do tại sao tôi cần một macro nhỏ, cụ thể mà tôi có thể tạo khi đang di chuyển. Và sau đó một lần nữa: quá nhiều cụ thể cho một bản đồ: \ Dù sao cũng cảm ơn bạn :)
iago-lito

2
Có lẽ, đặt mẫu trong một thanh ghi, sau đó điều chỉnh ánh xạ ở trên để tự động lấy nội dung thanh ghi làm toBeReplacedmột phần (thay vì từ hiện tại dưới con trỏ, điều này hạn chế hơn).
VanLaser

1
@VanLaser Đúng, điều đó sẽ cho phép lập bản đồ chung và cũng sẽ đơn giản hơn nhiều: va{:s/<C-r>0//g<Left><Left>Với điều này, bạn có thể lấy bất kỳ mẫu nào bạn cần trước đó, sau đó chỉ cần nhấn phím được ánh xạ để thay thế mẫu đó bằng một thứ gì đó trong hiện tại khối.
dhakimian
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.