Viết hoa chữ cái đầu tiên của mỗi từ trong một lựa chọn bằng vim


82

Trong vim, tôi biết chúng ta có thể sử dụng ~để viết hoa một ký tự (như đã đề cập trong câu hỏi này ), nhưng có cách nào để 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 không?

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

hello world from stackoverflow

đến

Hello World From Stackoverflow

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


1
Cũng có thể được thực hiện với sed
jpaugh

Câu trả lời:


173

Bạn có thể sử dụng thay thế sau:

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

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

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 quá nhiều lần và tôi biết phải có một số cách tốt hơn nhưng tôi chưa bao giờ sử dụng regex. Điều đó thật tuyệt. Cảm ơn.
Isaac Nequittepas

4
để làm điều đó trong toàn bộ tập tin%s/\<./\u&/g
Gabriel Borges Oliveira

51

: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 trình:

:                      # 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ẫu 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_].

Phần kết quả hoặc phần thay thế có ý nghĩa sau:

\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 "()".

3
Đây là câu trả lời thú vị nhất đối với tôi. Tôi chưa bao giờ thấy chế độ kỳ diệu. 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

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

câu trả lời này là MVP
New Alexandria

12

Wiki Mẹo Vim có ánh xạ TwiddleCase chuyển đổi lựa chọn hình ảnh thành chữ thường, trường hợp LÊN và trường hợp tiêu đề.

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


2

Hãy thử regex này ..

s/ \w/ \u&/g

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à chữ hoa hỗn hợp để bắt đầu với hoặc tất cả các chữ hoa để bắt đầu.
Greg

2

Tùy chọn 1. - Ánh xạ này ánh xạ phímqđể viết hoa chữ cái ở vị trí con trỏ, và sau đó nó di chuyển đến đầu từ tiếp theo:

: map q gUlw

Để sử dụng, hãy đặt con trỏ ở đầu dòng và nhấn qmột lần cho mỗi từ để viết hoa chữ cái đầu tiên. Nếu bạn muốn giữ nguyên chữ cái đầu tiên, hãy nhấn wđể chuyển sang từ tiếp theo.

Tùy chọn 2. - Ánh xạ này ánh xạ phímqđể đảo ngược chữ cái ở vị trí con trỏ, và sau đó nó di chuyển đến đầu từ tiếp theo:

:map q ~w

Để sử dụng, hãy đặt con trỏ ở đầu dòng nhấn qmột lần cho mỗi từ để đảo ngược chữ cái đầu tiên. Nếu bạn muốn giữ nguyên chữ cái đầu tiên, hãy nhấn wđể chuyển sang từ tiếp theo.

Unmap ánh xạ. - Để hủy bản đồ (xóa) ánh xạ được gán choqkhóa:

:unmap q

Tại sao lại là ánh xạ chứ không phải macro thực tế? qq~wqvà phát lại với @qtheo sau bởi @@?
D. Ben Knoble

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.