我正在尝试编写一个小宏来将;附加到当前行(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