在vim中,如何分割一个单词并翻转一半? FooBar => BarFoo

时间:2015-06-16 18:53:27

标签: vim

我有时会在一个订单中写一个多字标识符,然后决定其他顺序更有意义。有时会有一个分隔符,有时会出现大小写边界,有时候分离是位置的。例如:

  • $foobar变为$barfoo
  • $FooBar变为$BarFoo
  • $foo_bar变为$bar_foo

我如何在vim中完成此操作?我想把光标放在单词上,按下一个键组合,切断前半部分,然后将它附加到当前单词的末尾。像cw之类的东西,但也会进入切割缓冲区,然后附加到当前单词(例如ea)。

没有任何一般和明显的想法。这是一个比日常实际使用更新颖的问题,但是最好的插件是最短的答案。 (嗯,就像vim代码高尔夫。)

3 个答案:

答案 0 :(得分:3)

您可以使用此功能,它会切换FooBarfoo_barfooBar形式的任何字词:

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;):

  1. 3xep
  2. 3xep(在重新编辑问题之前有一些〜)
  3. 4xea_ [ESC] PX
  4. 我现在最好的。 :)

答案 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