Làm thế nào để xóa dòng trên / dưới con trỏ, nhưng không phải dòng hiện tại?


11

Có một lệnh để xóa dòng (hoặc n dòng) trên dòng hiện tại không? Trên = hiện tại không bao gồm.

Tức là, có một sự thay thế dkmà không xóa dòng hiện tại? Tương tự như cách o/ Op/ Pcông việc, nhưng với việc xóa.

Hiện tại, tôi đang làm kdd, di chuyển con trỏ lên một dòng và xóa nó. Tôi có thể làm nnoremap <Leader>d kddnnoremap <Leader>D jdd-, nhưng có một giải pháp thay thế không di chuyển con trỏ có vẻ như là một lựa chọn tốt hơn. Có như vậy không?


Nếu vấn đề của bạn là ánh xạ của bạn di chuyển con trỏ tại sao bạn không làm nnoremap <Leader>d kddjnnoremap <Leader>D jddk?
statox

Sử dụng một trong hai kddjhoặc jddk, vị trí cột không được bảo tồn. Tôi không nói đó là một vấn đề lớn, nhưng nó gây phiền nhiễu. Đối với bản ghi, kddjdi chuyển con trỏ 1 dòng bên dưới vị trí ban đầu. Và jdd-có vẻ như là một sự thay thế tốt hơn jddkbởi vì ít nhất tôi sẽ trở lại với nhân vật không gian trắng đầu tiên. Nếu dòng bên dưới dòng tôi muốn xóa là trống, tôi sẽ ở đầu dòng.
Martin Tóth

Làm thế nào về việc sử dụng makdd`a cho bản đồ của bạn? Đặt một dấu và trở lại nó sau đó ... bạn có thể muốn thay đổi nó thành một ký tự ít được sử dụng hơn.
PhilippFrank

@PhilippFrank Hoặc tôi có thể sử dụng `` để lấy lại con trỏ và không chiếm một thanh ghi (không phải là tôi sử dụng bất kỳ :)).
Martin Tóth

Không, nó không hoạt động, k không phải là một bước nhảy, vì vậy bạn không thể quay lại bằng cách sử dụng ``.
PhilippFrank

Câu trả lời:


30
:-d

cắt dòng trên dòng hiện tại.


:-5d

cắt dòng thứ 5 phía trên dòng hiện tại (nhưng di chuyển con trỏ).


:-5,-d

cắt 5 dòng trên dòng hiện tại.


:+,+5d

cắt 5 dòng dưới dòng hiện tại.


2
Điều đó vẫn di chuyển con trỏ, mặc dù.
PhilippFrank

1
Bạn không thể tránh di chuyển con trỏ. Điều tốt nhất bạn có thể làm là di chuyển con trỏ và di chuyển nó trở lại .
romainl

Cảm ơn bạn! Loại "vim way" này là thứ tôi đang tìm kiếm. Tôi sẽ sử dụng kết hợp với `` để đưa con trỏ trở lại vị trí cũ.
Martin Tóth

5

EDIT Tôi không biết các tính năng tích hợp được đề xuất bởi @Romainl trong câu trả lời của anh ấy: tất nhiên phương pháp -d+dnên được ưu tiên hơn vì nó đơn giản hơn việc thêm các chức năng vào.vimrc

Có lẽ thêm một cái gì đó như thế vào bạn .vimrccó thể là những gì bạn muốn:

function! DeleteOver()
   let save_cursor = getpos(".")
   normal k
   normal dd
   call setpos(".", save_cursor)
   normal k
endfunction

function! DeleteUnder()
   let save_cursor = getpos(".")
   normal j
   normal dd
   call setpos(".", save_cursor)
endfunction

Các hàm này xóa dòng dưới hoặc dòng trên dòng hiện tại và quay trở lại vị trí trước khi xóa.

Đối với chức năng, DeleteOver()chúng ta cần phải đi lên một dòng normal ksau khi xóa vì việc xóa sẽ thay đổi số lượng của dòng ban đầu không xảy ra vớiDeleteUnder()

Bạn cũng có thể thêm nó vào .vimrc

nnoremap <Leader>d :call DeleteOver()<CR>
nnoremap <Leader>D :call DeleteUnder()<CR>

Để tạo ánh xạ gọi các hàm.


Một cách khác để lưu / khôi phục vị trí con trỏ là bỏ đặt / khôi phục nostartoflinetùy chọn.
Giàu

5

Nếu chúng ta sử dụng thanh ghi xóa nhỏ "-, chúng ta có thể khôi phục vị trí con trỏ sau khi xóa n dòng trên.

Ví dụ: d0dgk"-Pxóa trên 1 dòng và khôi phục con trỏ trở lại vị trí cũ.

  1. d0xóa các ký tự từ con trỏ đến ký tự đầu tiên của dòng. Vì 0là một chuyển động độc quyền, ký tự dưới con trỏ không bị xóa. Và các ký tự bị xóa được đưa vào bộ đếm nhỏ xóa "-.

  2. dgkxóa trên 1 dòng. Điều này sẽ rời khỏi dòng hiện tại, bởi vì gkkhông phải là dòng và độc quyền.

  3. "-P đặt văn bản từ thanh ghi xóa nhỏ "-.

Nó là một loại hack. Nhưng nếu bạn đang tìm kiếm các lệnh không phải ex, hãy xem xét sử dụng nó.


Giải pháp tốt đẹp! Mặc dù tôi nghĩ bạn "-Pkhông muốn "-p. Cái sau làm rối văn bản một chút.
James

@DJMcMayhem Bạn nói đúng. Tôi đã sửa câu trả lời. Cảm ơn bạn đã chỉ ra nó.
MS.Kim

2

Có lẽ bạn sẽ cải thiện quy trình làm việc của mình nếu không sợ ... nhảy :)

Thí dụ:

This is where cursor initially is: _.

[Some other stuff you want to keep/skip ...]

I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.

Hành động của bạn (chế độ bình thường, con trỏ đang bật _) : /I want Enter 5dd Ctrl-o. Đó là nó.

Tất nhiên, câu trả lời romainl là tốt nhất nếu tất cả những gì bạn muốn xóa toàn bộ dòng và bạn có thể đếm phần bù của chúng một cách dễ dàng (ví dụ sử dụng vải lanh tương đối). Trên đây là một cách chung hơn để "hành động": đến đó, sử dụng một cái gì đó được coi là một bước nhảy: điều này có nghĩa là bạn luôn có thể nhảy trở lại, sau khi bạn sửa đổi văn bản.

Ví dụ: nếu bạn sử dụng số dòng tuyệt đối, bạn có thể thay thế /I want Enterbằng một số thứ như 78gghoặc 78Gnhảy trực tiếp vào số dòng đó.


0

Dựa trên giải pháp ms-kim, tôi đã phát triển một biến thể hơi khác nhau để tiết kiệm tư thế col.

function! DeleteLineAbove()
    if line('.') == 1
        echom "You are at the first line!"
        return
    endif
    let l:colsave = col(".")
    exec  "normal! kdd"
    call cursor(line("."), l:colsave)
endfunction
nnoremap <Leader>k :call DeleteLineAbove()<CR>

OBS: Tôi cũng đã sử dụng bài đăng này làm tài liệu tham khảo.


Ý bạn là @statox chứ không phải @ MS.Kim?
Giàu

-1

Nếu bạn muốn xóa các dòng trùng lặp trong toàn bộ tệp, chỉ cần làm như sau:

:g/any part of the string/d

Thí dụ:

Trong chế độ lệnh

:g/I want to delete/d

Nếu bạn chỉ muốn một danh sách các chuỗi (s) ban đầu:

:g/I want to delete/p

3
Tôi không thực sự chắc chắn làm thế nào điều này trả lời câu hỏi được hỏi?
Martin Tournoij
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.