16

Emacs 有一个有用的transpose-words命令,它可以让用户将光标前的单词与光标后的单词交换,同时保留标点符号。

例如,'<code>stack |overflow' + Mt = '<code>overflow stack|' ('<code>|' 是光标位置)。

<a>|<p>变成<p><a|>.

是否可以在 Vim 中模拟它?我知道我可以使用dwwP,但它不适用于标点符号。

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

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

Emacs 的 Mt 将交换bc,从而产生(a)(c)(b).

有效的是/\w yiwNviwpnviwgp。但它破坏"""/。有更清洁的解决方案吗?

更新²:

解决了

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

不完美,但有效。

感谢 Camflan 让%#我注意到这个项目。当然,这一切都在wiki上,但我没有意识到它可以解决该功能的精确(Emacs 完全正确)重复的问题transpose-words

4

6 回答 6

7

这些来自我的 .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*
于 2008-09-26T20:38:07.773 回答
5

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

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

于 2008-09-26T19:33:21.203 回答
5

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

dw wP

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

2dw bhP

从方便的 VIM 和 Emacs 命令等效


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

map L dwwP
map M 2dwbhP 

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

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

于 2008-09-26T19:40:48.037 回答
2

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

它的工作原理几乎与 emacs 的“转置词”类似,只是当无法转置时,它什么也不做。(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>
于 2012-09-20T12:09:05.697 回答
0

正如 Mark 和 CapnNefarious 所说,您可以使用 dwwP 或 dWwP,但我有一些自己的笔记:

  • 如果光标在第二个单词的第一个字母上,如您给出的示例所示,则可以使用 dwbP (或 dWbP 处理标点符号);
  • 如果光标在单词的中间,可以使用 dawbP/daWbP。
于 2008-09-26T19:51:43.143 回答
0

vim.org 上有一个transpose-words 脚本,效果很好。

于 2019-06-26T13:22:14.680 回答