Vim(vimscript)获得光标下的确切字符

时间:2014-04-27 13:00:14

标签: vim

我通过以下方式在vimscript中获取光标下的字符:

getline('.')[col('.')-1] 

它的工作方式与它应该完全一样,但有些东西我不喜欢。考虑这个[]光标。当光标旁边有一个括号时,如下所示: }[]][])[]{[]光标实际返回括号。我需要设置什么才能始终将字符正确地返回到光标下面,或者如果左边有一个括号则至少忽略?

注意:我怀疑它可能与括号突出显示有关,但我不确定。

注意2:对于发生的情况,必须有匹配的括号。

3 个答案:

答案 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,了解如何获取前兆字符。