Vim:跳到上一個遊標位置,而不是編輯點

Vim:跳到上一個遊標位置,而不是編輯點

我正在嘗試編寫一個小宏來附加 ;到目前行的末尾 (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

相關內容