我想要在插入模式下綁定TAB以在')'之後跳轉到位置,如果它存在於活動行中的光標之後,否則它應該只是用作正常的TAB。我還沒有設法在Vimscript中找到搜索或查找功能,將搜索範圍限制爲一行,而且我仍然不知道如何檢查該字符是否被找到。因此,在僞代碼中,它應該如下所示:用Vimscript跳轉到一行中的特定字符
inoremap <TAB> :if (char_in_line(')')) | cursor_on_char() | a (append) | else '\t' | endif
我想要在插入模式下綁定TAB以在')'之後跳轉到位置,如果它存在於活動行中的光標之後,否則它應該只是用作正常的TAB。我還沒有設法在Vimscript中找到搜索或查找功能,將搜索範圍限制爲一行,而且我仍然不知道如何檢查該字符是否被找到。因此,在僞代碼中,它應該如下所示:用Vimscript跳轉到一行中的特定字符
inoremap <TAB> :if (char_in_line(')')) | cursor_on_char() | a (append) | else '\t' | endif
要獲取當前行文本,請使用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>
您是否閱讀過':help search()'? – romainl