Xóa dòng mới trong Vim


271

Có cách nào để xóa dòng mới ở cuối dòng trong Vim, để dòng tiếp theo được nối với dòng hiện tại không?

Ví dụ:

Evaluator<T>():
    _bestPos(){
}

Tôi muốn đặt tất cả những thứ này lên một dòng mà không sao chép các dòng và dán chúng vào dòng trước. Có vẻ như tôi sẽ có thể đặt con trỏ của mình đến cuối mỗi dòng, nhấn một phím và để dòng tiếp theo nhảy lên cùng một con trỏ đang bật.

Kết quả cuối cùng:

Evaluator<T>(): _bestPos(){ }

Điều này có thể có trong Vim?


Del ở cuối dòng trong chế độ chèn của vim được sử dụng để làm việc cho tôi. Không phải trong tất cả các thiết bị đầu cuối, mặc dù.
Victor Sergienko

Câu trả lời:


584

Nếu bạn đang ở dòng đầu tiên, nhấn (chữ hoa) Jsẽ nối dòng đó và dòng tiếp theo với nhau, loại bỏ dòng mới. Bạn cũng có thể kết hợp điều này với một số đếm, vì vậy nhấn 3Jsẽ kết hợp cả 3 dòng với nhau.


29
Như đã lưu ý trong câu trả lời khác, gJsẽ tránh thêm khoảng trắng mà Vim có thể chọn thêm khi sử dụng J.
Michael Mior

5
Bạn cũng có thể chọn tất cả các dòng bạn muốn tham gia bằng cách sử dụng V(Chế độ dòng trực quan) sau đó nhấn JhoặcgJ
Sbu

Nếu bạn muốn giữ vị trí con trỏ sử dụng :join:join!điều đó sẽ nối các dòng giữ vị trí con trỏ và không giữ bất kỳ khoảng trống nào tại điểm nối. bạn cũng có thể ánh xạ nó như: nnoremap <Leader>j :joing<cr>nnoremap <Leader>gj :join!<cr>.
SergioAraujo

82

Chắc chắn rồi. Vim nhận ra ký tự \ n là một dòng mới, vì vậy bạn chỉ cần tìm kiếm và thay thế. Trong chế độ lệnh loại:

:%s/\n/

1
Cảm ơn, nhưng tôi không muốn tìm kiếm và thay thế toàn cầu.
derekerdmann

16
loại bỏ% sẽ chăm sóc điều đó. Sau đó, nó sẽ chỉ xảy ra trên dòng con trỏ đang bật. Ngoài ra, bạn có thể chỉ định một phạm vi, chẳng hạn như: 11,15s / \ n / (dòng 11-15) hoặc :, + 7s / \ n / (dòng này và bảy dòng tiếp theo) hoặc: -3, s / \ n / (ba dòng trước và dòng này) ... bạn hiểu ý tưởng
Tristan

1
Hoặc bạn có thể chọn một Vkhối thông thường và thay thế nó.
Victor Sergienko

51

Trong khi ở dòng trên ở chế độ bình thường, nhấn Shift+ j.

Bạn cũng có thể thêm một số đếm, vì vậy 3Jtrên dòng trên cùng sẽ nối tất cả các dòng đó lại với nhau.


34

Như các câu trả lời khác đã đề cập, (chữ hoa) Jvà tìm kiếm + thay thế \ncó thể được sử dụng chung để loại bỏ các ký tự dòng mới và nối các dòng.

Nhưng để thoát khỏi ký tự dòng mới ở dòng cuối cùng , bạn cần thực hiện điều này trong Vim:

:set noendofline binary
:w

1
Câu hỏi là về cách nối hai dòng ở giữa một tệp - câu trả lời này sẽ xóa dòng mới ở cuối tệp, đây không phải là điều tôi đã hỏi.
derekerdmann

3
Điều này làm việc cho tôi. Tôi đã cố gắng để thoát khỏi một dòng mới ở cuối một tập tin dòng duy nhất với vim.
Locane

Tại sao :set noendoflinekhông làm việc mà không có binary?
darw

32

Jxóa khoảng cách hàng đầu bổ sung (nếu có), nối các dòng với một khoảng trắng. (Với một số ngoại lệ: sau /[.!?]$/, hai khoảng trắng có thể được chèn vào; trước đó /^\s*)/, không có khoảng trắng nào được chèn.)

Nếu bạn không muốn hành vi đó, gJchỉ cần xóa dòng mới và không làm gì thông minh với không gian cả.


10

Tất cả những điều sau đây giả định rằng con trỏ của bạn nằm trên dòng đầu tiên:

Sử dụng ánh xạ bình thường:

3Shift+J

Sử dụng các lệnh Ex:

:,+2j

Đó là viết tắt của

:.,.+2 join

Mà cũng có thể được nhập bằng phím tắt sau:

3:j

Một lệnh Ex thậm chí còn ngắn hơn:

:j3

2
Không có khoảng cách giữa chúng:j!3
SergioAraujo 17/12/17

10
set backspace=indent,eol,start

trong .vimrc của bạn sẽ cho phép bạn sử dụng backspacedeletebật \n(dòng mới) trong chế độ chèn.

set whichwrap+=<,>,h,l,[,]

sẽ cho phép bạn xóa các LF trước đó trong chế độ bình thường với X(khi ở col 1).


2

Nó có thể phụ thuộc vào cài đặt của bạn, nhưng tôi thường làm điều này với A<delete>

Trường hợp Ađược nối ở cuối dòng. Nó có thể yêu cầu nocompatiblechế độ :)


3
"Tôi thường làm điều này với A <xóa>" Vâng đó là lý do tại sao tôi đến đây; để tìm một cách tốt hơn;). Toàn bộ quan điểm của vim là không di chuyển bàn tay của bạn từ hàng nhà.
Luc

2
<CURSOR>Evaluator<T>():
    _bestPos(){
}

con trỏ ở dòng đầu tiên

NGAY BÂY GIỜ, ở chế độ BÌNH THƯỜNG làm

shift+v
2j
shift+j

hoặc là

V2jJ

: V2jJ bình thường


1

Tôi sẽ chỉ nhấn A (nối vào cuối dòng, đưa bạn vào chế độ chèn) trên dòng nơi bạn muốn xóa dòng mới và sau đó nhấn xóa.


Đáng buồn thay, điều đó dường như không làm việc cho tôi; nó có thể là một cài đặt PuTTY mà tôi đã bỏ lỡ.
derekerdmann

2
có lẽ là tùy chọn backspace vi::help 'backspace'
glenn jackman

1

nếu bạn không phiền khi sử dụng các công cụ shell khác,

tr -d "\n" < file >t && mv -f t file

sed -i.bak -e :a -e 'N;s/\n//;ba' file

awk '{printf "%s",$0 }' file >t && mv -f t file

7
Đó là loại quá mức, bạn không nghĩ sao?
derekerdmann

không, nó không phải Tại sao bạn nghĩ rằng nó quá mức cần thiết? Làm điều đó bên trong Vim là thủ công. Nó phụ thuộc vào việc bạn muốn làm thủ công bằng tay mỗi lần hay chỉ cần thực hiện các lớp lót này để hoàn thành công việc trong nháy mắt. Vim là một biên tập viên. Và bất kỳ công cụ nào có thể xử lý tệp, về cơ bản là "trình chỉnh sửa" được ngụy trang.
ghostdog74

5
Vẫn dễ dàng hơn để chỉ mở tập tin trong vim và sử dụng ggVGJ.
quá nhiều php

chắc chắn, nếu bạn thấy dễ dàng hơn để làm điều đó bằng tay mỗi khi bạn cần dữ liệu thay đổi theo cách đó. Đi về phía trước. Ngoài ra, hãy thử làm điều đó trên một tập tin lớn.
ghostdog74

Tôi không xử lý một loạt các tập tin; Tôi chỉ đang làm việc với việc cô đọng một vài dòng mã.
derekerdmann

1

Vấn đề là bội số char 0A (\ n) vô hình có thể tích lũy. Giả sử bạn muốn dọn sạch từ dòng 100 đến cuối:

Nhập ESC và: (chỉ huy đầu cuối)

:110,$s/^\n//

Trong một kịch bản vim:

execute '110,$s/^\n//'

Giải thích: từ 110 cho đến khi kết thúc tìm kiếm các dòng bắt đầu bằng dòng mới (để trống) và xóa chúng

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.