2012-12-18 34 views
7

Tôi có một tệp cú pháp Vim rất đơn giản cho các ghi chú cá nhân. Tôi muốn làm nổi bật tên của mọi người và tôi đã chọn một cú pháp giống như Twitter @jonathan.Làm cách nào để đánh dấu các từ bắt đầu bằng cú pháp @ trong Vim?

tôi đã cố gắng:

syntax match notesPerson "\<@\S\+" 

Để có nghĩa là: từ bắt đầu bằng @ và có ít nhất một nhân vật phi khoảng trắng. Vấn đề là @ dường như là một ký tự đặc biệt trong biểu thức chính quy Vim.

Tôi đã cố gắng thoát khỏi \@ và đính kèm trong ngoặc đơn [@], các thủ thuật thông thường, nhưng điều đó không hiệu quả. Tôi có thể thử một cái gì đó như (^|\s) (đầu dòng hoặc khoảng trắng) nhưng đó chính xác là vấn đề mà ranh giới từ cố gắng giải quyết.

Làm nổi bật trên các biểu thức chính quy được đơn giản hóa, do đó, đây là câu hỏi tìm kiếm đúng regex hơn bất kỳ điều gì khác. Tôi đang thiếu gì?

+0

Tại sao bạn đã thoát khỏi '+' trong '\ S \ +'? Hãy thử '@ \ S +' hoặc '\ @ \ S +', nếu '@' được coi là ký tự đặc biệt trong 'vim'. Tôi không biết về điều đó. –

+0

@RohitJain Vì cú pháp vim bắt nguồn từ BRE. Nó phải được trốn thoát để trở nên đặc biệt. – ZyX

+0

@ZyX .. Oh! Tôi không biết điều đó. Cảm ơn :) –

Trả lời

13

@ là ký tự đặc biệt chỉ khi bạn đã bật chế độ "rất kỳ diệu" bằng cách đặt \v theo mẫu trước @. Bạn có một vấn đề khác ở đây: @ không bắt đầu từ mới. \< không chỉ là “ranh giới từ” như perl/PCRE \b, nhưng “còn lại ranh giới từ” (trong trợ giúp: “bắt đầu từ”) có nghĩa là sau \< phải tuân theo một số ký tự từ khóa. Vì @ thường không phải là một mẫu ký tự từ khóa \<@ sẽ không bao giờ khớp (và thậm chí nếu giống như \b, nó sẽ khớp với các cấu trúc như [email protected] mà chắc chắn không phải là thứ bạn muốn: vì lý do tôi đã giải thích trước đây).

Bạn nên sử dụng \k\@<[email protected]\k\S* thay vì: \k\@<! đảm bảo rằng @ không trước bởi bất kỳ ký tự từ khóa, \k\S* đảm bảo rằng nhân vật đầu tiên của tên là một từ khóa một (bạn có thể có lẽ cũng sử dụng @\<\S\+).

Có một giải pháp khác: bao gồm @ vào 'iskeyword' tùy chọn và để lại regex như-là:.

setlocal [email protected]@ 

(thấy :h 'isfname' để giải thích lý do tại sao tôi sử dụng @[email protected] đây 'iskeyword' có chính xác cùng một cú pháp và sẽ chuyển hướng bạn ở đó để giải thích.)

+0

Hoạt động tuyệt vời! Cảm ơn vì lời giải thích chi tiết. – jpalardy

Các vấn đề liên quan