在emacs模式下bash的阅读线上,我最近发现了转置功能,这使我有机会快速修复像

dc dir




的错字通过按c字符上的CTRL + T组合键



Vi / Vim中是否有类似的东西可以让我在周围交换字符和单词?

/>

评论

您当然可以制作一个执行此操作的宏/绑定。 vim.wikia.com/wiki/Reverse_letters是一个例子

#1 楼

对于字符,这非常简单:xp将光标下的字母换成下一个字母,Xp将光标下的字母换成前一个字母。

x命令删除光标,将光标留在下一个字符上。 X命令删除光标之前的字符,而使光标停留在光标所在的位置。

p将(最后粘贴的)最后删除或粘贴的文本放置(粘贴)在当前光标位置之后。 (P将其放置在当前光标位置的前面,因此xPXP都将文本保留为开始之前的样子。)

对于交换单词,我不确定;也许其他人可以回答。您可以接近dawwP(或将其重新映射为更短),但这会在几种边缘情况下中断,例如在行尾附近。

评论


如果可以接受非核心解决方案,那么可以访问github.com/tommcdo/vim-exchange,它不仅可以交换单词,还可以交换整个区域vimcasts.org/episodes/…

– dkns
16年1月24日在5:07

#2 楼

拉丁语言的单词交换映射
Vim Wiki上的单词交换映射不能在带有重音符号的单词上正常运行。
这些映射适用于(欧洲)ISO / IEC_8859-1 Latin-1补充字符。这是通过将\w的所有实例替换为[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]并用\_W的所有实例替换为\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]来实现的。需要时,在每个映射的末尾添加:nohlsearch<return>
这是最终结果:
" 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À-ÖØ-öø-ÿ_\-\`]\+\)//<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À-ÖØ-öø-ÿ_\-\`]\+\)//<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À-ÖØ-öø-ÿ_\-\`]\+\)//<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À-ÖØ-öø-ÿ_\-\`]\+\)//<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À-ÖØ-öø-ÿ_\-\`]\+\)//<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{