Làm thế nào để đảo ngược lựa chọn trong vim?


12

Sau khi chọn một phạm vi dòng bằng Vlệnh, tôi muốn xóa mọi dòng của tệp KHÔNG được chọn, vậy có phải là cách đảo ngược lựa chọn - chọn mọi dòng không được chọn?

Như thế nào

:g!/FOO/d

xóa mọi dòng KHÔNG chứa FOO .

Nếu tôi có một phạm vi trong tâm trí và muốn sử dụng nghịch đảo của nó:

'a,'b

Tôi sẽ cần sử dụng hai phạm vi:

1,'a-1

'b+1,$

Tôi nghi ngờ rằng điều này không thể được thực hiện trong một bước - nhưng nó sẽ tốt đẹp!


Vì vậy, bạn muốn một hoạt động kiểu "cắt"?
quack quixote

Câu trả lời:


7

Đầu tiên tạo ánh xạ sau (ví dụ: ràng buộc với <F4>khóa)

map <F4> :<C-U>1,'<-1:delete<CR>:'>+1,$:delete<CR>

sau đó, sau khi chọn một phạm vi trong chế độ trực quan, chỉ cần nhấn <F4>để kích hoạt lệnh liên quan. Lệnh có thể được giải thích dễ dàng trong các phần:

  • " :" Nhập chế độ dòng lệnh.
  • " <C-U>" Xóa tất cả các ký tự giữa vị trí con trỏ và đầu dòng.
  • " 1,'<-1" Chỉ định phạm vi từ dòng đầu tiên của tệp đến dòng trước khi bắt đầu lựa chọn hiện tại.
  • " :delete<CR>" Xóa (phạm vi dòng được chỉ định trước đó).
  • " :'>+1,$:delete<CR>" Xóa các dòng trong phạm vi " '>+1,$", tức là từ dòng sau khi kết thúc lựa chọn đến cuối tệp.

2
chỉ để giải thích nó: 1, '<- 1 là phạm vi từ dòng 1 cho đến khi bắt đầu lựa chọn. '> + 1, $ là phạm vi từ 1 dòng sau khi lựa chọn cho đến hết ...
akira

Có cách nào để làm điều đó chỉ với một lệnh "xóa" không?
Kevin Panko

1
@Kevin Panko: bạn cần kết hợp các phạm vi thành một biểu thức. Tôi đã xem các tài liệu và tôi không nghĩ cú pháp phạm vi hỗ trợ điều đó. vimdoc.sourceforge.net/htmldoc/cmdline.html#cmdline-ranges ,,, vim.wikia.com/wiki/Ranges
quack quixote

15
  1. chọn văn bản của bạn
  2. "*yggdG"*p nghĩa là ...

    "*y    " yank it to the selection register
    ggdG   " delete everything
    "*p    " and paste the selection again 
    

9
ygg "_dGP giống nhau nhưng ngắn hơn.
Kevin Panko

1
cuối cùng bạn nhận được cùng một văn bản, đúng :)
akira

Tôi chỉ muốn tham khảo câu trả lời của akira và Kevin Panko (tôi không thể thêm ý kiến). "[o] pposeite [d] elete in (v) isual mode vmap od ygg" _dGP
Marcin Rogacki

Các plugin như github.com/maxbrunsfeld/vim-yankstack làm cho phương pháp này dễ dàng hơn. Bạn không phải lo lắng nhiều về việc đăng ký yank của bạn bị chặn bởi việc xóa.
Jack O'Connor

Làm thế nào điều này có thể được thêm vào như ánh xạ bàn phím trong .vimrc? Tôi đã thử một vài lần nhưng vẫn chưa nhận được. Những nỗ lực của tôi là map <F4> n"*yggdG"*p nmap <F4> "*yggdG"*p
Brad park

7

Chỉ dành cho hậu thế:

:v/\%V/d

Đó là một toàn cầu nghịch đảo trên các dòng không phải là một phần của lựa chọn. Lưu ý rằng: v là cấu trúc dựa trên dòng, do đó, bất kỳ dòng nào có chứa bất kỳ lựa chọn nào, có thể là dòng, luồng hoặc lựa chọn khối sẽ được xóa bỏ.


1

vì 'đảo ngược' có nghĩa là về cơ bản để tạo ra 'nhiều phần' (khu vực trước và sau lựa chọn ban đầu) tôi đã tìm kiếm lại các vimscripts http://www.vim.org/scripts/script.php?script_id=953 . thử đi.

 There are a number of operations to very
 easily manipulate selections such as modifying 
 the regions (add/delete/inverte/clear), hiding, 
 refreshing, saving and restoring etc."
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.