Làm thế nào để tôi tham gia hai dòng trong vi?


169

Tôi có hai dòng trong một tệp văn bản như dưới đây:

S<Switch_ID>_F<File type>
_ID<ID number>_T<date+time>_O<Original File name>.DAT

Tôi muốn nối hai dòng trong vi như dưới đây:

S<Switch_ID>_F<File type>_ID<ID number>_T<date+time>_O<Original File name>.DAT

Dòng thứ hai đã bị xóa và nội dung của dòng thứ hai được thêm vào dòng đầu tiên.

Làm thế nào tôi có thể làm điều đó bằng cách sử dụng chế độ lệnh trong vi?

Câu trả lời:


310

Shift+ Jxóa ký tự thay đổi dòng khỏi dòng hiện tại, vì vậy bằng cách nhấn "J" tại bất kỳ vị trí nào trong dòng, bạn có thể kết hợp dòng hiện tại và dòng tiếp theo theo cách bạn muốn.


9
chữ hoa chữ J nối các dòng, chữ thường di chuyển con trỏ

4
Đó là chữ J viết hoa, không phải chữ J viết thường; do đó Shift-J.
Jonathan Leffler

28
"Loại bỏ ký tự thay đổi dòng khỏi dòng hiện tại" là một cách khá khó xử để mô tả những gì J làm, và cũng không thực sự chính xác. J "tham gia" dòng này để tiếp theo. Trong quá trình này, nó loại bỏ dòng mới, nhưng cũng thao túng khoảng trắng theo những cách khác.
Laurence Gonsalves

5
Haha. GJtrong vimsẽ di chuyển đến dòng cuối cùng và sau đó cố gắng nối nó đến dòng tiếp theo, nơi duy nhất một lệnh tham gia không có ý nghĩa. Vâng, tôi thấy điều này thật buồn cười :-)
Alok Singhal

2
Tôi vẫn không thể nhận ra rằng mình cần phải truy cập StackOverflow để tham gia hai dòng bằng trình chỉnh sửa này!
Manitra Andriamitondra

59

Vi hay Vim?

Dù sao, lệnh sau hoạt động cho Vim ở chế độ 'không tương thích'. Đó là, tôi cho rằng, gần như thuần vi.

:join!

Nếu bạn muốn làm điều đó từ sử dụng lệnh bình thường

gJ

Với 'gJ', bạn tham gia các dòng như hiện tại - mà không cần thêm hoặc xóa các khoảng trắng:

S<Switch_ID>_F<File type>
_ID<ID number>_T<date+time>_O<Original File name>.DAT

Kết quả:

S<Switch_ID>_F<File type>_ID<ID number>_T<date+time>_O<Original File name>.DAT

Với lệnh 'J', bạn sẽ có:

S<Switch_ID>_F<File type> _ID<ID number>_T<date+time>_O<Original File name>.DAT

Lưu ý không gian giữa type>_ID.


2
Chỉ muốn chỉ ra rằng g/pattern/joinhoạt động trong VIM trong khi g/pattern/Jkhông. Có thể giúp một số người trong tương lai.
jisaacstone

Tôi thích sự tham gia của bạn với mô hình, tuy nhiên, nó tham gia hai dòng với khoảng trắng. Dù sao để tham gia hai dòng với một mô hình không có khoảng trắng?
David.Chu.ca

g / mẫu / tham gia! dường như làm điều đó
fortboise

1
Nó có thể phức tạp hơn, xin vui lòng! :-)
Julian Overmann

22

Điều này nên làm điều đó:

J


6
'J' cho thêm không gian trong khi nối các dòng.
Maxim Kim

3
@MaximKim: Và đây là lý do . Lưu ý rằng :h Jsẽ cho bạn biết làm thế nào để vô hiệu hóa tính năng đó.
vào

2
Sử dụng gJnếu bạn không muốn vim thêm khoảng
trắng

17

Trong vi, J(đó là Shift+ J) hoặc :joinnên làm những gì bạn muốn, trong hầu hết các phần. Lưu ý rằng họ điều chỉnh khoảng trắng.Cụ thể, bạn sẽ kết thúc với một khoảng trắng giữa hai dòng được nối trong nhiều trường hợp và nếu dòng thứ hai được thụt vào thì vết lõm sẽ bị xóa trước khi tham gia.

Trong Vim bạn cũng có thể sử dụng gJ( G, sau đó Shift+ J) hoặc :join!. Chúng sẽ nối các dòng mà không thực hiện bất kỳ điều chỉnh khoảng trắng nào.

Trong Vim, xem :help Jđể biết thêm thông tin.


Một báo trước khi sử dụng gJJlà cả hai chang con trỏ đến điểm tham gia, nhưng :join!:joindont.
SergioAraujo

4

Chỉ cần thay " \n" bằng "".

Trong vi / Vim cho mỗi dòng trong tài liệu:

%s/>\n_/>_/g

Nếu bạn muốn xác nhận mọi sự thay thế:

%s/>\n_/>_/gc


1

Nhấn Shift+ 4("$") trên dòng đầu tiên, sau đó Shift+ j("J").

Và nếu bạn muốn giúp đỡ, đi vào vi, và sau đó nhấn F1.


3
$ di chuyển đến cuối hàng, nhưng không cần thiết cho J

1
Bạn không cần phải ở cuối dòng để J tham gia các dòng.
Jonathan Leffler

1
Nhấn $ không thực sự cần thiết.
Laurence Gonsalves

1
@laurence .pressing $ đảm bảo rằng con trỏ được đặt ngay bên cạnh điều lệ dòng mới và đây là điều bắt buộc.
Vijay


1

Một cách khác để nối hai dòng mà không đặt con trỏ đến dòng đó là:

:6,6s#\n##

Ở đây 6 là số dòng mà một dòng khác sẽ tham gia. Để hiển thị số dòng, sử dụng :set nu.

Nếu chúng ta đang ở trên con trỏ, nơi dòng tiếp theo sẽ được nối, thì:

:s#\n##

Trong cả hai trường hợp, chúng tôi không cần gnhư thế :s#\n##g, bởi vì trên một dòng chỉ \ntồn tại một dòng .


Sử dụng dễ dàng hơn để Shift+Vchọn tất cả các dòng sẽ được nối, ngoại trừ dòng cuối cùng và sau đó :'<,'>s/\n/, /trong ví dụ này, nối các dòng trong khi đặt dấu phẩy và khoảng trắng ở cuối mỗi dòng. Lưu ý rằng khi một cái gì đó được chọn và chúng ta gõ :ở chế độ bình thường, thì nó '<,'>sẽ tự động xuất hiện trên dòng lệnh.
Evgeni Sergeev

Tốt cho nhiều dòng được chọn tham gia với dấu phân cách ưa thích. Tìm thấy một lỗi đánh máy ... ở chế độ bình thường hoặc ở chế độ trực quan?
vusan
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.