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显然不在列表中,所以“tick-tick-back”(Gary Bernhardt 称之为)不会“按原样”工作。不过,这仍然是一种好方法,但您必须明确放置反引号你做A;

nnoremap <key> m`A;<Esc>``

答案4

我最终编写了一个小函数,比你刚刚发布的版本不太灵活但更紧凑。

按键绑定:

nnoremap <leader>; :call AppendSC()<CR>

功能:

fun! AppendSC()
  let pos = getpos('.')
  s/.*/&;/
  call setpos('.', pos)
endf

相关内容