Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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 编辑*.sh文件时,单词边界会更改_Vim - Fatal编程技术网

Vim 编辑*.sh文件时,单词边界会更改

Vim 编辑*.sh文件时,单词边界会更改,vim,Vim,我正在为Windows使用gVim 7.4 如果在*.txt文件中有文本firstWord.secondWord,并且在正常模式下输入*,它将只突出显示firstWord 但是如果我在*.sh文件中这样做,它将突出显示整个firstWord.secondWord字符串 我不喜欢这种行为。我希望它始终像在*.txt文件中一样工作 我假设这是由ftplugin目录中的sh.vim文件引起的,但是在那里找不到任何可以这样做的东西。我的sh.vim文件与在中找到的文件相同 如何使*.sh文件与*.txt

我正在为Windows使用gVim 7.4

如果在*.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中也不再执行此操作)