VimL 获取光标前、后的字符串(【兼容汉字】)

因为汉字不是占一个字节位,而 VimL 对这块处理,还是有不少细节要注意的。
比如 stridx 获取的是字节位置,而 strridx 是字符位置
strlen 是字节数, strchars 是字符
更重要的是 strpart 是根据字节提取,而 strcharpart 是根据字符提取

  • 获取光标前字符串(不含光标) sLine[:c-2]
  • 获取光标前字符串(含光标) strpart(sLine,0,c-1) . strcharpart(sLine[c-1:],0,1)
  • 获取光标后字符串(含光标) sLine[c-1:]
  • 获取光标后字符串(不含光标) strpart(sLine[c-1:], 1)
  • 获取当前光标字符 strcharpart(strpart(getline('.'),col('.')-1),0,1)

为了方便以后使用,还写了 ultisnips

snippet charb "char before col" w
strcharpart(${1:sLine},strchars($1)-1,1)
endsnippet

#不能用 sLine[:c-2] 当c = 1时,就会获取全部字符串
snippet strbb "光标前字符串(不含光标)" w
strpart(${1:sLine},0,${2:c}-1)
endsnippet
snippet strb "光标前字符串(含光标)" w
strpart(${1:sLine},0,${2:c}-1) . strcharpart($1[$2-1:],0,1)
endsnippet

#考虑光标是汉字的情况
snippet charc "char at col" w
strcharpart(${1:sLine}[${2:c}-1:],0,1)
endsnippet

snippet straa "光标后字符串(不含光标)" w
strcharpart(${1:sLine}[${2:c}-1:],1)
endsnippet
snippet stra "光标后字符串(含光标)" w
${1:sLine}[${2:c}-1:]
endsnippet

snippet strbt "i,j之间的字符串(包含i,j所在字符)" w
strpart(${1:sLine}, ${2:i}-1, ${3:j}-$2+1)
endsnippet

snippet stri "s0字符串i位置后面插入s1" w
${1:s0}[:${2:i}] . ${3:s1} . $1[$2:]
endsnippet
posted @ 2021-08-25 09:33  火冷  阅读(371)  评论(0编辑  收藏  举报