Cách tìm kiếm các dòng khớp với dòng hiện tại trong vim


11

Tôi thường tìm kiếm các từ theo :/string, nhưng nếu tôi phải tìm kiếm toàn bộ dòng hiện tại, làm thế nào để làm điều đó.

event: 1  beacon: 0x02              //line 1
event: 19 beacon: 0x02              //line 2
event: 1  beacon: 0x03              //line 3
event: 1  beacon: 0x02              //line 4
event: 8  beacon: 0x01              //line 5
event: 19 beacon: 0x02              //line 6
event: 1  beacon: 0x02              //line 7

Ví dụ: nếu cursorhiện tại line 1cách tìm kiếm tương tự như :/đối với văn bản chứa toàn bộ dòng hiện tại. Con trỏ sẽ nhảy sau đó để khớp line 4và một lần nữa đểline 7

Câu trả lời:


7

Đây là cách tôi làm:

  1. Kéo dòng (vào thanh ghi không tên), không bao gồm dòng mới ở cuối: 0y$
  2. Bắt đầu một tìm kiếm rất danh nghĩa :/\V
  3. Thêm dòng kéo dài: <c-r>"
  4. Tắt tìm kiếm: <cr>

Như @EvergreenTree chỉ ra trong một nhận xét , tất nhiên bạn có thể tạo ánh xạ để thực hiện tất cả các bước trong một lần:

nnoremap <leader>* 0y$/\V<c-r>"<cr>

Các chủ đề trợ giúp có liên quan:

:help registers
:help /magic
:help c_CTRL-R

NB Nếu dòng bạn đang tìm kiếm có dấu gạch chéo ngược, bạn vẫn sẽ cần phải đi qua và thoát chúng (bằng cách thêm dấu gạch chéo ngược khác), ngay cả với một tìm kiếm rất danh nghĩa .


4
Tất nhiên, bạn cũng có thể tạo một bản đồ cho việc này: nnoremap {key} 0y$/\V<c-r>"<cr>
EvergreenTree

9

Đặc biệt là cho mục đích lập bản đồ, tôi thấy việc sử dụng getline()thanh lịch hơn là tự mình làm việc. Gọi getline()bằng một chuỗi '.'trả về dòng dưới con trỏ. Có hai lựa chọn tốt để sử dụng điều này:

:exec '/' . getline('.')

trong đó phân tích các chuỗi '/'và những gì được trả về từ getline()cùng nhau và thực hiện đó như là một lệnh vim.

hoặc là

/<C-r>=getline('.')<CR>

trong đó sử dụng thanh ghi biểu thức @=. Biểu thức sau =được đánh giá sau lần đầu tiên <CR>và được đặt trong dòng lệnh.


Đẹp! Khi dòng chứa ký tự như /hoặc 'nó không hoạt động tốt. Dù sao, tôi học được điều gì hôm nay! Cảm ơn bạn
Luc M

4

Cá nhân tôi sẽ nhận được một plugin ngôi sao trực quan ( có rất ít ra khỏi đó ). Có một Vimcast hay về điều này: Tìm kiếm văn bản đã chọn . Điều này có nghĩa là bạn có thể chọn dòng trực quan và sau đó nhấn *.

Nếu một plugin không phải là thứ của bạn, bạn có thể thêm ánh xạ sau vào vimrc:

xnoremap * :<c-u>let @/=@"<cr>gvy:let [@/,@"]=[@",@/]<cr>/\V<c-r>=substitute(escape(@/,'/\'),'\n','\\n','g')<cr><cr>

Lưu ý: Visual-block ( <c-v>) không được hỗ trợ cho ánh xạ này.


Tôi đã thêm ánh xạ nhưng thực ra nó đang nhảy đến từ phù hợp đầu tiên và KHÔNG chọn toàn bộ dòng.
manav mn

Nếu nó khớp với một từ thì tôi giả sử bạn đang sử dụng *từ chế độ bình thường hoặc không cài đặt ánh xạ chính xác.
Peter Rincker

4

Tất cả các câu trả lời hiện tại đều thất bại nếu dòng của bạn chứa các mục nhất định được hiểu là một phần của mẫu. Các \Vđiểm được hầu hết các con đường đó nhưng vẫn messes lên với dấu chéo ngược.

Hãy thử điều này để thoát khỏi dấu gạch chéo ngược ...

/\V<C-R>=escape(getline('.'), '\')

Và sau đó nếu bạn đang sử dụng nó trong bản đồ, bạn sẽ cần một hoặc hai <Enter>giây ở cuối tùy thuộc vào cách bạn muốn nó hoạt động.


Câu trả lời tuyệt vời! Các dòng thường chứa cả hai loại dấu gạch chéo gây nhầm lẫn cho các câu trả lời khác. Đối số cuối cùng của việc trốn thoát cũng bao gồm một dấu gạch chéo về phía trước:escape(…, '/\')
bobbogo

2

Với vim-asterisk được cài đặt, chỉ cần sử dụng V$*(hoặc 0v$*) để chọn dòng hiện tại và tìm kiếm nó.

Trong lệnh thứ hai 0là không cần thiết nếu con trỏ đã ở đầu dòng.


1
Không *chỉ tìm kiếm từ dưới con trỏ, và không phải lựa chọn hình ảnh hiện tại?
EvergreenTree

1
@EvergreenTree Tôi đã quên đề cập đến plugin. Cảm ơn đã thông báo
adelarsq

2

Một cách khác để làm điều này là sử dụng cửa sổ dòng lệnh: yy/<Ctrl-F>p<Enter>

  • Yank toàn bộ dòng bạn cần với yy
  • Nhấn /và sau đó Ctrl-F để mở cửa sổ dòng lệnh
  • Nhấn pđể dán dòng
  • Nhấn Enter để bắt đầu tìm kiếm

5
Bạn cũng có thể sử dụng q/để có được hiệu ứng tương tự như/<c-f>
evilsoup

2

http://vim.wikia.com/wiki/Searching_for_expressions_which_include_slashes chỉ ra rằng đăng ký tìm kiếm có thể được đặt trực tiếp, như thế này:

:let @/='/abc/def/ghi/'

Điều này cho phép tìm kiếm trên dòng và hoạt động ngay cả khi dòng bao gồm dấu gạch chéo.

Vì vậy, để thực hiện, giả sử, \*ánh xạ tới một tìm kiếm dòng:

nnoremap <leader>* :set hlsearch<cr>:let @/=getline('.')<cr>
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.