Làm cách nào để chỉ định “từ dưới con trỏ” trên dòng lệnh của VIM?


86

Tôi muốn viết một lệnh chỉ định "từ dưới con trỏ" trong VIM. Ví dụ, giả sử tôi có con trỏ trên một từ và tôi làm cho nó xuất hiện hai lần. Ví dụ: nếu từ là "abc" và tôi muốn "abcabc" thì tôi có thể nhập:

:s/\(abc\)/\1\1/

Nhưng sau đó tôi muốn có thể di chuyển con trỏ đến "def" và sử dụng lệnh tương tự để thay đổi nó thành "defdef":

:s/\(def\)/\1\1/

Làm thế nào tôi có thể viết lệnh trong dòng lệnh để nó thực hiện điều này?

:s/\(*whatever is under the commandline*\)/\1\1

Câu trả lời:


74

<cword>là từ dưới con trỏ (: help <cword>).

Xin lỗi, tôi nên hoàn thiện hơn trong câu trả lời này.

Bạn có thể nmap một lệnh đến nó, hoặc chuỗi tổ hợp phím này cho kẻ lười biếng sẽ hoạt động:

b #go to beginning of current word
yw #yank to register

Sau đó, khi bạn đang nhập mẫu của mình, bạn có thể nhấn vào <control-r>0<enter>đó sẽ dán vào lệnh của bạn nội dung của thanh ghi thứ 0.

Bạn cũng có thể tạo một lệnh cho điều này như:

:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/

Bản đồ sẽ nhấn '\' và 'w' cùng một lúc để thay thế dòng lệnh của bạn bằng

:s/\(<currentword>\)/

17
Tôi đánh giá cao câu trả lời tuyệt vời, nhưng có lẽ tôi sẽ đề nghị kết yiwthúc bywchỉ vì trí nhớ cơ bắp. Trong kịch bản mà con trỏ của bạn đã xảy ra để được vào ký tự đầu tiên trong văn bản, bạn phải bỏ qua bvà chỉ cần gõ ywvs bạn có thể bỏ qua itrong yiw. Tai nạn có thể xảy ra, và sửa chữa một sai lầm là chắc chắn hơn bấm phím :)
Jacob Swartwood

130

Khi ở chế độ dòng lệnh, CTRL+ R CTRL+ Wsẽ chèn từ dưới con trỏ.

Xem trợ giúp để c_CTRL-Rbiết danh sách tất cả các đăng ký đặc biệt khác:

:help c_CTRL-R

28
yiwP

yiw: Yank từ bên trong (từ dưới con trỏ). Lệnh này cũng di chuyển con trỏ đến đầu từ.

P: Dán trước con trỏ.

Sau đó, bạn có thể ánh xạ ví dụ: < ALT > - Dvới lệnh này:

:nmap < ALT >-D yiwP

4
Câu hỏi đặt ra là đặc biệt về quy định cụ thể "từ dưới con trỏ" từ dòng lệnh Vim, chứ không phải từ chế độ lệnh
Nathan Fellman

12

Một cách dễ dàng khác để làm điều này là sử dụng *lệnh.

Ở chế độ thông thường, khi trên một từ, hãy nhập

*:s//\0\0<Enter>

* làm cho mẫu tìm kiếm trở thành từ hiện tại (ví dụ: \ <abc \>).

:s//thực hiện thay thế bằng cách sử dụng mẫu tìm kiếm hiện tại và \0trong phần thay thế là chuỗi được so khớp.

Sau đó, bạn có thể lặp lại hành vi này, nói lại từ "def", bằng cách nhập lại như cũ hoặc bằng cách nhập

*@:

@: chỉ lặp lại lệnh ex cuối cùng mà không cần <Enter>, trong trường hợp này là sự thay thế.

Bạn cũng có thể ghi lại một macro nhanh để thực hiện việc này bằng qlệnh

qd*:s//\0\0<Enter>q

Sau đó, lặp lại nó với nội dung trái tim của bạn bằng cách gõ

@d

khi bạn muốn nhân đôi một từ. Vì đây chỉ là một ký tự nhỏ hơn giải pháp trước đó, nó có thể không có giá trị đối với bạn - trừ khi bạn thực hiện các lệnh cũ khác giữa việc nhân đôi từ, điều này sẽ thay đổi hành vi của@:


1

Bạn cần phải thoát khỏi dấu gạch chéo ngược trong ánh xạ. Bạn cũng có thể bao gồm chuỗi thay thế trong ánh xạ.

:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>

1
ywPx

sẽ làm những gì bạn mô tả.

ywPxw

cũng sẽ đưa con trỏ tới từ tiếp theo.


Câu hỏi đặt ra là đặc biệt về quy định cụ thể "từ dưới con trỏ" từ dòng lệnh Vim, chứ không phải từ chế độ lệnh
Nathan Fellman

Hãy mô tả các câu trả lời như vậy, mỗi chữ cái trong lệnh.
Vitaly Zdanevich

0

@ user11211 có cách đơn giản nhất để sao chép từ dưới con trỏ:

yiwP

kéo từ bên trong (di chuyển con trỏ đến đầu từ), dán (trước con trỏ).

ví dụ. thẳng [t] về phía trước ----> thẳng thắn [d] thẳng

[] là con trỏ

Để xây dựng ...

Bạn có thể muốn con trỏ theo sau từ trùng lặp của mình:

yiwPea

thẳng thắn [t] về phía trước ----> thẳng thắn thẳng thắn []

GHI CHÚ:

yiw

là từ bên trong yank (không có khoảng trắng)

yaw

là kéo tất cả các từ (bao gồm cả khoảng trắng ở cuối).

yawPea

do đó là từ trùng lặp bao gồm khoảng trắng và con trỏ vị trí.

thẳng [t] về phía trước ----> thẳng thắn thẳng thắn []


Câu hỏi đặc biệt là về việc chỉ định "từ dưới con trỏ" từ dòng lệnh của Vim , không phải từ chế độ lệnh.
Nathan Fellman

1
Bạn có thể sử dụng bất kỳ lệnh bình thường (chế độ lệnh) nào ở trên trong chế độ lệnh, bằng cách đơn giản đặt trước chúng bằng: normal ... ví dụ: yiwP bình thường sẽ thực hiện tương tự như yiwP ở chế độ bình thường. Tất nhiên, đây là cách làm chậm hơn những gì bạn yêu cầu.
BBW Trước Windows

-1
" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>

bạn có thể bình luận về những gì điều này làm?
Nathan Fellman

1
Thao tác này sử dụng ncờ cho :substitutelệnh để in ra bao nhiêu lần từ dưới con trỏ xuất hiện trong bộ đệm hiện tại. Khá thông minh, nhưng không thực sự là một câu trả lời cho câu hỏi này.
Jacob
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.