xóa từ sau hoặc xung quanh con trỏ trong VIM


212

Bây giờ tôi đang chuyển sang VIMtừ TextMate. Tôi tìm thấy ^+Wtrong chế độ INSERT rất hữu ích. Tuy nhiên, tôi muốn xóa không chỉ từ trước con trỏ, mà cả từ sau hoặc xung quanh con trỏ nữa.

Tôi đã làm một số việc, nhưng điều duy nhất tôi có thể tìm thấy là ^+Wxóa từ TRƯỚC con trỏ.

Câu trả lời:


78

Những gì bạn nên làm là tạo một imap của một khóa nhất định cho một loạt các lệnh, trong trường hợp này, các lệnh sẽ đưa bạn vào chế độ bình thường, xóa từ hiện tại và sau đó đưa bạn trở lại chèn:

:imap <C-d> <C-[>diwi

29
": h diw" cho rất nhiều shrtcts hữu ích!
klokop

12
Điểm thưởng cho việc sử dụng <Co>. Nó thực thi một lệnh trong chế độ Bình thường và nhảy thẳng trở lại vào Chèn, do đó, một cái gì đó giống như imap <C-d> <C-o>diwhoạt động. Nó cũng không tạo ra một điểm hoàn tác, điều mà <Esc> luôn luôn làm.
zelk

<Co> trong chế độ chèn đã tạo nên ngày của tôi :)
Lusk116

541

Chế độ bình thường:

daw : delete the word under the cursor    
caw : delete the word under the cursor and put you in insert mode 

125
Nó hữu ích cho tôi khi nghĩ về nó như là daw: xóa một từ và caw: thay đổi một từ.
Welbornio

1
Chúa tôi đã và đang sử dụng da)ci)chưa bao giờ nghĩ về điều này!
Bầu trời

1
Đó là Jerry vàng! VÀNG! Tôi đã lập bản đồ cho những đứa trẻ đó trong .vimrchồ sơ của mình như vậy: nmap <Leader>d dawnmap <Leader>c caw
racl101

1
Có lẽ đáng nói đến đó awlà một ví dụ về lựa chọn đối tượng. Bạn có thể thử lựa chọn đối tượng trong chế độ trực quan để xem hiệu ứng của chúng: vimdoc.sourceforge.net/htmldoc/motion.html#object-select
crantok 29/12/18

103

Tôi nghĩ rằng nó chỉ daw

daw - delete a word

1
Tôi biết đó alà một lệnh cho Append text after the cursor [count] times.nhưng làm thế nào để dawlàm việc?
cú pháp

3
@REACHUS nhân vật ban đầu dra lệnh bạn sẽ 'xóa'. 'A' là một loại tham số, chỉ định rằng việc xóa sẽ bao gồm một dấu phân cách. Cuối cùng, 'w', một cái khác parameter- nếu bạn sẽ - chỉ định rằng một wordđơn vị sẽ bị xóa.
vlad-ardelean

2
sự khác biệt giữa dwdaw?
AK_

5
@AK_ Phản hồi muộn, nhưng nếu bạn ở giữa một từ, dwsẽ xóa từ con trỏ đến cuối từ, trong khi dawsẽ xóa toàn bộ từ cùng với khoảng trắng. diwsẽ xóa toàn bộ từ mà không chạm vào khoảng trắng xung quanh nó.
Dmiters

67

Dưới đây hoạt động cho chế độ Bình thường: Tôi đồng ý với câu trả lời của Dan Olson rằng có lẽ bạn nên ở chế độ bình thường trong hầu hết các thao tác xóa. Chi tiết bên dưới.

Nếu con trỏ ở trong từ:
diwxóa trong từ (không bao gồm khoảng trắng)
dawđể xóa xung quanh từ (bao gồm khoảng trắng trước từ tiếp theo).

Nếu con trỏ ở đầu từ, chỉ cần nhấn dw.

Điều này có thể được nhân lên bằng cách thêm các số thông thường cho chuyển động, ví dụ 2w để di chuyển về phía trước 2 từ, vì vậy d2w xóa hai từ.

Chế độ chèn ^ w
Ý tưởng sử dụng hjkl cho chuyển động trong Vim là sẽ hiệu quả hơn khi giữ tay bạn trên hàng nhà. Vào cuối của một từ ^ w hoạt động tuyệt vời để nhanh chóng xóa từ. Nếu bạn đã chuyển sang chế độ chèn, hãy nhập một số văn bản và sử dụng các phím mũi tên để kết thúc ở giữa từ mà bạn đã đi ngược lại triết lý hàng chủ.
Nếu bạn đang ở chế độ bình thường và muốn thay đổi từ, bạn chỉ cần sử dụng c(thay đổi) thay vì d(xóa) nếu bạn muốn thay đổi hoàn toàn từ đó và nhập lại chế độ chèn mà không cần phải nhấn iđể quay lại để gõ.


42

Ý bạn là như thế nào?

dw

10
Đến bữa tiệc muộn, nhưng dw sẽ xóa từ vị trí hiện tại đến cuối từ, để xóa toàn bộ từ ngay từ đầu, sử dụng diw hoặc daw
Dvid Silva

1
dwsẽ không xóa dấu gạch nối hoặc dấu chấm câu khác.
ccpizza

* Lưu ý: Điều này sẽ ghi đè lên bộ đệm / lần cuối. Đây là nhiều hơn một hoạt động 'Cắt', không chỉ 'Xóa'.
MD. Mohiuddin Ahmed

23

Để xóa tất cả các ký tự giữa hai khoảng trắng, ở chế độ bình thường:

daW

Để xóa chỉ một từ:

daw 

20

Nó không giống như có bất kỳ built-in cách để làm điều đó trong chế độ chèn, đó là câu hỏi. Một số câu trả lời khác là đúng cho chế độ bình thường, cũng như chỉ ra rằng có thể tạo ánh xạ tùy chỉnh để thêm chức năng trong chế độ chèn.

Thành thật mà nói, có lẽ bạn nên thực hiện hầu hết việc xóa trong chế độ bình thường. ^ W rất gọn gàng để biết nhưng tôi không chắc mình có thể nghĩ đến một tình huống mà tôi muốn làm điều đó hơn là thoát ra để vào chế độ bình thường và có các lệnh xóa mạnh hơn theo ý của tôi.

Vim rất khác với một số biên tập viên khác (bao gồm cả TextMate) theo cách này. Nếu bạn đang sử dụng nó một cách hiệu quả, có lẽ bạn sẽ thấy rằng bạn không dành nhiều thời gian ở chế độ chèn.


1
Tôi sử dụng ^ wa rất nhiều, chủ yếu là khi tôi gõ nhầm một từ - thay vì quay lại và thêm chữ cái còn thiếu / v.v., tôi chỉ xóa toàn bộ và bắt đầu lại .. Chuyển sang chế độ bình thường chỉ để xóa một từ có vẻ như là một sự lãng phí của một vài tổ hợp phím .. Ví dụ, "ví dụ Cục Thủy lợi [^ w] từ" là tổ hợp phím ít hơn "dụ Cục Thủy lợi [^ c] [dw] [i] từ"
dBR

1
dbr: Anh ấy đã không yêu cầu thực hiện hành vi ^ W cơ bản, vim đó hỗ trợ. Anh ta yêu cầu xóa tất cả các từ trong khi ở giữa trong khi ở chế độ chèn, đó là một tình huống kỳ lạ đối với vim và vì vậy không có lệnh nào để làm điều đó. Bạn luôn có thể liên kết ^ Q với <Esc> ciw nếu bạn thực sự muốn sử dụng chức năng. Ồ, cũng là [i] trong [^ c] [dw] [i] là dư thừa, bạn có thể sử dụng [^ c] [ciw]
bfabry

4
"Nó không giống như có một cách ..." - cũng có vô số cách để làm điều đó - có chỉ không có built-in bằng cách nào, afaik. Mặc dù tôi hoàn toàn đồng ý với tuyên bố của Dan về chế độ chèn so với chế độ bình thường, tất nhiên bạn có thể chỉ cần xác định ánh xạ chế độ chèn, xem ": help imap", bất cứ điều gì bạn muốn đạt được nếu bạn thực sự cần chức năng trong chế độ chèn.
dùng55400

13

Để xóa toàn bộ từ mà con trỏ của bạn đang sử dụng diw
Để xóa toàn bộ từ mà con trỏ của bạn đang bật và để đưa bạn vào chế độ chèn, hãy sử dụng ciw
nếu bạn không muốn xóa toàn bộ từ nhưng xóa khỏi vị trí của bạndw/cw


8

Vì có rất nhiều cách để xóa một từ, hãy minh họa chúng.

Giả sử bạn chỉnh sửa:

foo-bar quux

và gọi một lệnh trong khi con trỏ ở trên thanh 'a' trong ':

foo-bquux  # dw:  letters then spaces right of cursor
foo-quux   # daw: letters on both sides of cursor then spaces on the right 
foo- quux  # diw: letters on both sides of cursor
foo-bquux  # dW:  non-whitespace then spaces right of cursor
quux       # daW: non-whitespace on both sides of cursor then spaces on the right
 quux      # diW: non-whitespace on both sides of cursor

5

Chế độ chèn không có lệnh như vậy, thật không may. Trong VIM, để xóa toàn bộ từ dưới con trỏ, bạn có thể nhập viwdở chế độ BÌNH THƯỜNG. Có nghĩa là " V isual-block I nner W ord D elete". Sử dụng chữ hoa Wđể bao gồm dấu câu.


3

Câu trả lời được chấp nhận thất bại khi cố gắng lặp lại xóa từ, thay vào đó hãy thử giải pháp này:

" delete current word, insert and normal modes
inoremap <C-BS> <C-O>b<C-O>dw
noremap <C-BS> bdw

Nó ánh xạ CTRL-BackSpace, cũng hoạt động ở chế độ bình thường.


Tôi thích câu trả lời này tốt hơn chỉ vì nó cũng hoạt động ở chế độ bình thường.
sivabudh

2

Để xóa một số lượng ký tự nhất định trước con trỏ, bạn có thể sử dụng X. Để xóa một số từ nhất định sau con trỏ, bạn có thể sử dụng dw (ví dụ: có thể xóa nhiều từ bằng 3w cho 3 từ). Để xóa xung quanh con trỏ nói chung, bạn có thể sử dụng daw.


2

Trong vi cũ, bdi chuyển con trỏ đến đầu từ trước con trỏ, wdi chuyển con trỏ đến đầu từ sau con trỏ, edi chuyển con trỏ ở cuối từ sau con trỏ vàdw xóa từ con trỏ đến cuối từ.

Nếu bạn nhập wbdw, bạn xóa từ xung quanh con trỏ, ngay cả khi con trỏ ở đầu hoặc cuối từ. Lưu ý rằng khoảng trắng sau một từ được coi là một phần của từ cần xóa.


2

Không chắc chắn chính xác về việc bạn sử dụng "trước" và "sau", nhưng bạn đã thử chưa

dw

?

Chỉnh sửa: Tôi đoán bạn đang tìm kiếm thứ gì đó để sử dụng trong chế độ chèn. Thật kỳ lạ, không có gì được tìm thấy trong các tài liệu, ctrl-w dường như là tất cả có.


2

Tôi đã thực hiện hai ánh xạ để tôi có thể có được sự nhất quán trong chế độ chèn và ngoài chế độ chèn.

:map <'Key of your choice'> caw

:imap <'Key of your choice'> <'Esc'> caw


0

Tôi muốn xóa không chỉ từ trước con trỏ, mà cả từ sau hoặc xung quanh con trỏ nữa.

Trong trường hợp đó, giải pháp được đề xuất bởi OP (tức là sử dụng <c-w>) có thể được kết hợp với câu trả lời được chấp nhận để đưa ra:

inoremap <c-d> <c-o>daw<c-w>

cách khác (giải pháp ngắn hơn):

inoremap <c-d> <c-o>vawobd

Đầu vào mẫu:

word1 word2 word3 word4
               ^------------- Cursor location

Đầu ra:

word1 word4
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.