寻求vimscript的帮助关于markdown

Seeking help for vimscript about markdown

目前,我在我的 vimrc 中使用一个方便的映射来创建 markdown links:

autocmd Filetype markdown inoremap <buffer> <silent> ,a [](<++>) <++><Esc>F[a

但我想改进它。这是我的需求:

"在markdown文件类型中,打,a,如果光标下是一个单词或在可视模式下,使用url in yank *来创建当前单词或选择区域降价 link 自动 ,

etc:
word  ==>  [word](url in the yank *)

,否则就像上面那样给了我一个空的 link 区域。

此外,我想知道如何使用代码片段而不是 vimscript 来实现它。

如果您习惯使用这种占位符 (<++>) 的片段,mu-template provides a link snippet 扩展几乎与您的映射完全相同。

还有一个surrounding mode

默认情况下,当前选择将用于 text 字段。如果您在触发视觉环境之前键入“2”,它将进入 url 字段。

编辑:如果您想手动完成,最简单的方法是使用 s 将所选内容替换为您希望插入的内容,并记住剪切字符在默认寄存器中(这个简单的解决方案搞砸了)

" CTRL-G_U permits to enable redo
xnoremap <buffer> ,a s[<c-r>"]()<c-g>U<left>
" default selection with: current-inner-word, fallback to the other definition
nmap     <buffer> viw,a

" For some reason, I cannot make the following work without using a variable
" xnoremap <buffer> ,else s[](<c-r>")<c-r>=repeat("\<C-G>u\<left>", strwidth(@")+3)<cr>
" Any way, as redo is quite funny here, let's use directly
xnoremap <buffer> ,else s[](<c-r>")<esc>F]i
nmap viw,else

其他方法包括先在反引号+> 标记之后追加,然后在反引号+< 标记之前插入。他们保留默认寄存器不变。但他们绝对不支持重做。它们也不适合在多个地方插入旧选择。

手摇方式,不是很紧凑但希望清晰易读:

function! CloseBracket(type)
    let l:wrap = "[\<C-r>\"](\<C-r>+)"
    if a:type ==? 'v'
        execute "normal! gvs" . l:wrap
    else
        let l:char = matchstr(getline('.'), '\%' . col('.') . 'c.')
        if l:char =~ '^\s*$'
            execute "normal! i[]()\<esc>hh"
            call feedkeys('i')
        else
            let l:reg = @"
            let @" = expand("<cword>")
            echom 'mode: ' . a:type
            if mode() ==? 'n'
                execute "normal! ciw" . l:wrap
            endif
            let @" = l:reg
        endif
    endif
endfunction

nnoremap <leader>a :<C-u>call CloseBracket('n')<CR>
xnoremap <leader>a :<C-u>call CloseBracket('v')<CR>

解释:

  • 调用单个函数的两个映射,其参数表明它是从正常模式或可视模式调用的

  • 如果是普通模式,则检查光标是否在空白处,如果是,则插入空锚语法,将光标留在方括号中

  • 如果正常模式和光标在单词上然后单词被包裹在方括号中并且+寄存器被插入到括号中

  • if visual selection 那么visual selection用方括号括起来,+寄存器插入括号

  • 不覆盖寄存器

  • 单次撤消操作

限制:

  • 在视线上不起作用,假设您会先 select 所需的文本

  • 未针对 + 寄存器进行测试,因为该寄存器在我的 phone 的终端仿真器上不起作用,请参阅函数的第一行,如果需要则设置为 + 寄存器调整