2010-02-10 27 views
9

我经常使用 + Ĵ在视觉模式下加入几个选择的线与由空格分隔原线一条线。但我想知道是否有一个相反的快捷方式,它将拆分选定的单词分成不同的行(每行一个字)。Vim:分词成行?

我当然可以这样做:

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

但东西按键方面更加简洁是非常有用的。有没有人找到了一种方法来做到这一点?

由于提前,

-AJ

+1

可能只是它映射到一些快捷方式... – tristan 2010-02-10 02:36:06

+1

如果光标定位在要以一个换行符替换空间,单曲^ M^['。 ':call setline('。',split(getline(')。')))'会将当前行按空格分割并将其分解为多行。但是,这些都不完全符合你的要求;为此,我想不出比现在更好的东西,除了可能绑定@michael和@Tristan建议的捷径。 – ephemient 2010-02-10 02:55:02

+0

相关:'r '是内置2键击方式来插入换行符来代替空白字符。像这样更复杂的映射等待在[Insertlessly.vim](https://github.com/dahu/Insertlessly)。 – 2013-01-18 13:46:32

回答

4

地图,如果你经常使用它在你的〜/ .vimrc文件或类似

vnoremap \ll :'<,'>s/ /^M/g<cr> 
nnoremap \ll :s/ /^M/g<cr> 

,如果你只想要它多次现在你可以使用&命令重复上次搜索也

Theres也gqq,但这是为textwidth例如80个字符

+0

对于视觉选择的单词,这可能应该是'vnoremap'。 – 2010-02-10 02:36:25

+0

ahh true我没有注意到<> – michael 2010-02-10 02:41:04

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我觉得没有必要)。还要注意,通过添加一个额外的参数,这个参数也可以被'分割'使用,你可以有一个函数在特定模式(而不是仅仅是空白)上分割线。

1

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

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

它映射CTRL-J做加入的相反,我认为它是反加入:)我主要用它来转换K & R风格vs另一种花括号的位置。

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