2013-01-04 52 views
9

Tôi nhận được một hành vi bất thường khi tôi cố xóa từ cuối dòng bằng cách sử dụng lựa chọn khối trong vim.xóa từ cuối dòng sử dụng khối chọn trong vim

Vì vậy, chúng ta hãy nói rằng tôi có một văn bản như vậy:

delete this char:x 
and this:x 
also this:x 
and then this:x 
lastly this:x 

Nếu tôi muốn thêm y để mỗi dòng tôi có thể:

  • đầu khối lựa chọn với Cv
  • chọn tất cả các dòng có 4j
  • chuyển đến cuối dòng với $
  • bắt đầu phụ thêm với A
  • loại văn bản mong muốn y

để có được:

delete this char:xy 
and this:xy 
also this:xy 
and then this:xy 
lastly this:xy 

nhưng nếu tôi cố gắng xóa x trong bước cuối cùng thay vì phụ tôi sẽ mong đợi nhận được:

delete this char: 
and this: 
also this: 
and then this: 
lastly this: 

mặc dù tôi kết thúc với:

delete this char: 
and this:x: 
also this:x: 
and then this:x: 
lastly this:x: 

Theo như tôi hiểu nó gắn thêm các char cuối cùng trong dòng đầu tiên cho tất cả các dòng khác (trong trường hợp này :) chứ không phải xóa những cái còn thiếu (trong trường hợp này x) .

Tôi có thể làm điều này với macro hoặc thay thế nhưng tôi không hoàn toàn hiểu lý do đằng sau hành vi đó. Có cách nào tôi có thể làm điều này với lựa chọn khối?

+0

Tôi không nhận được hành vi mà bạn mô tả. 'X' đầu tiên bị xóa nhưng không có gì được thêm vào. – romainl

+0

@romainl bạn có sử dụng cùng ví dụ từ câu hỏi không? nếu bạn đang sử dụng một cái gì đó như 'xóa char này: x' và xóa' x', nó thêm dấu cách có thể dễ dàng bỏ lỡ .. – none

+0

Không, tôi có thể thấy dấu cách tốt và không có gì. Trong ngữ cảnh này, ' {movement} $ A', việc xóa ký tự không được thực hiện trên mọi dòng trong vùng chọn. Chỉ thêm ký tự hoạt động. Đó là một chút thiển cận, nếu bạn muốn ý kiến ​​của tôi, nhưng đó là cách nó được thiết kế. Việc xóa 'x' ở cuối một loạt các dòng thường được thực hiện với': '<,'> norm $ x' hoặc ':' <,'> s/x $ //'. – romainl

Trả lời

5

$C-v4jx

  1. chuyển đến cuối dòng với $
  2. Toggle khối thị giác C-v
  3. đi xuống (trong trường hợp của bạn 4x) 4j
  4. xóa những thứ mà với x

Sửa: (phản ứng trên nhận xét của bạn cho indentation tùy ý)

Điều đó có thể được thực hiện với vĩ mô đơn giản.Macro là không quá khó như bạn có thể nghĩ rằng:

  1. bắt đầu ghi một macro, chúng tôi sẽ đặt tên cho nó 'a', vì vậy qa
  2. đi đến tận cùng của dòng $
  3. xóa một ký tự x
  4. đi xuống bởi một dòng với j
  5. kết thúc của chúng ta vĩ mô q

Bây giờ, hãy áp dụng macro của chúng tôi: [email protected] - sẽ thực hiện tương tự như khi bạn ghi macro, 20x.

+0

Điều này làm việc nhưng tôi cần một cái gì đó mà sẽ làm việc với indentation tùy ý. Tôi đã chỉnh sửa câu hỏi cho phù hợp .. – none

+0

Vấn đề với giải pháp macro là tôi phải đếm các dòng mà tôi cần sửa đổi. – Jaakko

4

Nếu tôi có một số lượng nhỏ các dòng Tôi thường làm Mộtbacksapceesc. Sau đó, liên tục thực hiện j. cho đến khi hoàn thành. Không phải là cách nhanh nhất nhưng dễ nhớ.

Đối với một số lượng lớn các dòng, tôi thường trực quan chọn các đường qua V rồi thực hiện lệnh thay thế hoặc lệnh bình thường trên phạm vi.

:'<,'>s/.$// 
:'<,'>norm $x 

Lưu ý: bạn không phải nhập '<,'>. Nó sẽ được chèn tự động khi bạn bắt đầu một lệnh khi một số văn bản được chọn trực quan.

Lệnh thay thế khá đơn giản, khớp với ký tự cuối cùng (.$) và sau đó thay thế bằng không có gì.

Lệnh bình thường chỉ là cách bạn sẽ xóa ký tự cuối cùng trong chế độ bình thường qua $x cho một dòng duy nhất ngoại trừ nó sẽ áp dụng nó vào mỗi dòng trong phạm vi.

Để biết thêm giúp đỡ see:

:h range 
:h :s 
:h :norm 
+1

+1 cho giải pháp 'j.' – none

+0

Nếu bạn đặt macro thành macro, bạn có thể lặp lại nó một số lần tùy ý, ví dụ: '10 @' thay vì 'j.j.j.j.j.j.j.j.j.j.' (4 tổ hợp phím thay vì hai mươi, cộng thêm 3 cần thiết để ghi macro (' q '...' q')). –

2

như bạn nói cho mình, để đạt được mục tiêu của bạn, có những cách khác, trên thực tế những cách tốt hơn để đi. :s hoặc q(macro) hoặc :g/.../norm $x. :s/.$//g khá đơn giản.

Ctrl-V không phù hợp cho công việc này. Đối với tên của nó: Visual BLOCK. Bạn muốn xóa x cuối cùng, và chúng (chỉ x) không nằm trong một khối.

Tuy nhiên, nếu bạn thực sự muốn gắn bó với ctrl-v, bạn phải thực hiện thêm một số công việc, để làm cho những 'x' đó thành một khối. Nếu bạn đã Align cài đặt plugin, bạn có thể:

Chọn (V) tất cả các dòng bạn muốn làm các trick,

<leader>t: 

sau đó văn bản của bạn trông giống như:

delete this char : x 
and this   : x 
also this  : x 
and then this : x 
lastly this  : x 

Ctrl-V để loại bỏ x, bạn nên biết làm thế nào để làm điều đó.

sau đó

:%s/ *:/:/g 

để loại bỏ không gian đệm trước khi ':'

Tuy nhiên tôi không nghĩ rằng đó là một cách tốt để đi.

+0

Đây là tất cả tốt và tất cả nhưng không ai trong số này là trực quan như các khối hình ảnh với tôi. Tôi muốn để câu hỏi mở trong một thời gian trước khi từ bỏ vì tôi vẫn cảm thấy không có lý do gì để ngăn chặn việc thực hiện một tính năng như vậy. – none

8

Bạn đã thử :{range}normal chưa? Điều này sẽ làm việc:

:'<,'>normal $x 

(Bit '<,'> được điền vào cho bạn khi bạn gõ :.)

+0

Tôi nghĩ rằng một giải thích những gì nó làm cho các giải pháp trên sẽ là tuyệt vời. Tôi đã cố gắng chỉnh sửa một trong nhưng nó đã bị từ chối. – Jaakko

+1

'{range}' là ngôn ngữ Vim khá phổ biến trong các tệp trợ giúp. 'normal' là một lệnh nhập vào những thứ sau đây như bạn đang gõ chúng ở chế độ bình thường. Vì vậy, hoàn toàn, lệnh này làm cho mỗi dòng: đi đến cuối dòng sau đó xóa các ký tự dưới con trỏ. –

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