Làm cách nào để lật các ký tự hoặc từ như chuyển vị của emacs?


10

Trên đường đọc của bash ở chế độ emacs, gần đây tôi đã phát hiện ra chức năng chuyển vị , cho tôi cơ hội để nhanh chóng sửa lỗi chính tả như

dc dir

đến

cd dir

bằng cách nhấn CTRL+ Tvào cký tự.

Có cái gì tương tự trong Vi / Vim cho phép tôi hoán đổi các ký tự và từ xung quanh không?


1
Bạn chắc chắn có thể tạo một macro / ràng buộc thực hiện điều này. vim.wikia.com/wiki/Reverse_letters là một ví dụ
fruglemonkey

Câu trả lời:


13

Đối với các ký tự, khá đơn giản: xphoán đổi chữ cái dưới con trỏ bằng chữ cái sau và Xphoán đổi chữ cái dưới con trỏ bằng chữ cái trước.

Các xlệnh xóa ký tự nằm dưới con trỏ, để lại con trỏ trên ký tự tiếp theo. Các Xlệnh xóa nhân vật ngay trước khi con trỏ, để lại con trỏ trên nhân vật cùng nó đã được trên.

pđặt (dán) văn bản đã bị xóa cuối cùng hoặc bị xóa cuối cùng ngay sau vị trí con trỏ hiện tại. ( Pđặt nó ngay trước vị trí con trỏ hiện tại, xPXPcả hai đều để nguyên văn bản như trước khi bạn bắt đầu.)

Đối với các từ hoán đổi, tôi không chắc chắn; có lẽ người khác có thể trả lời điều đó Bạn có thể đến gần dawwP(hoặc ánh xạ lại để ngắn hơn) nhưng điều đó sẽ phá vỡ trên một số trường hợp cạnh, ví dụ gần cuối dòng.


2
Nếu giải pháp không cốt lõi là chấp nhận được thì có github.com/tommcdo/vim-exchange mà cho phép của bạn không chỉ trao đổi những lời mà còn cả khu vực vimcasts.org/episodes/...
dkns

2

Ánh xạ hoán đổi từ cho các ngôn ngữ Latinh

Ánh xạ hoán đổi từ từ wiki Vim sẽ không hoạt động chính xác trên các từ có ký tự có dấu.

Các ánh xạ này được điều chỉnh để hoạt động với các ký tự Bổ sung ISO / IEC_8859-1 Latin-1 (Châu Âu) . Điều này được thực hiện bằng cách thay thế tất cả các trường hợp \wvới [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]và tất cả các trường hợp \_Wbằng \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Xóa đánh dấu tìm kiếm

Hơn nữa, đánh dấu tìm kiếm được xóa khi cần thiết. Điều này đạt được bằng cách thêm :nohlsearch<return>vào cuối mỗi ánh xạ khi cần thiết.

Đây là kết quả cuối cùng:

" Use gc to swap the current CHARACTER with the next, WITHOUT changing the cursor position.
nnoremap <silent> gc xph

" Use gw to swap the current WORD with the next, WITHOUT changing the cursor position.
nnoremap <silent> gw "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>

" Disable Alt+[menukey] menu keys (i.e. Alt+h for help)
set winaltkeys=no

" Use Alt + ← or Alt + h to swap the current WORD with the previous, keeping the cursor on the current word. This feels like "PUSHING" the word to the left.
nnoremap <silent> <A-Left> "_yiw?[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]\+\%#<CR>:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>
nnoremap <silent> <A-h>    "_yiw?[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]\+\%#<CR>:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>
" <A-h> corresponds to è

" Use Alt + → or Alt + l to swap the current WORD with the next, keeping the cursor on the current word. This feels like "PUSHING" the word to the right.
nnoremap <silent> <A-Right> "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o>/[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+<CR><c-l>:nohlsearch<return>
nnoremap <silent> <A-l>     "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o>/[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+<CR><c-l>:nohlsearch<return>
" <A-l> corresponds to ì

" Use g{ to swap the current PARAGRAPH with the next.
nnoremap g{ {dap}p{
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.