我通过以下方式在vimscript中获取光标下的字符:
getline('.')[col('.')-1]
它的工作方式与它应该完全一样,但有些东西我不喜欢。考虑这个[]
光标。当光标旁边有一个括号时,如下所示:
}[]
,][]
,)[]
或{[]
光标实际返回括号。我需要设置什么才能始终将字符正确地返回到光标下面,或者如果左边有一个括号则至少忽略?
注意:我怀疑它可能与括号突出显示有关,但我不确定。
注意2:对于发生的情况,必须有匹配的括号。
答案 0 :(得分:22)
虽然我无法重现您所描述的问题,但您的代码还存在另一个问题:由于字符串索引(这是Vimscript的一个不可忽视的方面),仅适用于单字节字符,但无法捕获Ä
或等字符(具体取决于使用的编码)。这是捕获光标下字符的更好方法:
:echo matchstr(getline('.'), '\%' . col('.') . 'c.')
编辑:关于Vim 7.4.1742,Vim有新的strgetchar()
和strcharpart()
函数可以处理字符索引,而不是字节寻址。这在很多情况下都很有用,但在这里不行,因为你仍然只能获得光标的字节索引位置(或者virtcol()
的屏幕列,但这与字符索引不同。)
答案 1 :(得分:1)
nr2char(strgetchar(getline('.')[col('.') - 1:], 0))
或
strcharpart(getline('.')[col('.') - 1:], 0, 1)
答案 2 :(得分:0)
另一种获取光标下同时处理ASCII和非ASCII字符的字符索引的方法如下:
if [ $# -ne 2 ]
then
echo "Usage: $0 number1 number2" >&2 # write error message to stderr
exit 1
fi
a=$1
b=$2
# rest of your script goes here
然后,如果要在光标下获取char,请使用以下命令:
function! CharAtIdx(str, idx) abort
" Get char at idx from str. Note that this is based on character index
" instead of the byte index.
return strcharpart(a:str, a:idx, 1)
endfunction
function! CursorCharIdx() abort
" A more concise way to get character index under cursor.
let cursor_byte_idx = col('.')
if cursor_byte_idx == 1
return 0
endif
let pre_cursor_text = getline('.')[:col('.')-2]
return strchars(pre_cursor_text)
endfunction
另请参阅this post,了解如何获取前兆字符。