【问题标题】:How to use ‘autocmd’ and ‘augroup’ with ‘map {lhs} {rhs}’ in a vimrc file?如何在 vimrc 文件中使用“autocmd”和“augroup”和“map {lhs} {rhs}”?
【发布时间】:2013-09-25 07:13:23
【问题描述】:

为什么 Vim (文本编辑器) 的以下运行时配置设置无法正常工作?

autocmd colorscheme default map <F2> :colorscheme elflord<CR>
autocmd colorscheme elflord map <F2> :colorscheme default<CR>

autocmd! colorscheme default map <F2> :colorscheme elflord<CR>
autocmd! colorscheme elflord map <F2> :colorscheme default<CR>

augroup CScheme
  autocmd!
  autocmd colorscheme default map <F2> :colorscheme elflord<CR>
  autocmd colorscheme elflord map <F2> :colorscheme default<CR>
augroup END

以上所有这些设置都将键 重新映射到字符串 "" 中,当我按下重新映射的键时,我可以清楚地看到它我处于插入模式。在 Vim 中 autocmdaugroupmap {lhs} {rhs} 的正确语法是什么?

【问题讨论】:

  • 如果当前 colorschemedefault,我正在尝试将密钥 重新映射到 :colorscheme elflord&lt;CR&gt; 并重新映射如果colorschemeelflord,则将 转换为:colorscheme default&lt;CR&gt;

标签: vim map editor text-editor


【解决方案1】:

:map 命令结合了正常、可视+选择和操作员挂起模式。如果您想要 all 模式,则需要为插入和命令行模式发出单独的:map!(带有!)。见:help map-modes。因此,您在插入模式下的故障排除尝试无效。

但还有另一个问题:在:autocmd 中,{pat} 文件模式是当前缓冲区的文件名,而不是颜色方案名称。您可以使用以下 autocmd 看到这一点:

:autocmd ColorScheme * echomsg "file is" expand('<afile>')

这将打印颜色方案名称,而是当前缓冲区的名称。让ColorScheme 事件在方案名称上工作会很好,但目前还没有以这种方式实现。因此,您巧妙的重新映射方案将行不通。

相反,定义一个 :autocmd ColorScheme *,并使用条件(在包含当前颜色方案名称的 g:colors_name 变量上)切换/移动颜色方案,或者只使用映射内的条件,像这样:

:nnoremap <F2> :execute 'colorscheme' (g:colors_name ==# 'default' ? 'elflord' : 'default')<CR>

PS:You should use :noremap;它使映射不受重映射和递归的影响。

【讨论】:

  • 我知道。当然,我已经在 Normal 模式(也就是命令模式)中测试了上述问题的运行时配置设置。
  • 所以整个部分有点误导,因为你没有说明什么不起作用。无论如何,我想我已经找到了问题所在;查看我的编辑。
  • 哦,对不起.. 你能否针对我的评论写一个完整的运行时配置设置:stackoverflow.com/questions/18998510/…
  • 最好在映射中动态完成;那么你就不需要任何:autocmd!我在答案中添加了一个示例。
  • g: 只是 global 变量的前缀; var 本身就是一个约定;每个颜色方案脚本都应该设置它。您的第一直觉应该是寻求出色的内置帮助::help g:colors_name alreadys 为您提供了一些背景信息。
猜你喜欢
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多