2008-10-26 23 views
66

如果不進入插入模式,是否可以插入光標在Vim中的換行符?下面是一個例子([x]意味着光標在x):如何在Vim中插入光標而不進入插入模式的換行符?

if (some_condition) {[ ]return; } 

偶爾,我可能要輸入一些更多的代碼。所以我按進入插入模式,按輸入插入換行符,然後刪除額外的空間。接下來,我將進入正常模式,並將光標放在右大括號之前,然後執行相同的操作,以便在自己的行上進行操作。

我一直在做這一段時間,但肯定有更好的方法來做到這一點?

+0

要插入一些沒有進入插入模式? – 2008-10-26 05:59:21

+17

@ jeremy-cantrell是的,就像「J」一樣加入下一行並插入一個空格而不進入INSERT模式! – awendt 2011-05-09 15:32:33

回答

83

對於您給出的示例,可以使用r輸入用Enter替換單個字符(空格)。然後,fspace前進到下一個空格並重覆上一個命令。

根據您的autoindent設置,上面可能會或可能不會正確縮進return語句。如果沒有,則使用小號輸入標籤Esc鍵,而不是更換一個新行的空間,縮進線,並退出插入模式。你將不得不用另一個命令替換第二個空格,所以你不能使用'。'。在這種情況下。

+0

我認爲這是最簡單的解決方案。感謝Greg。 – 2008-10-26 16:44:10

+3

'f [空格]'應該等同於'W'(即移動到下一個whitepsace) – 2008-10-30 22:08:16

+2

'W'移動一個字符得太遠,它移動到下一個空格之後的下一個字符*。 – 2009-09-23 22:22:35

11

這裏是如何創建一個在光標插入新行的宏,只要你按下而插入模式「G」:

從VIM內,類型:

:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter] 

其中:

  • [CTRL + v]表示按住Ctrl鍵並按下 'v'
  • [Enter]表示按回車鍵
  • [Esc]鍵指按Esc鍵

你會看到在你的vim窗口的底部以下,直到你按下回車決賽:

:map g i^M^[ 

說明:

一個[Ctrl + V]表示「引述FOL降低字符「 - 它允許您在命令中嵌入換行符和轉義字符。

所以你映射的「G」鍵序列:

i [Enter] [Escape]

這是VIM對於光標,然後退出插入模式前插入一個換行符。

調整菜譜方案:

  • 可以代替「G」與不是已經鏈接到您使用命令的任何字符。
  • 增加更多命令,例如f}i^M^[O - 這將˚F IND的} nsert另一個新行,然後在插入模式和Ø筆空行逃脫您輸入更多的代碼。
  • 您可以將該命令添加到.vimrc或.exrc文件以使其永久。只需從頭開始省略冒號,所以命令以「地圖」開頭

享受!

1

如果你在兩行中打斷一行,而autoindent(或任何其他縮進輔助)被啓用,Vim將自動殺死光標右側的任何空格。

如果你不希望使用任何這些設置,使用s代替i小號 ubstitute新文本的空白,而不是僅僅插入。 (如果有多個空格,請將光標置於最左側,並使用cw代替。)

-1

此映射將打破您擁有的任何單行功能。簡單地說你的光標就行了,在正常模式下點擊「g」:

:map g ^f{malr<CR>`a%hr<CR>`a 

這裏假設你有左大括號後面輸入一個空格和結束括號之前的空間。看看是否適合你。

4

如果您通常將一行塊擴展爲三行,請嘗試替換。將開口支架更換爲支架/返回,並將關閉支架更換爲返回/支架。

用於替代支架支架/返回命令如下:

:s/{/{\r/ 

既然你要經常使用這個,你可以全序列映射到一個未使用的按鍵是這樣的:

:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M 

如果您看到^M序列中,類型[按Ctrl-V],然後按進入

現在隨着你的光標在你的採樣線上的任何地方,按下映射鍵,並添加回車符。

查詢:help map-which-keys以獲取關於選擇未使用的擊鍵進行映射的建議。

8

的簡單映射按下Ctrl + Enter鍵打破在光標的行:

:nmap <c-cr> i<cr><Esc>

基本上進入「插入」模式,插入換行符,並返回到正常模式。

將它放在.vimrc文件中供將來使用。

0

設置在vimrc此鍵映射

:map <C-m> i<CR><Esc>h 

,如果你想在你的vim更好地使用它,然後按Ctrl + M。

0

恕我直言,內置映射gs是不是一個有用的映射(把VIM睡覺),人們可以用這個分裂:

nmap gs i<CR><ESC> 
0

Vrapper您可以使用GQL將分割線無進入插入模式,但可能無法始終保持縮進。

0

基本上,當你拆分一條線時,你要麼只是插入一個回車符,要麼就是你在一個空間的情況下,用一個回車代替它。那麼,爲什麼要解決這個問題呢?這裏是我對K的映射:

"Have K split lines the way J joins lines 
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>" 

我使用三元運算符將兩個操作壓縮到一個鍵映射中。打破它,<expr>意味着鍵映射的輸出可以動態的,在這種情況下,取決於條件getline('.')[col('.')-1]==' ',這是詢問vim如果光標下的字符是空格的冗長方式。最後,熟悉的三元運算符? :要麼替換換行符(r<CR>)的空間或插入一個新的(i<CR><Esc>

現在你有一個可愛的妹妹鍵映射到J命令。

0

假設你可以將K映射到別的東西(選擇你喜歡的其他鍵),並使用標記'作爲臨時標記,那麼爲什麼不這樣做呢?

:nmap K m'a<CR><Esc>`' 

現在在正常模式下按下K後,您希望換行符發生後的字符將分割線並將光標保留在原來的位置。

0

事實上,你需要以下組合操作:

  1. v進入可視化模式
  2. 選擇線路要分割
  3. :在命令模式
  4. 進入s/\s/\r/g
  5. 完成
0

如果你輸入:

aaa bbb ccc ddd 

,並希望輸出

aaa 
bbb 
ccc 
ddd 

您可以使用命令

f r<ENTER>;.;.