Vim 编辑*.sh文件时,单词边界会更改
我正在为Windows使用gVim 7.4 如果在*.txt文件中有文本Vim 编辑*.sh文件时,单词边界会更改,vim,Vim,我正在为Windows使用gVim 7.4 如果在*.txt文件中有文本firstWord.secondWord,并且在正常模式下输入*,它将只突出显示firstWord 但是如果我在*.sh文件中这样做,它将突出显示整个firstWord.secondWord字符串 我不喜欢这种行为。我希望它始终像在*.txt文件中一样工作 我假设这是由ftplugin目录中的sh.vim文件引起的,但是在那里找不到任何可以这样做的东西。我的sh.vim文件与在中找到的文件相同 如何使*.sh文件与*.txt
firstWord.secondWord
,并且在正常模式下输入*
,它将只突出显示firstWord
但是如果我在*.sh文件中这样做,它将突出显示整个firstWord.secondWord
字符串
我不喜欢这种行为。我希望它始终像在*.txt文件中一样工作
我假设这是由ftplugin
目录中的sh.vim
文件引起的,但是在那里找不到任何可以这样做的东西。我的sh.vim
文件与在中找到的文件相同
如何使*.sh文件与*.txt文件没有不同的单词边界?这是由该选项引起的
这是*.txt缓冲区的默认值'iskeyword'
:
iskeyword=@,48-57,_,192-255
这是*.sh缓冲区的默认值:
iskeyword=@,48-57,_,192-255,.
当在*.sh缓冲区中时,可以通过运行以下命令手动从选项值中删除额外的点:
setlocal iskeyword-=.
对于永久解决方案,您可以将以下内容添加到vimrc中:
au! BufRead *.sh setlocal iskeyword-=.
let g:sh_noisk = 1
我相信我已经找到了这种癖好的根源。在我的系统上,在
/usr/share/vim/vim74/syntax/sh.vim
的第19-28行中有以下代码:
" AFAICT "." should be considered part of the iskeyword. Using iskeywords in
" syntax is dicey, so the following code permits the user to
" g:sh_isk set to a string : specify iskeyword.
" g:sh_noisk exists : don't change iskeyword
" g:sh_noisk does not exist : (default) append "." to iskeyword
if exists("g:sh_isk") && type(g:sh_isk) == 1 " user specifying iskeyword
exe "setl isk=".g:sh_isk
elseif !exists("g:sh_noisk") " optionally prevent appending '.' to iskeyword
setl isk+=.
endif
因此,语法文件似乎是罪魁祸首,它提供了两种替代方法来覆盖对'iskeyword'
选项的篡改
例如,要使用g:sh_noisk
全局变量,请将其添加到vimrc中:
au! BufRead *.sh setlocal iskeyword-=.
let g:sh_noisk = 1
您可以给出:set iskeyword检查单词边界包含哪些字符。您可以在shell文件中尝试使用以下命令
:set iskeyword-=。
从中删除圆点。发出此命令后,请尝试w、b或*并检查其是否有效。如果有效,请告诉我。此外,请尝试:verbose set isk?
——它将告诉您上次设置它的文件。在类似于/usr/bin/vim/vim74/plugin的路径下将有一个默认的ftplugin。检查一下。OP使用的sh.vim ftplugin没有设置“iskeyword”。它一定是从别的地方来的。啊,好地方。正如我猜作者所知道的,它不应该真的这样做。我需要做什么来设置语法/sh.vim正在键入的g:sh_noisk?注意,最近的vim支持:syn-iskeyword
扩展,因此不推荐在语法脚本中修改'iskeyword'设置(如果我正确地从vim/vim存储库中读取了shell语法文件,那么在syntax/sh.vim中也不再执行此操作)