Emacs有一个有用的 transpose-words 指令,它可以让一个交换一词之前的标词之后,保留的标点符号。

例如,'stack |overflow'+M-t='overflow stack|’ (‘|'是光标的位置)。

<a>|<p> 变得 <p><a|>.

是否有可能仿效它在Vim?我知道我可以使用 dwwP, 但它不工作,以及与标点符号。

更新: 没有, dwwP真的 不是一个解决方案。想象一下:

SOME_BOOST_PP_BLACK_MAGIC( (a)(b)(c) )
//             with cursor here ^

Emacs'M-t会已经交换了 bc, ,导致 (a)(c)(b).

什么样的作品是 /\w yiwNviwpnviwgp.但是,它败坏了 """/.是有一个更清洁的解决方案吗?

Update2:

解决了

:nmap gn :s,\v(\w+)(\W*%#\W*)(\w+),\3\2\1\r,<CR>kgJ:nohl<CR>

不完美的,但工作。

谢谢Camflan带来的 %# 项目要我的注意。当然,这是所有的 维基, 但我没意识到它可以解决的问题 确切的 (Emacs得到了完全的权利)的重复 transpose-words 功能。

有帮助吗?

解决方案

这些来自我的.vimrc,对我来说效果很好。

" swap two words
:vnoremap <C-X> <Esc>`.``gvP``P
" Swap word with next word
nmap <silent> gw    "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<cr><c-o><c-l> *N*

其他提示

根据具体情况,您可以使用W或B命令,如dWwP中所示。 “资本”版本跳到下一个/上一个空格,包括标点符号。 f和t命令也可以帮助指定已删除范围的结束。

还有关于各种交换技术的 Vim Tips Wiki 的讨论。

在一行中间,转到第一个单词的第一个字母,然后执行

dw wP

在一行的末尾(即该行的最后两个单词),转到单词之间的空格并执行

2dw bhP

来自方便的 VIM的等效性&amp; Emacs命令


您可以通过在vimrc文件中添加以下内容来为这些添加快捷键:

map L dwwP
map M 2dwbhP 

在这种情况下,SHIFT-L(在命令模式下)会切换行中间的单词,SHIFT-M会在结尾处进行切换。

注意:这对空格分隔的单词效果最好,并且不能很好地处理OP的特定情况。

http://vim.wikia.com/wiki/VimTip10 上有提示。但我选择自己动手。 我的代码段比提示中提到的方法有两个明显的优点:1)当光标不在单词中时,它可以工作。 2)它不会高亮显示整个屏幕。

它的工作方式几乎与emacs'transpose-words'一样,只是当转换不可能时,它什么都不做。 (emacs'transpose-words'会闪烁并将光标位置更改为当前单词的开头。)

"transpose words (like emacs `transpose-words')
function! TransposeWords()
    if search('\w\+\%#\w*\W\+\w\+')
    elseif search('\w\+\W\+\%#\W*\w\+')
    endif
    let l:pos = getpos('.')
    exec 'silent! :s/\(\%#\w\+\)\(\W\+\)\(\w\+\)/\3\2\1/'
    call setpos('.', l:pos)
    let l:_ = search('\(\%#\w\+\W\+\)\@<=\w\+')
    normal el
endfunction

nmap <silent> <M-right> :call TransposeWords()<CR>
imap <silent> <M-right> <C-O>:call TransposeWords()<CR>

你可以使用dwwP或dWwP作标记和CapnNefarious已经说过,但我有几个笔记我自己的:

  • 如果标是在第一个字母的第二个词,例如您了,您可以使用dwbP(或dWbP处理的标点符号);
  • 如果标是在中间的字,你可以使用dawbP/daWbP.

vim.org上有一个 transpose-words脚本工作得非常好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top