通过追加/行追加行后放置光标

时间:2019-11-19 08:45:07

标签: function vim append cursor

我使用以下功能在以下格式的注释中插入一个中断点:

中断:

# 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>

1 个答案:

答案 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取决于光标的位置和位置,并使用更改标记分隔添加的文本);通常这很好(但这取决于用例)。
  • 以交互方式向用户查询内容的映射与Vim不太相似。我宁愿定义一个以标题为参数的自定义命令(例如:Break {title}),也可以定义一个附加的(不完整的命令行)映射来快速访问:nnoremap ;s :Break<Space>。这样,例如,您可以通过@:轻松地重复使用相同标题的最后一次插入。