Vim:分裂成行?

时间:2010-02-10 02:21:48

标签: vim keyboard-shortcuts

我经常在视觉模式下使用 Shift + J 连接几条选定的线条合并成一条线,原始线条用空格分隔。但是我想知道是否有相反的快捷方式,它会将分割选定的单词分成不同的行(每行一个单词)。

我当然能做到:

:'<,'>s/ /^M/g

但是在按键方面更简洁的东西会非常有用。还有其他人找到了办法吗?

提前致谢,

-AJ

3 个答案:

答案 0 :(得分:4)

如果您经常在〜/ .vimrc文件或类似的

中使用它,请将其映射
vnoremap \ll :'<,'>s/ /^M/g<cr>
nnoremap \ll :s/ /^M/g<cr>

如果您只想多次使用它现在可以使用&amp;命令重复上次搜索

Theres也是gqq,但那是文本宽度,例如80个字符

答案 1 :(得分:3)

最近我偶然发现了同样的问题。我的解决方案是以下vim函数(放在我的.vimrc中):

function SplitToLines() range
  for lnum in range(a:lastline, a:firstline, -1)
    let words = split(getline(lnum))
    execute lnum . "delete"
    call append(lnum-1, words)
  endfor
endfunction

这可以与行范围一起使用,例如,如下

:26call SplitToLines()

它会拆分第26行。但是代码也可以优雅地处理行的范围(这就是为什么for循环中的范围以相反的顺序构建)。

1,10call SplitToLines()

将第1行到第10行分成几行。但是,我主要在视觉模式下使用它,比如

'<,'>call SplitToLines()

分割所有可视标记的行。当然你可以为这个函数调用定义一些单字母缩写(通过 Tab 自动完成我觉得没必要)。另请注意,通过添加“split”也可以使用的附加参数,您可以使用一个函数来分割特定模式(而不仅仅是空格)。

答案 2 :(得分:1)

我在我的配置中使用它来取消加入/拆分当前行的最后一个字:

nnoremap <C-J> g_F<Space><Space>i<CR><Esc>k

它将CTRL-j映射到Join的反面,我把它想象为Counter-Join :)我主要使用它来转换K&amp; R样式与...另一种花括号放置。

g_       : search for the last non-whitespace on current line
F<Space> : reverse-find first space
<Space>  : go one character forward
i        : enter insert mode
<CR>     : insert a line break
<Esc>    : return to normal mode
k        : go up one line to where we begun