2009-11-05 39 views
12

Làm cách nào để đảo ngược một từ trong Vim? Tốt hơn với một regex hoặc lệnh bình thường-mode, nhưng các phương pháp khác được hoan nghênh quá:Đảo ngược một từ trong Vim

từ => drow

Nhờ sự giúp đỡ của bạn! PS: Tôi đang ở trong cửa sổ XP

Python được tích hợp sẵn trong vim của tôi chứ không phải Perl.

+0

Tôi thấy chức năng này rất thường xuyên. Chính xác: tại sao bạn cần điều đó? ;) – wishi

+2

Xin chào @wishi_! Bạn gái của tôi có thể đảo ngược từ rất nhanh và tôi muốn kiểm tra nó :-) – Jogusa

Trả lời

2

nếu phiên bản của VIM hỗ trợ nó, bạn có thể làm vw\is hoặc viw\is (đưa con trỏ chuột vào chữ cái đầu tiên của từ trước khi gõ lệnh) ... nhưng tôi đã có rất nhiều vấn đề tương thích với điều đó. Bạn không chắc chắn những gì đã được biên soạn trong hoặc bật nhưng điều này chỉ hoạt động đôi khi.

EDIT:

\is là:

:<C-U>let [email protected]<CR> 
\ :let [email protected]"<CR> 
\ gv"ay :let @a=substitute(@a, '.\(.*\)\@=', '\[email protected][strlen(submatch(1))]', 'g')<CR> 
\ gvc<C-R>a<Esc> :let @a=old_reg_a<CR> 
\ :let @"=old_reg<CR> 

Không nhớ nó đến từ đâu nhưng một tìm kiếm google đến bài viết này trên vim.wikia.com. Trong đó cho thấy điều tương tự vì vậy tôi đoán đó là nó.

+0

Hmm, điều đó dường như không hiệu quả đối với tôi, nếu bạn gõ "map", bạn đã vẽ bản đồ gì? – Benj

4

Giả sử bạn đã có hỗ trợ perl tích hợp sẵn trong vim, bạn có thể làm điều này:

command! ReverseWord call ReverseWord() 
function! ReverseWord() 
perl << EOF 
    $curword = VIM::Eval('expand("<cword>")'); 
    $reversed = reverse($curword); 
    VIM::Msg("$curword => $reversed"); 
    VIM::DoCommand("norm lbcw$reversed"); 
EOF 
endfun 

Và có khả năng liên kết đến một phím tắt như sau:

nmap ,r :ReverseWord<CR> 
+0

Hmm, chỉ nhận ra rằng không hoạt động nếu bạn đang ở trên chữ cái đầu tiên của từ, bạn cần phải được trên hai chữ cái nữa. – Benj

+0

Ok, cố định nó và chỉnh sửa câu trả lời của tôi, về cơ bản cần thiết lbcw không chỉ bcw – Benj

+0

Nó dường như không làm việc cho tôi, có lẽ là perl không được hỗ trợ. Nhưng python được hỗ trợ! Cảm ơn vì nỗ lực của bạn. – Jogusa

1

Nếu bạn có một số thời gian trên tay của bạn, bạn có thể bong bóng theo cách của bạn bằng cách lặp đi lặp lại các ký tự (xp) ...

3

Tôi không có Python hỗ trợ trên VIM của tôi, nhưng có vẻ như nó sẽ khá đơn giản để làm điều đó với Python. This article có vẻ như một lời giải thích tốt về cách sử dụng Python trong VIM và tôi đoán bạn muốn làm một cái gì đó như thế này:

:python 'word'[::-1] 

Bài báo chỉ ra rằng kết quả sẽ xuất hiện trên thanh trạng thái, đó sẽ là phi -optimal nếu bạn đang cố gắng để thay thế các chuỗi trong một tài liệu, nhưng nếu bạn chỉ muốn kiểm tra xem bạn gái của bạn là đúng đảo ngược dây trong đầu của cô, điều này sẽ được tốt.

6

Dưới đây là một (pythonic) giải pháp dựa trên cách làm việc này:

:echo join(reverse(split('hello', '.\zs')), '') 
olleh 

Nếu bạn muốn thay thế tất cả các từ trong bộ đệm,

:%s/\(\<.\{-}\>\)/\=join(reverse(split(submatch(1), '.\zs')), '')/g 

này hoạt động bằng cách trước tiên tạo một danh sách các các ký tự trong từ, được đảo ngược và nối lại để tạo thành từ. Lệnh thay thế tìm mỗi từ và sau đó chuyển từ đó sang các biểu thức và sử dụng kết quả là thay thế.

1

Bạn cũng có thể sử dụng chính python để đảo ngược dòng thông qua lệnh bộ lọc.Giả sử văn bản bạn đã viết là:

Python 

Bạn có thể đảo ngược văn bản bằng cách phát hành.

:1 ! python -c "print raw_input()[::-1]" 

Và văn bản của bạn sẽ được thay thế để trở thành:

nohtyP 

Các "1" trong lệnh nói với vi để gửi dòng 1 để báo cáo kết quả python mà chúng tôi đang thực hiện: "in raw_input() [:: - 1] ". Vì vậy, nếu bạn muốn một số dòng khác đảo ngược, bạn sẽ gửi số dòng đó làm đối số. Câu lệnh python sau đó đảo ngược dòng đầu vào.

0

Nếu bạn đã cài đặt rev (ví dụ: qua MSys hoặc Cygwin) thì điều này thực sự không khó.

Chọn những gì bạn muốn đảo ngược và lọc (%! <cmd>) nó:

:%! rev 

Ống này lựa chọn của bạn để vỏ của bạn trong khi đi qua nó một lệnh.