Làm thế nào để tham gia các dòng mà không tạo ra một không gian?


73

Lệnh tiêu chuẩn Jđể nối các dòng thay thế (các) ký tự dòng mới bằng một khoảng trắng. Nó hữu ích khi chỉnh sửa 'văn học' nhưng có thể gây rắc rối nếu tôi nói, chỉnh sửa một bãi chứa hex bằng tay nếu tôi quên xóa không gian thừa.

Có một phương pháp nhanh chóng và dễ dàng để nối hai dòng mà không tạo khoảng cách giữa chúng không?

Câu trả lời:


87

Sự gJkết hợp làm điều này; từ :help gJ:

Tham gia [đếm] dòng, với tối thiểu hai dòng. Không chèn hoặc xóa bất kỳ khoảng trắng.

Bạn có thể buộc nó lại J, nếu bạn muốn lưu tổ hợp phím:

:nnoremap J gJ

Lưu ý rằng điều này không xóa bất kỳ khoảng trắng nào, vì vậy nếu dòng hiện tại kết thúc bằng khoảng trắng hoặc dòng tiếp theo bắt đầu bằng một hoặc nhiều khoảng trắng, chúng sẽ được giữ nguyên .

Vì thế:

Hello
    world

Trở thành:

Hello    world

Chúng ta có thể sử dụng Jxtrong trường hợp này, sau đó sẽ được Helloworld, nhưng nó sẽ không hoạt động trong mọi trường hợp; từ sự giúp đỡ:

Tham gia các dòng được tô sáng, với tối thiểu hai dòng. Xóa thụt lề và chèn tối đa hai khoảng trắng

[...]

Các lệnh này, ngoại trừ "gJ", chèn một khoảng trắng vào vị trí trừ khi có khoảng trắng ở cuối hoặc dòng tiếp theo bắt đầu bằng dấu ')'.

Vì vậy, trong một số trường hợp, nhiều hơn một khoảng trắng hoặc không có khoảng trắng được chèn vào. Theo như tôi có thể thấy, không có cách nào dễ dàng để thay đổi hành vi này; Tôi đã tạo một hàm để sửa đổi gJđể luôn tham gia mà không có khoảng trắng:

" Like gJ, but always remove spaces
fun! JoinSpaceless()
    execute 'normal gJ'

    " Character under cursor is whitespace?
    if matchstr(getline('.'), '\%' . col('.') . 'c.') =~ '\s'
        " When remove it!
        execute 'normal dw'
    endif
endfun

" Map it to a key
nnoremap <Leader>J :call JoinSpaceless()<CR>

Xem thêm: :help J,:help 'joinspaces'


Có thể sử dụng một số chức năng "Bảo tồn" để giữ vị trí con trỏ khi sử dụng chức năng này hay không hoặc làm cách nào để có kết quả này?
SergioAraujo

8

Một mẹo khác bạn có thể thử là sử dụng thay thế. Đôi khi điều này có thể hữu ích.

%s/$\n//g

Kịch bản: Xóa ký tự cuối cùng và tham gia với dòng tiếp theo:

%s/=$\n\(.\)/\1/g

Ví dụ,

xxxx=
123

trở thành:

xxxx123

3

Tạo một macro và tái sử dụng nó:

qaJxq

Bây giờ phát lại macro, abằng cách sử dụng @abất cứ nơi nào bạn muốn tham gia hai dòng không có không gian.

@@sẽ lặp lại macro trước đó. Vì vậy, bạn chỉ có thể giữ @để tham gia nhiều dòng.


1
Tại sao gõ @akhi bạn có thể gõ Jx? Cùng một số lần nhấn phím và nhấn Shift!
Shahbaz

2
@Shahbaz Có lẽ vì dòng cuối cùng: "bạn chỉ có thể giữ @"
muru

1
@muru, đúng vậy!
Shahbaz

4
Nó cũng làm cho nó trở thành một lệnh lặp lại, vì vậy bạn có thể sử dụng 3@ađể nối 3 dòng, trong khi thực hiện 3Jxsẽ nối 3 dòng với khoảng trắng và sau đó xóa khoảng trắng giữa dòng thứ hai và thứ ba, để lại khoảng trắng giữa các dòng khác.
Haegin

1

Để luôn tham gia với một không gian duy nhất:

nmap J gJi <ESC>ciW <ESC>

Để tham gia mà không có không gian nào cả (loại bỏ dấu vết + không gian hàng đầu):

nmap <C-J> gJi <ESC>diW

1
Chào mừng đến với trang web này! Ánh xạ của bạn có vẻ hơi quá so với tôi, sẽ rất hữu ích nếu bạn có thể thêm một chút giải thích về cách chúng hoạt động.
statox

1

Chọn các dòng bạn muốn hợp nhất, nhập lệnh Ex bằng cách nhập dấu hai chấm :ở chế độ bình thường. Sau đó gõ lệnh này:

s/$\n\s*//gc

Toàn bộ lệnh sẽ trông giống như vậy:

:'<,'>s/$\n\s*//gc

Đây thực sự là một phiên bản tinh chỉnh của lệnh @ insidepower thay thế các vết lõm không gian cũng như các ký tự dòng mới.

Giải trình:

  • '<,'> có nghĩa là chúng tôi chỉ sửa đổi các dòng được chọn trong chế độ trực quan.

  • /$\n\s*là một mô hình regex . Chúng tôi đang tìm kiếm một trận đấu kết thúc $bằng một ký tự dòng mới \nvà có số lượng khoảng trắng không xác định *sau đó.

  • s/pattern//gclà một lệnh thay thế để tìm từng mẫu và thay thế nó bằng một ký tự trống khi xác nhận.

Để tìm hiểu thêm về cờ và siêu ký tự cho các biểu thức chính quy trong Vim, hãy xem chương này của Vim Reference.


2
Xin chào, chào mừng bạn đến với Vi và Vim ! Bạn đã có một câu trả lời được viết khá tốt ở đó; danh tiếng cho điều đó. Một điều đáng chú ý của tôi là vim biểu thức chính quy = / = biểu thức chính quy python và đôi khi điều đó gây nhầm lẫn cho người dùng. Có thể liên kết đến tài liệu trợ giúp cho Vim regex thay thế?
D. Ben Knoble

2
Nit thứ hai: câu trả lời bạn tham khảo được viết bởi @ insidepower và được chỉnh sửa bởi Peter.
D. Ben Knoble
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.