2012-06-14 48 views
23

下面的問題與將Vim中的文本複製到其他內容(比如Web瀏覽器)有關。在vim中展開文本

我編輯文件時通常會有tw=80選項,特別是LaTeX文件。但是,假設我想用tw=80選項在Vim中撰寫電子郵件,然後我想將其複製並粘貼到Web瀏覽器。在複製和粘貼之前,我想打開文本,以便每隔80個字符就不會出現換行符。我嘗試過tw=0,然後gq,但這只是將文本包裝爲80個字符的默認寬度。我的問題是,如何解開文本,以便我的電子郵件的每個段落都顯示爲單行?有一個簡單的命令嗎?

回答

39

轉到你開始一段,然後輸入:

v p Ĵ

對於整個文檔與規範結合起來:

:%norm vipJ 

該命令將只展開段落。我想這是你想要的行爲。

+0

謝謝!我想這是最簡單的方法呢?我認爲這對於整個文檔都沒有影響嗎? – Ray

+2

@Ray我編輯了我的答案並添加了對整個文檔執行的命令。 –

+1

在這種情況下,最好在'''-specifier'中使用':normal'命令以避免與自定義映射發生衝突。 –

10

由於使用正常模式命令加入段落行已經被 覆蓋了另一個答案,讓我們考慮通過 面向行的Ex命令解決同一問題。

假設光標位於段落的第一行。然後到 解開它,人們可以簡單地加入下一行,直到最後一行 那一段。一個方便的方法是運行:join命令 正是爲此目的而設計的。要定義 命令的行範圍,除了當前行的明顯起始行外,還需要 來指定結束行。可以使用 匹配段落的最後一個,即換行符 後面的空行來找到它。因此,翻譯說,定義爲EX-命令語法,我們 獲得:

:,-/\n$/j 

對於所有段落被解開,就 每個段落的首行運行此命令。一個有用的工具來跳過它們,重複給定的 操作順序是:global命令。由於:global掃描行從 從上到下,段落的第一行只是其餘未處理的行中的第一個非空行 。這個觀察結果給我們提供了命令

:g/./,-/\n$/j 

它比它的簡單正常模式對應物更有效率。

+0

這個命令有一個小錯誤:如果你有一行的段落,它會粘到下一段的開始。 –

+1

@奧馬爾:非常棒,謝謝!答案已經更新,以解決這種情況。 –

+0

我在@ fatih的回答中是這麼做的,但由於某些原因,將很短的段落連接在一起,所以我來到這裏尋找替代品,這很好,謝謝! – dbmrq

4

:%norm vipJ的問題在於,如果連續行少於80個字符,它們也會加入它們,即使它們被空行分隔。比如下面的例子:

# Title 1 

## Title 2 

將變爲:

# Title 1 ## Title 2 

在IB的答案,這個問題是列表:

- item1 
- item2 

變爲:

- item1 - item2 

謝謝到this forum post我發現實現這一目標,我包裹在很多工作對我來說更好,因爲它不會做任何的一個函數的另一種方法:

function! SoftWrap() 
    let s:old_fo = &formatoptions 
    let s:old_tw = &textwidth 
    set fo= 
    set tw=999999 " works for paragraphs up to 12k lines 
    normal gggqG 
    let &fo = s:old_fo 
    let &tw = s:old_tw 
endfunction 

編輯:更新的方法,因爲我意識到這是不工作一個Linux設置。如果這個較新的版本不適用於MacVim(我無法測試),請刪除包含fo的行。