
我正在嘗試編寫一個小宏來附加 ;到目前行的末尾 (A;),然後回到執行巨集之前我跳轉的遊標位置。
Co 和 Ci 不是我需要的,'' 和 `` 也不是我需要的,它們在編輯點上運行。有沒有辦法在不放置標記的情況下做到這一點?
答案1
如果您可以製作一個小函數而不是一個小宏,我會建議以下內容:
function! AppendString(string)
if getline('.') !~ a:string.'$'
let original_cursor_position = getpos('.')
exec("s/$/".a:string."/")
call setpos('.', original_cursor_position)
endif
endfunction
使用 獲得遊標位置getpos()
,然後使用 恢復setpos()
。
這個函數可以附加任何你想要的字串。它還檢查該行末尾是否已經有所需的字串,在這種情況下它不執行任何操作。
您可以定義使用此函數的鍵盤映射,這對於不同的語言很有用:
" in ftplugin/cpp.vim
nnoremap <silent> <LocalLeader>; :call AppendString(";")<CR>
或者
" in ftplugin/python.vim
nnoremap <silent> <LocalLeader>: :call AppendString(":")<CR>
答案2
如果您使用低階setpos()
而不是:substitute
(它具有其他不必要的副作用,例如將模式新增至搜尋記錄中),則遊標位置將自動保留:
:nnoremap <silent> <leader>; :call setline('.', getline('.') . ';')<CR>
答案3
文件中清楚地解釋了 `` 的行為以及被視為「跳躍」的行為。
從:help jump-motions
:
「跳轉」是下列指令之一:「'」、「`」、「G」、「/」、「?」、「n」、「N」、「%」、「(」、「)」 、 「[[」、「]]」、「{」、「}」、「:s」、「:tag」、「L」、「M」、「H」以及開始編輯新檔案的指令。如果使用這些命令之一使遊標“跳轉”,則會記住跳轉之前遊標的位置。您可以使用“''”和“``”命令返回到該位置,除非包含該位置的行已更改或刪除。
A
顯然不在列表中,因此加里·伯恩哈特(Gary Bernhardt)所說的“滴答滴答”將無法“按原樣”工作。不過,這仍然是一個好方法,但是您必須明確放置反引號前你做A;
nnoremap <key> m`A;<Esc>``
答案4
我最終編寫了一個小函數,一個比您剛發布的版本不太靈活但更緊湊的版本。
按鍵綁定:
nnoremap <leader>; :call AppendSC()<CR>
功能:
fun! AppendSC()
let pos = getpos('.')
s/.*/&;/
call setpos('.', pos)
endf