106.07.23 vim feedkeys 踩雷記錄

feedkeys 實在是....QuQ
雖然還是沒解法不過記錄一下
以後盡全力避免使用

主要原因就是:執行順序不保證!!!!

原本打算寫一個自己用的 surround
功能就是可以加入 ()、[]、{}、''、"" 、<> 而且要包在外面
由於有使用 v:count 所以可以用前置數字來代表要括幾個單字
無前置就是游標所在的單字

簡單範例:(灰色方塊是游標
//TODO OuO FIXME OuO XXX OuO 123
按下 3<ctrl-a>"
會變成
//TODO "OuO FIXME OuO" XXX OuO 123


範例2:
//TODO OuO FIXME OuO XXX OuO 123
按下 2<ctrl-a>[
會變成
//TODO [OuO FIXME] OuO XXX OuO 123

其實過程還算順利
最棘手的是我原本有對括號進行map
所以在insert字元的時候會自動生成配對

因此我就發現可以儲存map之後再回復
儲存:let s:save=maparg(a:pat, 'i')
刪除:execute 'inoremap ' . a:pat . ' ' . a:pat
回復:execute 'inoremap ' . a:pat . ' ' . s:save

但是要在 function insert 文字
卻是個難題
網路上查到可用
call feedkeys("i", "n")   --- 進入insert模式
call feedkeys(a:pat, "t") --- 還可以寫function內變數

但是我加入的儲存、回復 function 就出現錯誤
原因是 feedkeys 會等到函式執行完之後才執行
所以原本 儲存 --> 寫入 --> 回復
就會變成 儲存 --> 回復 --> 寫入
這樣儲存、回復就無法發揮作用了OAO

所以我就放棄 feedkeys 了
改用
execute "normal a\<bs>"             --- 進入insert模式
execute "normal viw\<esc> bi".a:pat ---function內變數只要加在後面即可,完美


完整程式碼就來這裡吧OuO
aben20807/my_vim/.surround.vim


參考資料:
Vim 如何保存和恢复映射?
How to save and restore a mapping?
Problem with feedkeys() --- 跟我遇到同樣麻煩的老兄
vim函数feedkeys使用说明
execute "normal a \<BS>".linenumber
Vim: why doesn't “:normal! i” enter insert mode?
Invoke a function with a count prefix --- v:count
[SOLVED] vim how pass argument to key mapping
Is it possible to use multiple arguments in vim command
How can I map d[count]d?
let n = nr2char(getchar())
一个更为复杂的Mapping

沒有留言:

張貼留言

^ Top