vim - Neovim - run autcmd on all filetypes EXCEPT
问题描述
I want these commands run on every filetype except my vimwiki file (.wiki and .md)
Here is how I'm trying to do it:
let ftToIgnore = ['wiki', 'md']
autocmd BufWinEnter * if index(ftToIgnore, &ft) < 0 | syntax on
autocmd BufWinEnter * if index(ftToIgnore, &ft) < 0 | colorscheme minimalist
It is not working. It is running these commands on every single filetype, including wiki/md.
How can I fix this?
解决方案
有几件事我们需要明确。
首先,我认为一些命令本质上是全局的,即使你只为特定的文件类型运行它,例如,上面的colorscheme
命令是一个全局命令,你不能让它只对一个缓冲区起作用。
要验证,您可以打开多个不同类型的文件,如果某些文件与您的忽略类型不匹配,colorscheme 命令将运行。然后对于所有文件,颜色方案将设置为您选择的主题,即使您没有为忽略的文件类型指定颜色方案。
其次,读取文件时不能使用&ft
检查文件类型,此时正在进行文件类型检测,文件类型尚未确定。您可以使用文件后缀来检查文件的类型,如下所示:(expand('%:p:e')
这将获得文件的后缀)。
总之,您做错了两件事:(1)使用固有的全局选项或命令,并期望它仅适用于某种文件类型(2)用于&ft
在打开文件期间决定文件的类型。
如果您使用一些可以在缓冲区本地的选项并更改检测文件类型的方式,您会发现该命令可以是该文件的本地命令。例如,使用以下toy.vim
配置:
let suffix_to_ignore = ['md', ]
autocmd BufWinEnter * if index(suffix_to_ignore, expand("%:p:e")) < 0 | setlocal tabstop=4 | endif
用 激活 vim vim -u toy.vim
。然后编辑一个vim文件,:e toy.vim
显示set tabstop?
tabstop设置为4。打开一个markdown文件,:e test.md
显示set tabstop?
tabstop仍然是8。所以该命令确实只针对Markdown以外的其他文件类型运行。
参考
推荐阅读
- javascript - 模拟 javascript onchange 事件和
- mysql - 有没有办法使用 Pentaho 将索引和视图从 MySQL 传输到 SQL Developer?
- reporting-services - SSRS 占列总数的百分比
- pjsip - pjsip 2.8 TRANSPORT_ADAPTER_SAMPLE 分段错误
- database - 在 Laravel 视图中有条件地显示数据
- sql-server - Azure SQL 数据库 DTU 指标
- amazon-web-services - AWS Gateway 和 CloudWatch 日志
- vuetify.js - 在单个页面上使用多个 v-date-pickers
- macos - 在 Mac Sierra 上设置系统范围的区域设置
- wordpress - 从 wordpress.com 站点获取所有媒体的列表