29

当我用 vim 打开一些 bash 脚本文件时,它有时会将它们识别为conf文件,没关系,我可以通过将文件类型设置为shwith来纠正它:setf sh

太好了,除了我注意到这并不能完全解决问题:

两个文件并排显示不同的突出显示

请注意,shopt它在左侧正确突出显示,但不在右侧,我手动将文件类型设置为sh.

这意味着当文件被识别为vimbash或被shvim 识别时,它会将文件类型设置为,sh但随后会执行一些我在手动设置文件类型时没有执行的额外步骤。

任何人都知道那可能是什么,以及我该如何解决?

4

4 回答 4

33

默认情况下,vim 已经可以识别许多文件类型。它们中的大多数通过文件扩展名工作,但在这种情况下,vim 也会分析文件的内容以猜测正确的类型。

vim 自动设置特定文件名的文件类型,如.bashrc,.tcshrc等。但是带有.sh扩展名的文件将被识别为 csh、ksh 或 bash 脚本。为了确定这到底是什么类型的脚本,vim 读取文件的第一行来查看 #! 线。

如果第一行包含单词bash,则该文件被标识为 bash 脚本。通常您会看到#!/bin/bash脚本是否要直接执行,对于其他一些 shell 配置文件,您应该使用文件扩展名.bash.

vim 中的帮助也解释了这一点:help ft-bash-syntax。您还可以let g:is_bash=1在 .vimrc 中使用 bash 语法突出显示所有带有filetype=sh. 如果您想查看详细信息,这是在$VIMRUNTIME/filetype.vim.

于 2011-09-16T23:37:46.327 回答
7

事实证明,这syntax/sh.vim包括KornBashsh的特定突出显示,您只需告诉它您使用的是哪个。这是分别用b:is_kornshell和完成b:is_bashb:is_sh

根据情况,我认为我将使用以下内容:

ftdetect/bash.vim:

au BufRead,BufNewFile *bash* let g:is_bash=1
au BufRead,BufNewFile *bash* setf sh

模式线:

# vim:let g:is_bash=1:set filetype=sh:

键映射

nmap <silent> <leader>b :let g:is_bash=1<cr> :setf sh<cr> 
于 2011-09-16T22:12:27.123 回答
4

与 Peter Coulton 的解决方案类似,并在“文件类型”Vim 帮助的“新文件类型”部分中记录了替代方案,该~/.vim/filetype.vim文件可能包含以下代码:

if exists("did_load_filetypes")
  finish
endif

augroup filetypedetect
  au! BufRead,BufNewFile *bash* let b:is_bash = 1 | setfiletype sh
augroup END

这种方法具有以下含义:

  1. ~/.vim/filetype.vim目录下的每种文件类型都有一个文件而不是一个文件~/.vim/ftdetect
  2. b:is_bash变量设置为缓冲区的本地变量,而不是全局变量,将其称为g:is_bash.
于 2012-11-18T22:25:24.173 回答
3

尝试查看有效语法设置

:windo echo b:current_syntax

(我有点期待第一个窗口说bash,第二个说sh...?)

还可以尝试使用 synatx 同步:

:windo syn sync fromstart
:windo syn sync minlines=300

一般来说

:he syn-sync

了解更多信息


PS。

长镜头,但其他一些亮点可能会干扰:

:windo se @/=''
:match none
:2match none
:3match none
于 2011-09-16T21:29:21.577 回答