Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim(vimscript)获取光标下的精确字符_Vim - Fatal编程技术网

Vim(vimscript)获取光标下的精确字符

Vim(vimscript)获取光标下的精确字符,vim,Vim,我通过以下方式获取vimscript中光标下的字符: getline('.')[col('.')-1] 它的工作原理和它应该的完全一样,但是有一点我不喜欢。考虑这个 []/COD>光标。当光标旁边有一个括号时,如下所示: }[],][],)[]或{[]光标实际返回括号。我必须设置什么,以便它将始终返回光标下方的字符,或者至少忽略光标左侧是否有括号 nr2char(strgetchar(getline('.')[col('.') - 1:], 0)) 注意:我怀疑这可能与突出显示的括号有关,

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

getline('.')[col('.')-1] 
它的工作原理和它应该的完全一样,但是有一点我不喜欢。考虑这个<代码> []/COD>光标。当光标旁边有一个括号时,如下所示:
}[]
][]
)[]
{[]
光标实际返回括号。我必须设置什么,以便它将始终返回光标下方的字符,或者至少忽略光标左侧是否有括号

nr2char(strgetchar(getline('.')[col('.') - 1:], 0))
注意:我怀疑这可能与突出显示的括号有关,尽管我不确定


注2:对于出现的情况,必须有一个匹配的括号。

虽然我无法重现您描述的问题,但您的代码还有另一个问题:因为字符串索引(这是Vimscript更丑陋的一面之一),它只能处理单字节字符,但无法捕获字符,如
Ä

nr2char(strgetchar(getline('.')[col('.') - 1:], 0))


另一种获取光标下处理ASCII和非ASCII字符的字符索引的方法如下所示:

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                                                               
然后,如果要在光标下获取char,请使用以下命令:

let cur_char_idx = CursorCharIdx()
let cur_char = CharAtIdx(getline('.'), cur_char_idx)

另请参阅如何获取光标前字符。

我无法复制此内容;您是否看到with
vim-N-u NONE
?我猜一个插件会更改光标位置。我没有使用任何插件。我已使用vimrc更新了第一篇文章。这是wierd。我清除了vimrc,但它们仍然是高位的。当我使用-N-u NONE运行vim时,我没有得到是。这是否意味着加载了多个vimrc?请检查
:scriptnames
:autocmd
是否有可疑的东西。在/usr/share/vim/vim74中,我有大量类似matchparen的插件(我认为这是原因),spellfire和其他一些不应该存在的插件。它们是默认存在的还是以某种神秘的方式存在的?谢谢你们的输入。我一定会修复它。+1若上面的问题看起来像是黑魔法:代码只是使用光标的当前列位置作为当前行的字符串表示的索引,然后该表达式产生
matchstr({currentLineAsStr},\%{currentColNum}c.')
其中
\%{number}c
是一种指导引擎从{number}开始搜索的习惯用法当前缓冲区中的第th列,或者在我们的示例中,仅在给定字符串中的某个索引处。
是正则表达式的唯一捕获组件,当然只是表示“除换行符以外的任何单个字符”