我有时会在一个订单中写一个多字标识符,然后决定其他顺序更有意义。有时会有一个分隔符,有时会出现大小写边界,有时候分离是位置的。例如:
$foobar
变为$barfoo
$FooBar
变为$BarFoo
$foo_bar
变为$bar_foo
我如何在vim中完成此操作?我想把光标放在单词上,按下一个键组合,切断前半部分,然后将它附加到当前单词的末尾。像cw
之类的东西,但也会进入切割缓冲区,然后附加到当前单词(例如ea
)。
没有任何一般和明显的想法。这是一个比日常实际使用更新颖的问题,但是最好的插件是最短的答案。 (嗯,就像vim代码高尔夫。)
答案 0 :(得分:3)
您可以使用此功能,它会切换FooBar
,foo_bar
或fooBar
形式的任何字词:
function! SwapWord()
" Swap the word under the cursor, ex:
" 'foo_bar' --> 'bar_foo',
" 'FooBar' --> 'BarFoo',
" 'fooBar' --> 'barFoo' (keeps case style)
let save_cursor = getcurpos()
let word = expand("<cword>")
let match_ = match(word, '_')
if match_ != -1
let repl = strpart(word, match_ + 1) . '_' . strpart(word, 0, match_)
else
let matchU = match(word, '\u', 1)
if matchU != -1
let was_lower = (match(word, '^\l') != -1)
if was_lower
let word = substitute(word, '^.', '\U\0', '')
endif
let repl = strpart(word, matchU) . strpart(word, 0, matchU)
if was_lower
let repl = substitute(repl, '^.', '\L\0', '')
endif
else
return
endif
endif
silent exe "normal ciw\<c-r>=repl\<cr>"
call setpos('.', save_cursor)
endf
映射示例:
noremap <silent> gs :call SwapWord()<cr>
答案 1 :(得分:1)
您是在谈论单个实例,在整个文件中进行全局讨论还是通常?
我倾向于进行全局搜索和替换,例如:
:1,$:S / $ foobar的/ $ barfoo /克
(对于所有行,将$ foobar更改为$ barfoo,每行上的每个实例)
编辑(单次出现,光标位于&#39; f&#39;):
我现在最好的。 :)
答案 2 :(得分:1)
nnoremap <Leader>s dwbP
使用Leader,s现在可以正常工作。
dw : cut until the end of the word from cursor position
b : move cursor at the beginning of the word
P : paste the previously cut part at the front
虽然最后一个例子不适用,但你必须添加另一个映射来处理_。
(如果您不知道Leader是什么,请参阅:help mapleader
)