寻求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 的终端仿真器上不起作用,请参阅函数的第一行,如果需要则设置为 + 寄存器调整
目前,我在我的 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 的终端仿真器上不起作用,请参阅函数的第一行,如果需要则设置为 + 寄存器调整