2017-03-25 86 views
1

我想要在插入模式下綁定TAB以在')'之後跳轉到位置,如果它存在於活動行中的光標之後,否則它應該只是用作正常的TAB。我還沒有設法在Vimscript中找到搜索或查找功能,將搜索範圍限制爲一行,而且我仍然不知道如何檢查該字符是否被找到。因此,在僞代碼中,它應該如下所示:用Vimscript跳轉到一行中的特定字符

inoremap <TAB> :if (char_in_line(')')) | cursor_on_char() | a (append) | else '\t' | endif 
+0

您是否閱讀過':help search()'? – romainl

回答

1

要獲取當前行文本,請使用getline('.')。然後,您可以很容易地 檢查是否存在)match(),如果 是無或)位置(如果有的話)將返回-1。

使用插入模式下的^R,可以插入 表達式的結果。然後,使用傳統的a?b:c(請參閱 的expr1)進行測試並返回相應的字符(製表符或移動)。 要返回移動,您可以在插入模式下使用^O,允許您在不離開插入的情況下運行正常模式命令。技術上 你可以只運行一個命令,而交互完成。但在這個 的情況下,它會被Vim一次插入,你可以立即執行兩個命令 :f)移動到下一個)l來調整光標 的位置。

全部放在一起:

:inoremap <tab> <c-r>=match(getline('.'), ')') < 0 ? "\t" : "\<c-o>f)l"<cr> 

剩下的唯一的一點是,本次測試沒有考慮光標 位置。但由於match()返回匹配的位置,因此您可以將 與getcurpos()[2]進行比較(請參閱此 函數的幫助),並且相應地調整邏輯。

然而,對於什麼比這更復雜,我建議在你操控光標的位置,你 心願功能搭建 這(幫助是你的朋友,特別是:h function-list),然後調用 在地圖這一功能。

inoremap <tab> <esc>:call InsertSmartTab()<cr>