2013-07-03 50 views
47

Trong vim, tôi biết chúng tôi có thể sử dụng ~ để viết hoa một chữ cái (như được đề cập trong this question), nhưng có cách viết hoa chữ cái đầu tiên của mỗi từ trong lựa chọn bằng cách sử dụng vim?Viết hoa chữ cái đầu tiên của mỗi từ trong một lựa chọn bằng cách sử dụng vim

Ví dụ, nếu tôi muốn thay đổi từ

hello world from stackoverflow 

để

Hello World From Stackoverflow 

Làm thế nào tôi nên làm điều đó trong vim?

Trả lời

103

Bạn có thể dùng thay thế sau:

s/\<./\u&/g 
  • \< phù hợp với sự khởi đầu của một từ
  • . phù hợp với ký tự đầu tiên của một từ
  • \u nói với Vim chữ hoa chữ sau đây trong chuỗi thay thế (&)
  • & có nghĩa là thay thế bất cứ điều gì được kết hợp trên LHS
+2

Cảm ơn bạn rất nhiều, đặc biệt là để giải thích mọi chi tiết! – keelar

+0

@keelar. Bạn đang chào đón :) –

+0

Tôi chỉ cần làm điều này và sử dụng một macro mà tôi lặp đi lặp lại và tôi biết có phải là một số cách tốt hơn nhưng tôi không bao giờ mặc dù regex. Điều đó thật tuyệt. Cảm ơn. –

24

:help case nói:

To turn one line into title caps, make every first letter of a word 
uppercase: > 
    : s/\v<(.)(\w*)/\u\1\L\2/g 

Giải thích:

:      # Enter ex command line mode. 

space     # The space after the colon means that there is no 
         # address range i.e. line,line or % for entire 
         # file. 

s/pattern/result/g  # The overall search and replace command uses 
         # forward slashes. The g means to apply the 
         # change to every thing on the line. If there 
         # g is missing, then change just the first match 
         # is changed. 

Phần mô hình có ý nghĩa này.

\v      # Means to enter very magic mode. 
<      # Find the beginning of a word boundary. 
(.)     # The first() construct is a capture group. 
         # Inside the() a single ., dot, means match any 
         # character. 
(\w*)     # The second() capture group contains \w*. This 
         # means find one or more word caracters. \w* is 
         # shorthand for [a-zA-Z0-9_]. 

Kết quả hoặc một phần thay thế có ý nghĩa này:

\u      # Means to uppercase the following character. 
\1      # Each() capture group is assigned a number 
         # from 1 to 9. \1 or back slash one says use what 
         # I captured in the first capture group. 
\L      # Means to lowercase all the following characters. 
\2      # Use the second capture group 

Kết quả:

ROPER STATE PARK 
Roper State Park 

Một thay thế cho chế độ rất kỳ diệu:

: % s/\<\(.\)\(\w*\)/\u\1\L\2/g 
    # Each capture group requires a backslash to enable their meta 
    # character meaning i.e. "\(\)" verses "()". 
+2

Đây là câu trả lời thú vị nhất đối với tôi. Tôi chưa từng thấy chế độ ma thuật. Tôi nghĩ tôi sẽ ghi lại câu trả lời sau khi tôi hiểu câu trả lời. – Greg

+0

Ngoài ra, câu trả lời này xử lý tất cả các trường hợp thấp hơn, tất cả các trường hợp trên hoặc các chuỗi trường hợp hỗn hợp. – Greg

9

Các Vim Mẹo Wiki có một số TwiddleCase mapping chuyển đổi lựa chọn trực quan thành chữ thường, chữ hoa chữ thường và chữ hoa chữ thường.

Nếu bạn thêm hàm TwiddleCase vào .vimrc, thì bạn chỉ chọn trực quan văn bản mong muốn và nhấn ký tự dấu ngã ~ để quay qua từng trường hợp.

2

Hãy thử regex này ..

s/ \w/ \u&/g 
+0

Tôi thích câu trả lời với việc sử dụng '&' nhưng nó không hoạt động nếu chuỗi chuỗi của bạn là trường hợp hỗn hợp để bắt đầu với hoặc tất cả chữ hoa để bắt đầu. – Greg

1

Ngoài ra còn có các vim-titlecase plugin rất hữu ích cho việc này.

+0

Cảm ơn. Trường hợp tiêu đề thông minh cũng hoạt động tốt cho Văn bản tuyệt vời. https://github.com/mattstevens/sublime-titlecase –