Làm cách nào tôi có thể chuyển đổi từ thành camelCase trong macro?


14

Tôi có một danh sách các từ, như thế này:

these are
some
words that I want
to convert to
camel case

Tôi cần một cách để biến, ví dụ, camel casevào camelCasetrong một macro (hay một cách để biến mỗi dòng của một lựa chọn dòng hình ảnh vào trường hợp lạc đà).

Tôi có thể sử dụng một cái gì đó wgUlhxnhiều lần nếu cần thiết, nhưng vấn đề là nó không hoạt động đối với các từ có độ dài khác nhau (ví dụ, vì vậy, wgUlhxwgUlhxsẽ hoạt động convert this pleasenhưng không phải cho convert these pretty please).

Đầu ra mong muốn cho các dòng trên sẽ là

theseAre
some
wordsThatIWant
toConvertTo
camelCase

Có cách nào để tự động hóa điều này?

Câu trả lời:


16

Một lót

Tôi tìm thấy một thay thế biểu thức chính quy đơn giản (giả sử 'ma thuật' được đặt):

:s/ \([a-zA-Z]\)/\u\1/g

Điều này phù hợp với bất kỳ chữ cái nào sau một khoảng trắng, lưu chữ cái. Sau đó, nó thay thế nó bằng chữ cái đã lưu được viết hoa ( \u= chữ hoa, \1= trận đấu được lưu đầu tiên), cho mọi trận đấu trong dòng.

Áp dụng trên toàn bộ tập tin bằng cách đặt %giữa :s.

Nhược điểm của giải pháp này là nó thẳng hàng (hoạt động cho các ví dụ của bạn), nhưng sẽ bị thiếu nếu bạn chỉ muốn lạc đà một vài từ trong số nhiều từ trong một dòng.

Một giải pháp đầy đủ hơn

map <leader>g~ :set opfunc=MyCamelCase<CR>g@
function! MyCamelCase(type, ...)
  let searchsave=@/
    silent s/\%>'\[ \([a-zA-Z]\)\%<']/\u\1/g
  let @/=searchsave
 endfunction

Điều này tạo ra một toán tử mới có thể hoạt động trên một chuyển động. Nếu bạn có <leader>as \, thì đưa ra văn bản sau (với |con trỏ):

This is some |example text to work with.

Đánh máy \g~3wcho

This is some exampleTextTo work with.

Đó là, chúng tôi lạc đà vỏ bọc hơn 3 từ.

Mô tả về sự thay thế đó:

s/bắt đầu thay thế.
\%>'\[là một chút đau đớn. Các \%>'mnói để phù hợp với bên phải của một nhãn hiệu. Chúng tôi muốn đánh dấu [, nhưng điều đó cũng phải được thoát trong mô hình này. Vì vậy, điều này bắt đầu trận đấu sau khi chuyển động được đưa ra cho người vận hành.
\([a-zA-Z\)là giống như từ một lớp lót ở trên.
\%<']đây là đầu kia, khớp trước khi kết thúc chuyển động.
/\u\1/glà sự thay thế từ một lớp lót ở trên.


Trên thực tế, đó không phải là một macro quá nhiều vì nó là một lớp lót, nhưng bạn có thể ánh xạ nó tới một tổ hợp phím.
John O'M.

Đã thêm một phiên bản toán tử để làm điều đó. Hoạt động tốt hơn một chút.
John O'M.

Tôi nghĩ sẽ ổn nếu câu trả lời của bạn không đặc biệt sử dụng macro; người hỏi trình bày một vấn đề XY , theo ý kiến ​​của tôi.
tommcdo

@tommcdo Vâng, bạn nói đúng; nó không phải là một macro thực tế. Nó chỉ cần là một loại phương pháp tự động.
Doorknob

12

Để thay thế, tôi sử dụng plugin vim-abolish cung cấp tính năng cưỡng chế:

Muốn biến fooBarthành foo_bar? Nhấn crs(ép buộc vào sn_case). MixedCase ( crm), camelCase ( crc), Snake_case ( crs) và UPPER_CASE ( cru) chỉ cách 3 lần nhấn phím. Các lệnh này hỗ trợ repeat.vim .


2
+1 vì luôn có plugin của Tim Pope mà tôi không biết.
zool

5

Bạn có thể tạo một macro đệ quy thực hiện điều này cho một dòng với các tổ hợp phím sau:

qqqqqf xgUl@qq

(Lưu ý rằng khoảng cách giữa fxlà một lần nhấn của phím cách, không phải là tạm dừng)

Chi tiết:

  1. Xóa sổ đăng ký q. Điều này là cần thiết bởi vì chúng tôi đang tạo ra một macro đệ quy. (Xem bước 5.):qqq

  2. Bắt đầu ghi một macro trong thanh ghi q: qq

  3. Bạn không thể sử dụng wchuyển động ở đây, vì bạn muốn macro hủy bỏ khi đến cuối dòng, thay vì nhảy sang dòng tiếp theo. Thay vào đó, hãy nhảy đến ký tự khoảng trắng tiếp theo trên dòng bằng cách bấm fphím theo sau là phím cách:f<space>

  4. Xóa khoảng trắng và viết hoa chữ cái sau: xgUl

  5. Tái diễn. Bởi vì chúng tôi đã xóa sổ qđăng ký ở bước 1, nên vẫn chưa có gì trong đó, vì vậy điều này sẽ không làm gì:@q

  6. Lưu macro: q

Sau đó, bạn có thể áp dụng macro này cho nhiều dòng bằng cách sử dụng một phạm vi:

Áp dụng macro cho mọi dòng trong tệp:

:%normal @q

Áp dụng macro cho các dòng 2

:2,5normal @q

Thực hiện một lựa chọn trực quan, và sau đó gõ :normal @q. Điều này sẽ điền trước dòng lệnh khi bạn nhấn :phím, dẫn đến một lệnh áp dụng macro cho mọi dòng trong lựa chọn:

:'<,'>normal @a

Không cần thiết phải xóa qsổ đăng ký, cũng như qqvậy trước khi bắt đầu ghi lại các lần nhấn phím. Trên thực tế, đó chính xác là lý do tại sao qqqhoạt động để xóa qsổ đăng ký :)
tommcdo

Tất nhiên, nếu bạn đang làm một cái gì đó yêu cầu gắn vào thanh qghi (tức là sử dụng qQ) thì việc xóa nó trước có lẽ là cần thiết.
tommcdo

2
@tommcdo Điều đó chắc chắn không đúng trong bản sao Vim của tôi. (Vim 7.3.87, được gọi với vim -u NONE). Do đó, các nội dung hiện có chỉ bị xóa khi bạn lưu sổ đăng ký, trong bước 6. Xóa sổ đăng ký trước khi bạn bắt đầu là cần thiết nếu bạn muốn lặp lại.
Giàu

@tommcdo Tôi đã cập nhật câu trả lời để làm rõ hơn lý do tại sao bước này là cần thiết.
Giàu

Sai lầm của tôi, tôi đã nhảy súng ở đó. Làm rõ tuyệt vời!
tommcdo

1

Xem http://vim.wikia.com/wiki/Changing_case_with_THER_expressions Nó giải thích các sửa đổi \ U, \ L, \ u, \ l khá rõ ràng và ngắn gọn!

Bản chất của nó là như sau:

Đôi khi bạn có thể muốn xem qua một tệp và thay đổi trường hợp các ký tự khớp với một số tiêu chí tùy ý. Nếu bạn hiểu rõ các biểu thức chính quy, bạn thực sự có thể làm điều này khá dễ dàng.

Nó đơn giản như đặt \ U hoặc \ L trước các phản hồi mà bạn muốn thay đổi trường hợp và \ E ở cuối. Vim sẽ làm cho văn bản trong chữ hoa hoặc chữ thường (tương ứng). Sử dụng \ u và \ l (không có \ E ở cuối) để chỉ thay đổi trường hợp của ký tự đầu tiên trong phản hồi.

("Phản hồi" là một phần của biểu thức chính quy đề cập đến phần trước của biểu thức chính quy. Các phản hồi phổ biến nhất là &, \ 1, \ 2, \ 3, ..., \ 9).

Một số ví dụ chứng minh sức mạnh của kỹ thuật này:

Viết thường toàn bộ tập tin

:% s /.*/ \ L & / g

(& là một phản hồi tiện dụng đề cập đến văn bản đầy đủ của trận đấu.)

Viết hoa tất cả các từ đứng trước <(nghĩa là mở tên thẻ HTML):

:%s/<\(\w*\)/<\U\1/g

Cũng lưu ý các lệnh gu và gU.

Ví dụ, ggguG sẽ viết thường toàn bộ tệp. (gg = lên đầu, gu = chữ thường, G = chuyển đến EOF).

Bằng cách sử dụng \ 0 backref chung thay vì tên (\ 1, \ 2, v.v.), bạn có thể lưu một số cách gõ để thay thế khổ thơ của regex.

Regex này viết hoa một tập hợp các từ rõ ràng thành chữ hoa trong một tệp:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\0/g

Không phải khoa học tên lửa, nhưng nếu không, bạn sẽ phải làm điều này:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\1\U\2\U\3\U\4\U\5/g

1
Bạn có thể vui lòng tóm tắt bài viết bạn đề cập trong câu trả lời của bạn?
EvergreenTree

Hẹn gặp lại Điều này rất quan trọng, nếu câu trả lời liên kết đơn sẽ ổn, vài năm sau trang web này sẽ đầy với các liên kết bị xóa. Nhưng nếu bạn chỉ sao chép một phần quan trọng của liên kết mà bạn giới thiệu cũng cung cấp liên kết nơi OP có thể nhận thêm thông tin, thì không sao.
peterh - Phục hồi Monica
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.