Làm cách nào để chèn dấu ngắt dòng ở vị trí con trỏ mà không cần vào chế độ chèn trong Vim?


88

Có thể chèn ngắt dòng ở vị trí con trỏ trong Vim mà không cần vào chế độ chèn không? Đây là một ví dụ ( [x]có nghĩa là con trỏ đang bật x):

if (some_condition) {[ ]return; }

Thỉnh thoảng, tôi có thể muốn nhập thêm một số mã. Vì vậy, tôi muốn nhấn iđể vào chế độ chèn, nhấn Enterđể chèn dấu ngắt dòng và sau đó xóa khoảng trống thừa. Tiếp theo, tôi sẽ vào chế độ bình thường và định vị con trỏ trước dấu ngoặc nhọn và sau đó làm điều tương tự để đưa nó vào dòng riêng của nó.

Tôi đã làm điều này một thời gian, nhưng chắc chắn có một cách tốt hơn để làm điều đó?


Bạn muốn chèn một cái gì đó mà không cần vào chế độ CHÈN?
Jeremy Cantrell

26
@ jeremy-cantrell Vâng, giống như "J" nối dòng tiếp theo và chèn khoảng trắng mà không cần chuyển sang chế độ CHÈN!
awendt

Câu trả lời:


107

Đối với ví dụ bạn đã đưa ra, bạn có thể sử dụng rEnterđể thay thế một ký tự đơn (khoảng trắng) bằng Enter. Sau đó, fspace.để chuyển tiếp đến khoảng trống tiếp theo và lặp lại lệnh cuối cùng.

Tùy thuộc vào cài đặt tự động rút tiền của bạn, phần trên có thể thụt lề hoặc không cho câu lệnh trả về đúng cách. Nếu không, hãy sử dụng sEnterTabEscthay thế để thay thế khoảng trắng bằng một dòng mới, thụt lề dòng và thoát khỏi chế độ chèn. Bạn sẽ phải thay thế khoảng trắng thứ hai bằng một lệnh khác để bạn không thể sử dụng '.' trong trường hợp này.


1
Tôi nghĩ đây là giải pháp dễ dàng nhất. Cảm ơn Greg.
Mark A. Nicolosi 26/10/08

4
'f [khoảng trắng]' phải tương đương với 'W' (tức là chuyển sang dấu trắng tiếp theo)
Nathan Fellman

4
'W' di chuyển một ký tự đi quá xa, nó sẽ chuyển sang ký tự tiếp theo sau khoảng trắng tiếp theo.
Greg Hewgill 23/09/09

1
Bạn cũng có thể sử dụng >><<để giúp thụt lề nếu bạn không muốn chuyển sang chế độ chèn với s.
Conner

12

Dưới đây là cách tạo macro chèn dòng mới vào con trỏ bất cứ khi nào bạn nhấn 'g' khi không ở chế độ chèn:

Từ bên trong vim, gõ:

:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]

Ở đâu:

  • [Ctrl + V] có nghĩa là giữ phím Ctrl và nhấn 'v'
  • [Enter] có nghĩa là nhấn phím Enter
  • [Esc] có nghĩa là nhấn phím Esc

Bạn sẽ thấy thông tin sau ở cuối cửa sổ vim của mình cho đến khi bạn nhấn phím Enter cuối cùng:

:map g i^M^[

Giải trình:

[Ctrl + V] có nghĩa là "trích dẫn ký tự sau" - nó cho phép bạn nhúng các ký tự dòng mới và thoát vào lệnh.

Vì vậy, bạn đang ánh xạ phím 'g' với chuỗi:

tôi [Nhập] [Thoát]

Đây là vim để chèn một dòng mới trước con trỏ, sau đó thoát khỏi chế độ chèn .

Tinh chỉnh:

  • Bạn có thể thay thế 'g' bằng bất kỳ ký tự nào chưa được liên kết với lệnh bạn sử dụng.
  • Thêm nhiều hơn vào lệnh, ví dụ f}i^M^[O - Điều này sẽ f ind the }tôi chèn một dòng mới khác, sau đó thoát khỏi chế độ chèn và O bút một dòng trống để bạn nhập thêm mã.
  • Bạn có thể thêm lệnh vào tệp .vimrc hoặc .exrc của mình để đặt nó vĩnh viễn. Chỉ cần bỏ qua dấu hai chấm từ đầu để lệnh bắt đầu bằng "bản đồ"

Thưởng thức!


Bạn đã trả lời câu hỏi phức tạp trong chủ đề, thay vì câu hỏi trong bài đăng. Những gì anh ta muốn biết là làm thế nào để dễ dàng loại bỏ khoảng trắng ở điểm mà đường thẳng bị hỏng nhưng không còn phục vụ mục đích.
Aristotle Pagaltzis 26/10/08

Cảm ơn. Đã cập nhật phần "Tinh chỉnh" để thực hiện những gì (tôi nghĩ) tác giả yêu cầu. Khi tôi kiểm tra nó, vi tự động loại bỏ các khoảng trống thừa cho tôi; sử dụng 'x' để xóa chúng nếu của bạn không. Và tại sao các lệnh vi trông giống như tiếng ồn đường dây modem? :-)
Adam Liss 26/10/08

11

Một ánh xạ đơn giản để ngắt dòng tại con trỏ bằng cách nhấn Ctrl + Enter:

:nmap <c-cr> i<cr><Esc>

về cơ bản vào chế độ 'chèn', chèn ngắt dòng và quay lại chế độ bình thường.

đặt nó vào tệp .vimrc của bạn để sử dụng trong tương lai.


5

Nếu bạn thường mở rộng khối một dòng thành ba dòng, hãy thử thay thế. Thay đổi dấu ngoặc mở thành dấu ngoặc nhọn / return và dấu ngoặc đóng thành dấu ngoặc nhọn / return.

Lệnh thay thế dấu ngoặc / trả về cho dấu ngoặc trông như sau:

:s/{/{\r/

Vì bạn muốn sử dụng nó thường xuyên, bạn có thể ánh xạ toàn bộ chuỗi cho một tổ hợp phím không sử dụng như sau:

:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M

Nơi bạn nhìn thấy ^ M trong chuỗi, hãy nhập [Ctrl-V] , sau đó nhấn enter .

Bây giờ với con trỏ của bạn ở bất kỳ đâu trên dòng mẫu, hãy nhấn phím được ánh xạ và các dấu xuống dòng được thêm vào.

Kiểm tra :help map-which-keyslời khuyên về việc chọn các tổ hợp phím không sử dụng để lập bản đồ.


BTW: gkhông được ánh xạ vì nó được sử dụng làm khóa 'không gian tên' cho nhiều ánh xạ vim bao gồm hai lần nhấn phím (xem :h g). Vì vậy, ánh xạ này thực sự là một việc không nên làm.
Hotschke

Có lệnh tốt nào báo cáo rằng gđã được sử dụng làm khóa 'không gian tên' không?
slothbear

Không nói riêng. Như tôi đã nói:help g là một cách để xem danh sách các gánh xạ mặc định + thứ gì đó. z, [ ]là các khóa 'không gian tên' khác, xem ví dụ :help index. Bạn có thể gọi :verbose map gđể xem tất cả các ánh xạ được xác định hiện tại bắt đầu bằng g. Các nguồn hữu ích trên web là viemu.com/vi-vim-cheat-sheet.gif , vimcasts.org/blog/2014/02/follow-my-leader , vimeo.com/85343734 (slide: speakerdeck.com/nelstrom/follow-my -leader )
Hotschke

3

Giả sử bạn ổn với việc ánh xạ Ktới một thứ khác (chọn một khóa khác theo ý thích của bạn) và sử dụng điểm đánh dấu 'làm điểm đánh dấu tạm thời là được thì tại sao không làm điều này?

:nmap K m'a<CR><Esc>`'

bây giờ nhấn K ở chế độ bình thường trên ký tự mà sau đó bạn muốn ngắt dòng xảy ra sẽ tách dòng và để con trỏ ở vị trí cũ.


1

Vim sẽ tự động loại bỏ bất kỳ khoảng trắng nào ở bên phải con trỏ nếu bạn ngắt một dòng trong khi autoindent(hoặc bất kỳ hỗ trợ thụt lề nào khác) được bật.

Nếu bạn không muốn sử dụng bất kỳ cài đặt nào trong số đó, hãy sử dụng sthay vìi để s ubstitute văn bản mới của bạn cho chỗ trống thay vì chỉ chèn. (Nếu có nhiều ô trống, hãy đặt con trỏ ở ngoài cùng bên trái và sử dụng cwthay thế.)


1

Về cơ bản, khi bạn tách một dòng, bạn muốn chỉ chèn một dấu xuống dòng hoặc trong trường hợp bạn đang ở trên một khoảng trắng, hãy thay thế nó bằng một dấu xuống dòng. Chà, tại sao phải giải quyết cái này hay cái khác? Đây là bản đồ của tôi cho K:

"Have K split lines the way J joins lines
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"

Tôi sử dụng toán tử bậc ba để cô đọng hai hành động thành một bản đồ chính. Chia nhỏ nó ra, <expr>có nghĩa là đầu ra của bản đồ chính có thể động và trong trường hợp này phụ thuộc vào điều kiện getline('.')[col('.')-1]==' ', đây là cách lâu dài để hỏi vim xem ký tự dưới con trỏ có phải là dấu cách hay không. Cuối cùng, toán tử bậc ba quen thuộc ? :hoặc thay thế khoảng trắng bằng linebreak ( r<CR>) hoặc chèn một dấu mới (i<CR><Esc> )

Bây giờ bạn có một bản đồ phím chị em đáng yêu để Jlệnh.


Cái này khá trơn. Tôi không chắc liệu mình đã bao giờ cố ý sử dụng K hay chưa, nhưng điều này có thể khiến nó đáng để loại bỏ hoặc ánh xạ lại ở nơi khác.
dragon788,

0

Đặt ánh xạ khóa này trong vimrc của bạn

:map <C-m> i<CR><Esc>h

Sau đó nhấn Ctrl + m nếu bạn muốn sử dụng nó trong vim của mình.


0

IMHO, ánh xạ tích hợp gskhông phải là một ánh xạ hữu ích (đưa vim vào trạng thái ngủ), người ta có thể sử dụng cái này để tách:

nmap gs i<CR><ESC>

0

Trong Vrapper, bạn có thể sử dụng gql sẽ chia một dòng mà không cần vào chế độ chèn, nhưng không phải lúc nào cũng có thể duy trì thụt lề.


0

Trên thực tế, bạn cần các hoạt động kết hợp sau:

  1. Nhấn vđể vào Chế độ trực quan
  2. Chọn dòng bạn muốn tách
  3. Nhấn :để vào Chế độ Lệnh
  4. s/\s/\r/g
  5. Làm xong

0

Nếu bạn có đầu vào:

aaa bbb ccc ddd

và muốn xuất

aaa
bbb
ccc
ddd

Bạn có thể sử dụng lệnh

f r<ENTER>;.;.

0

Tôi thấy đây là cách triển khai trung thực nhất những gì tôi mong đợi là hành vi ngược lại J

nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w

Nó thực hiện dòng mới đơn giản tại con trỏ, xử lý bất kỳ khoảng trắng nào ở dòng trước nếu có bất kỳ hiện tại nào và sau đó trả con trỏ về vị trí chính xác.

i <cr> <esc> - đây là một trong những giải pháp phổ biến nhất được đề xuất, nó không xóa các ký tự không có khoảng trắng dưới con trỏ của bạn nhưng nó cũng để lại cho bạn khoảng trắng theo sau

^mw - goto đầu dòng mới và tạo dấu dưới w

gk - lên một dòng

:silent! s/\v +$//<cr> - regex thay thế bất kỳ khoảng trắng nào ở cuối dòng

:noh<cr> - Xóa mọi đánh dấu tìm kiếm mà regex có thể đã bật

`w - trả lại dấu dưới w

Về cơ bản kết hợp tốt nhất của cả hai r<esc><cr>i<cr><esc>

Lưu ý: Tôi có ràng buộc này Scó khả năng ghi đè lên một khóa hữu ích nhưng nó là từ đồng nghĩa với ccvà vì tôi không sử dụng nó thường xuyên vì tôi chia nhỏ nên tôi không sao với việc ghi đè nó.



-1

Ánh xạ này sẽ chia nhỏ bất kỳ hàm một dòng nào mà bạn có. Chỉ cần đặt con trỏ của bạn trên dòng và nhấn 'g' ở chế độ bình thường:

:map g ^f{malr<CR>`a%hr<CR>`a

Điều này giả định rằng bạn có một khoảng trắng sau dấu ngoặc nhọn mở và một khoảng trắng trước dấu ngoặc nhọn đóng. Xem nếu điều đó làm việc cho bạn.

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.