Bagaimana cara membalik karakter atau kata-kata seperti transpos emacs?

10

Pada readline bash dalam mode emacs, saya baru-baru ini menemukan fungsi transpose , memberi saya kesempatan untuk dengan cepat memperbaiki kesalahan ketik seperti

dc dir

untuk

cd dir

dengan menekan CTRL+ Tpada ckarakter.

Apakah ada sesuatu yang serupa di Vi / Vim yang memungkinkan saya bertukar karakter dan kata-kata di sekitar?

k0pernikus
sumber
1
Anda tentu bisa membuat makro / mengikat yang melakukan ini. vim.wikia.com/wiki/Reverse_letters adalah contohnya
fruglemonkey

Jawaban:

13

Untuk karakter, ini cukup sederhana: xpuntuk menukar huruf di bawah kursor dengan huruf berikut, dan Xpuntuk menukar huruf di bawah kursor dengan huruf sebelumnya.

The xperintah menghapus karakter di bawah kursor, meninggalkan kursor pada karakter berikutnya. The Xperintah menghapus karakter sebelum kursor, meninggalkan kursor pada karakter yang sama itu pada.

pmenempatkan (menempel) teks yang terakhir dihapus atau terakhir disentak tepat setelah posisi kursor saat ini. ( Pmenempatkannya tepat sebelum posisi kursor saat ini, jadi xPdan XPkeduanya biarkan teks seperti sebelum Anda mulai.)

Untuk bertukar kata, saya tidak yakin; mungkin orang lain bisa menjawabnya. Anda dapat mendekati dawwP(atau memetakannya menjadi lebih pendek) tetapi itu akan pecah pada beberapa kasus tepi, misalnya di dekat ujung garis.

Wildcard
sumber
2
Jika solusi non-inti dapat diterima maka ada github.com/tommcdo/vim-exchange yang memungkinkan Anda tidak hanya bertukar kata, tetapi juga seluruh wilayah vimcasts.org/episodes/…
dkns
2

Pemetaan pertukaran kata untuk bahasa Latin

Pemetaan kata swap dari Vim wiki tidak akan beroperasi dengan benar pada kata-kata dengan karakter beraksen.

Pemetaan ini disesuaikan untuk bekerja dengan karakter Suplemen ISO-IEC_8859-1 (Eropa) Latin / 1 . Ini dilakukan dengan mengganti semua instance \wdengan [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]dan semua instance \_Wdengan \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Menghapus sorotan pencarian

Selanjutnya, sorotan pencarian dihapus jika diperlukan. Ini dicapai dengan menambahkan :nohlsearch<return>pada akhir setiap pemetaan bila diperlukan.

Inilah hasil akhirnya:

" 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{
Serge Stroobandt
sumber