Làm cách nào để xóa nội dung ngược cho đến khi có tên = ở dòng trước?


9

Tôi sử dụng một ví dụ về mã javascript:

1        var a = 1;
2        var b = |{};

Con trỏ ở vị trí |(trên ký tự "{" khi hình dạng con trỏ bị chặn), tôi phát hiện ra rằng tôi muốn ađược chỉ định một đối tượng, vì vậy tôi muốn sửa đổi nó như dưới đây:

1        var a = {};

Vì vậy, tôi muốn biết khi con trỏ ở trên "{", làm thế nào để xóa nhanh tất cả nội dung trước "{" cho đến khi trống sau dấu "=" ở dòng 1?

Trong các trình soạn thảo bình thường khác, tôi sẽ chỉ nhấn phím xóa lùi để xóa mã. Nhưng tôi không làm thế nào để đạt được điều này trong vim.


bạn cũng có thể nhấn ivà sử dụng phím xóa lùi. Không có cơ thể sẽ bắn bạn vì điều đó. Tôi nghĩ.
elyashiv 13/03/2015

1
nhưng backspace sẽ không xóa ký tự của dòng trên
Aaron Shen

3
@AaronShen Điều đó phụ thuộc vào cài đặt 'backspace' của bạn. Nếu nó bao gồm eolthì backspace sẽ xóa ngắt dòng. Bạn cũng sẽ cần startđược bao gồm trong cài đặt. (Xem :help backspace). Đừng sử dụng phương pháp này! Có một số phương pháp nhanh hơn nhiều chi tiết trong các câu trả lời dưới đây.
Giàu

Câu trả lời:


20

Không chắc chắn nếu tôi hoàn toàn hiểu câu hỏi, nhưng nếu bạn muốn xóa cho đến khi bạn chỉ có var a = {};, bạn có thể, từ vị trí con trỏ, sử dụngd?1Enter

dthực hiện một chuyển động và bạn có thể cung cấp cho nó một mẫu tìm kiếm với /tìm kiếm chuyển tiếp hoặc ?tìm kiếm ngược.

Đây là một gif nhỏ chứng minh điều này:

nhập mô tả hình ảnh ở đây


1
Có lẽ đáng nói là bạn cần phải đánh Entersau khi gõ d?1.
Giàu

@Rich thực sự cảm ơn, tôi đã cập nhật câu trả lời để bao gồm điều đó.
akshay 13/03/2015

1
Phông chữ đó được sử dụng?
Chris Burt-Brown

@ ChrisBurt-Brown:
Terminator

10

Nếu bạn đang sử dụng vim (và không phải vi cổ điển), thì trong ví dụ của bạn, bạn có thể làm vkd(hoặc vkx).

  • v sẽ đưa nó vào chế độ 'trực quan' (chọn)
  • k sẽ đi lên một dòng để đặt con trỏ vào '1', chọn phần bạn muốn xóa
  • dhoặc xsẽ xóa lựa chọn

5

Xóa lên

Đối với ví dụ cụ thể này, dgklà một trong những cách nhanh nhất để làm như vậy.

Các dlệnh, như Akshay giải thích , có thể được theo sau là một chuyển động, xóa tất cả các nhân vật giữa nơi con trỏ bắt đầu, và nơi mà các chuyển động mất nó vào.

Trong mã của bạn, bạn muốn xóa mọi thứ giữa vị trí con trỏ và cùng một cột một hàng lên trên, do đó di chuyển con trỏ lên trên với gkchuyển động (mà khi được sử dụng với toán tử là không theo đường thẳng) sẽ đạt được mục tiêu của bạn.

EDIT: BobH chỉ ra trong các ý kiến rằng phương pháp này chỉ hoạt động khi 'wrap'được đặt. Như vậy, trừ khi bạn luôn có bộ bọc, có lẽ bạn nên sử dụng dvkhoặc vkd, như được đề xuất bởi các câu trả lời khác trên trang này.

Xóa từ ngược

Bạn cũng có thể sử dụng: d5bhoặc d4B, sẽ xóa tương ứng 5 từ hoặc 4 WORD. ( 1;là một WORD, nhưng hai từ thông thường).


tại sao dk sẽ xóa hoàn toàn cả dòng hiện tại và dòng trên
Aaron Shen

@AaronShen Không. Thử nó.
Giàu

1
@Rich nếu điều đó phù hợp với bạn thì bạn có một cài đặt cho phép xóa chuyển động đó. Tôi vừa mới thử nó vim -u NONE -U NONEvà nó xóa cả hai dòng.
Vitor

@Vitor Bạn nói đúng. Cố gắng tìm ra cài đặt nào thực hiện nó ngay bây giờ.
Giàu

1
BTW hóa ra sử dụng gknhư đặc trưng rõ ràng đòi hỏi :set wrap(hơi khó hiểu). Tôi không thể hiểu tại sao điều này dường như làm việc cho những người khác nhưng không phải cho tôi, khi sự giúp đỡ gktương tự dường như ngụ ý nó sẽ hoạt động. Manh mối duy nhất là ý nghĩa chính của gkviệc phải làm với các đường bao bọc. Khi tôi đã thử cài đặt quấn (loại trên một ý thích), thì đấy, nó đã hoạt động.
BobH

1

Tôi chưa thể bình luận, vì vậy tôi cần đưa ra một câu trả lời mới. Các khóa d kdo Rich cung cấp không hoạt động với tôi ngay cả khi sử dụng tùy chọn không tương thích. Một lý do có thể là chuyển động kđược xem là theo chiều dọc của vim, trong trường hợp đó cả hai dòng đều bị xóa. Từ :help d:

Một ngoại lệ cho lệnh d {motion}: Nếu chuyển động không theo đường thẳng, điểm bắt đầu và kết thúc của chuyển động không nằm trên cùng một dòng và chỉ có khoảng trống trước khi bắt đầu và sau khi kết thúc chuyển động, việc xóa sẽ trở thành đường thẳng. Điều này có nghĩa là việc xóa cũng xóa dòng trống mà bạn có thể mong đợi vẫn còn. Sử dụng | o_v | toán tử để buộc chuyển động được đặc trưng

Nó cũng cho thấy biện pháp khắc phục: Sử dụng dvkđể buộc chuyển động trở nên khôn ngoan. Đây là mẹo cho tôi.

Tôi không biết o_v trước đây, vì vậy đây :help o_v:

v

Khi được sử dụng sau một toán tử, trước lệnh chuyển động: Buộc toán tử hoạt động theo cách đặc trưng, ​​cũng như khi chuyển động thẳng hàng. Nếu chuyển động theo chiều dọc, nó sẽ trở thành | độc quyền |. Nếu chuyển động đã được đặc trưng, ​​chuyển đổi bao gồm / độc quyền. Điều này có thể được sử dụng để thực hiện một chuyển động bao gồm độc quyền và một chuyển động bao gồm độc quyền


Thứ 'không tương thích' là một cá trích đỏ hoàn toàn. Tôi đã nhắn tin khi tôi đang kiểm tra vì tôi là một thằng ngốc.
Giàu

Chúng tôi cũng có thể sử dụng dgk, trong đó gk cũng là độc quyền và không theo dòng.
MS.Kim
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.