2010-02-10 26 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