如何翻转字符或类似emacs的单词的单词?


10

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

dc dir

cd dir

通过在字符上按CTRL+ 。Tc

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


1
您当然可以创建一个宏/绑定来执行此操作。 vim.wikia.com/wiki/Reverse_letters是一个例子
fruglemonkey '16

Answers:


13

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

x命令删除光标下的字符,将光标留在下一个字符上。该X命令删除光标之前的字符,使光标停留在与原来相同的字符上。

p在当前光标位置之后放置(粘贴)最后删除或最后选中的文本。(P把它刚好在当前光标所在位置,所以xPXP两个假的文本你开始之前,它的方式。)

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


2
如果可以接受非核心解决方案,则可以使用github.com/tommcdo/vim-exchange,它不仅可以交换单词,还可以交换整个区域vimcasts.org/episodes/…–
dkns

2

拉丁语言的单词交换映射

Vim Wiki上的单词交换映射在带有重音字符的单词上无法正确运行

这些映射适用于使用(欧洲)ISO / IEC_8859-1 Latin-1补码字符。这可以通过替换\wwith的[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]所有实例和\_Wwith的所有实例来完成\_[^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À-ÖØ-öø-ÿ_\-\`]\+\)/\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{
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.