2010-09-22 9 views
6

Tôi đang viết một tập lệnh mà tôi muốn kiểm soát tìm kiếm theo chương trình và làm nổi bật chúng. Các kết quả của hàm search() không được đánh dấu (tôi nghĩ), vì vậy việc sử dụng hàm đó không được sử dụng cho tôi.Kiểm soát tìm kiếm và đánh dấu Vim từ tập lệnh

Điều tôi muốn làm là sử dụng lệnh 'bình thường /' để tìm kiếm biến số, nhưng điều đó dường như không đơn giản. Tôi có thể kịch bản lệnh:

execute 'normal /' . my_variable . '\<CR>' 

(hoặc các biến thể khác như đề xuất trong mũi vim đây: http://vim.wikia.com/wiki/Using_normal_command_in_a_script_for_searching)

nhưng nó không làm gì cả. Tôi có thể thấy cụm từ tìm kiếm chính xác trong dòng lệnh sau khi thực thi dòng lệnh, nhưng tiêu điểm nằm trong tài liệu, thanh ghi tìm kiếm không bị thay đổi và con trỏ chưa thực hiện bất kỳ tìm kiếm nào. (Dường như là < CR> không được nhập, mặc dù không có lỗi nào được ném - và có, tôi đã thử sử dụng chữ^M quá.)

Tôi ít nhất có thể kiểm soát thanh ghi tìm kiếm bằng cách thực hiện này:

execute 'let @/ ="' . a:term .'"' 

và sau đó là điều hiển nhiên có vẻ là để làm một:

normal n 

Nhưng điều đó 'n bình thường' không làm bất cứ điều gì nếu tôi chạy nó trong một kịch bản. Đặt thanh ghi tìm kiếm không hoạt động, nếu tôi bấm 'n' theo cách thủ công sau khi tập lệnh chấm dứt tìm kiếm xảy ra (và đánh dấu xuất hiện, vì hlsearch đang bật). Tôi thậm chí không quan tâm nếu con trỏ được định vị, tôi chỉ muốn mẫu đăng ký được đánh dấu. Nhưng các kết hợp khác nhau của 'set hlsearch' trong tập lệnh cũng không hoạt động.

Tôi biết tôi có thể sử dụng 'match()', nhưng tôi muốn làm cho nó hoạt động với đánh dấu tìm kiếm thông thường và tôi tự hỏi mình đang làm gì sai. Nó phải là một cái gì đó đơn giản nhưng tôi không nhìn thấy nó. Cảm ơn vì bất kì sự giúp đỡ.

+0

Tôi đã thử lệnh tìm kiếm của mình. 'execute" normal/^ --- \ "' hoạt động. Nhưng 'thực thi 'bình thường/^ --- \ '' thì không. – ppan

Trả lời

3

Nếu kịch bản của bạn đang sử dụng chức năng, sau đó trích dẫn này từ :help function-search-undo là có liên quan: ""

Các sử dụng mô hình tìm kiếm cuối cùng và lệnh redo sẽ không bị thay đổi bởi hàm. Điều này cũng ngụ ý rằng hiệu quả của: nohlsearch được hoàn tác khi hàm trả về.

Vim thường cố gắng để thiết lập lại mô hình tìm kiếm (và một vài thứ khác) khi một hàm kết thúc, thường bạn có thể làm được việc này bằng cách thêm n (tìm kiếm tiếp theo) vào cuối của một bản đồ, hoặc sử dụng :map <expr> và có chức năng của bạn trả về chuỗi khóa được thực hiện.

1

Khi kiểm tra kỹ hơn, có vẻ như \<CR> không được chọn trong các dấu nháy đơn.Hãy thử sử dụng này để thay thế:

execute 'normal /' . my_variable . "\<CR>" 
+0

Cảm ơn. Tôi khá chắc chắn đó là điều đầu tiên tôi đã thử, và nó không hoạt động. Tôi nghĩ rằng bạn nhận được vấn đề trong câu trả lời khác của bạn, nơi bạn xác định vấn đề với việc sửa đổi mẫu tìm kiếm trong một hàm. Tất cả các lệnh mà tôi gặp vấn đề nằm trong một hàm, vì vậy tôi sẽ kiểm tra nó để xác nhận. –

3

chạy:

hãy @/= a: searchStr

từ bên trong hàm của bạn sau đó chạy

bình thường n

từ bên ngoài chức năng của bạn (bên trong nó không có gì) ví dụ.

command -nargs = * Hs call MySearch() | n bình thường

hoặc bạn có thể sử dụng:

set hlsearch

thay vì bình thường n nếu bạn không muốn con trỏ để di chuyển

(Tôi không thể làm việc ra một cách khác để làm điều này mà không cần phải có thứ gì đó bên ngoài chức năng.)

+0

Tôi đã tìm kiếm điều này cho sooo dài. Một điều khó khăn đối với Google. Câu trả lời của bạn hoạt động hoàn hảo và thực hiện chính xác những gì tôi muốn! – Dan