我使用以下功能在以下格式的注释中插入一个中断点:
中断:
# Notes -------------------------------------------------------------------
功能:
" Insert RStudio like section break
function! InsertSectionBreak()
let title = input("Section title: ") " Collect title
let title_length = strlen(title) " Number of repetitions
let times = 80 - (title_length + 1)
let char = "-" " Create line break
let sep_line = repeat(char, times)
let final_string = '\n#' . ' ' . title . ' ' . sep_line " Create final title string
call cursor( line('.')+1, 1)
call append(line('.')+1, final_string) " Get current line and insert string
endfunction
" Map function to keyboard shortcut ';s'
nmap <silent> ;s :call InsertSectionBreak()<CR>
执行完该操作后,我想将光标放在创建的部分下方一行。
# Notes -------------------------------------------------------------------
<cursor should land here>
光标停留在当前行上。
<some code I'm typing when I exit insert mode and call ;s - cursor stays here>
# Notes -------------------------------------------------------------------
<cursor lands here>
答案 0 :(得分:2)
作为低级功能,append()
不受光标位置的影响,也不会影响光标的位置。因此,您只需要调整cursor()
参数即可。我还建议仅在最后更改光标,以简化基于line('.')
的计算:
function! InsertSectionBreak()
let title = input("Section title: ") " Collect title
let title_length = strlen(title) " Number of repetitions
let times = 80 - (title_length + 1)
let char = "-" " Create line break
let sep_line = repeat(char, times)
let final_string = '#' . ' ' . title . ' ' . sep_line " Create final title string
call append(line('.')+1, ['', final_string]) " Get current line and insert string
call cursor(line('.')+4, 1)
endfunction
'\n#'
字符串包含文字\n
,而不是换行符。为此,必须使用双引号。但是,即使这样,append()
也无法使用,因为它总是将插入为一个文本行,从而将换行符显示为^@
。要包含前导空行,请改为传递行列表,然后将第一个列表元素设为空字符串。cursor()
,append()
);您可能使用了更高级的功能(:normal! jj
或:execute lnum
用于光标定位,:put =final_string
用于添加行)。会有更多的副作用(例如添加到跳转列表中,:put
取决于光标的位置和位置,并使用更改标记分隔添加的文本);通常这很好(但这取决于用例)。:Break {title}
),也可以定义一个附加的(不完整的命令行)映射来快速访问:nnoremap ;s :Break<Space>
。这样,例如,您可以通过@:
轻松地重复使用相同标题的最后一次插入。