【问题标题】:VIM: why do these bindings work only sometimes?VIM:为什么这些绑定只在某些时候起作用?
【发布时间】:2015-07-08 21:32:09
【问题描述】:

我的 .vimrc 中有这些绑定。它们大部分时间都在工作,但有时它们不工作:它们只会保存文件而不运行它。

然后我进入插入模式并退出回到正常模式,它们再次工作。可能是什么问题?

谢谢!

autocmd FileType python map <C-k> :write <CR> :! python % <CR>
autocmd FileType lisp  map <C-k> :write <CR> :! clisp % <CR>
autocmd FileType scala  map <C-k> :write <CR> :! scala % <CR>

【问题讨论】:

标签: vim key-bindings


【解决方案1】:

这里有很多话题要讨论,所以废话不多说:

映射

您当前的映射map &lt;c-k&gt; ... 只能在正常、可视和等待操作员模式下工作。但是,在可视模式或操作员挂起模式下执行映射将只保存一系列行的缓冲区(读取不好)。我建议你只为普通模式制作映射。

两条一般经验法则:

  • 始终提供n 之类的模式以表示正常。
  • 除非您要映射到 &lt;Plug&gt; 映射,否则请始终使用 noremp 而不是 map

因此,您的其中一个映射可能类似于以下内容:

nnoremap <c-k> :w<cr>:!python %<cr>

更多信息:

:h :map-modes
:h map-overview
:h :nore
:h map-listing
:h map-verbose

基于文件类型的映射

你需要做两件事:

  • 使用noremap&lt;buffer&gt; 选项创建特定缓冲区的本地映射。
  • 仅加载特定文件类型的映射。

这可以通过.vimrc 中的autocmdFileType 事件来完成,如下所示:

autocmd FileType python nnoremap <buffer> <c-k> :w<cr>:!python %:p<cr>

另一种方法是创建一个文件类型插件。 (详情请见:h ftplugin

一个简单的例子是创建一个名为 ~/.vim/ftplugin/python.vim 的文件,并将您的映射放在里面,如下所示:

nnoremap <buffer> <c-k> :w<cr>:!python %:p<cr>

我个人更倾向于使用 ftplugin 方法,但在 .vimrc 文件中包含所有内容可能会很好。

如需更多帮助,请参阅:

:h :au
:h FileType
:h map-local
:h ftplugin

:make

更类似于 vim 的方法是使用 :make。 (假设您要 lint 与执行当前缓冲区)

  • :make 将执行 'makeprg'。它默认为 make,这是 C 项目中的佼佼者
  • 运行:make 后,quickfix 列表将包含任何错误。
  • 通过:compiler 命令设置您的编译器。
  • 可以像这样传递额外的参数:make foo-command
  • 当前文件名可以用% 表示。例如:make %

通常人们会在 ftplugins 旁边设置 :complier/'makeprg',例如~/.vim/ftplugin/perl.vimautocmd 的例如autocmd FileType perl compiler perl.

更多帮助请看:

:h :make
:h 'makeprg'
:h :compiler
:h c_%

快速修复列表

  • 使用:cnext:cprev 在错误之间移动。
  • :copen 在窗口中打开快速修复列表(:cclose 关闭)
  • :cwindow 仅在出现错误时打开快速修复列表窗口
  • 可能希望为:cnext 和朋友使用更好的映射。我建议 Tim Pope 的 unimpaired 插件

如需更多帮助,请参阅以下内容:

:h quickfix
:h :cnext
:h :cope

使用:make 的替代方法

  • 只需使用&lt;c-z&gt; 挂起vim 并运行您的构建系统。 (缺点:在快速修复列表中松散)
  • 使用:! 编译。 (与暂停相同的缺点)例如:!make
  • Syntastic 是一个语法检查系统,在保存时检查文件
  • Ale(异步 Lint 引擎)是一个插件,用于在您编辑文本文件时在 NeoVim 和 Vim 8 中提供 linting
  • Dispatch 可用于在后台运行东西。非常适合测试套件
  • 可能需要考虑终端多路复用器,例如 tmuxscreen
  • SingleComplile 尝试使用 :make 完成一些工作

结论

我个人会安装ALE,因为这消除了对映射的需要。学习如何使用位置(或快速修复)列表也是一个好主意。当您准备好动手时,您可以学习和使用:make

tl;博士

安装ALE

【讨论】:

    【解决方案2】:

    &lt;CR&gt;: 之间插入的空格可能会导致错误,因为这个空格是在执行映射时真正输入的。

    使用:noremap:nnoremap(应该在大多数情况下使用,正如 Peter Rincker 在他的回答中所写的那样),这不会是一个大问题,因为它只会将光标移动一个字符到对(见:h &lt;space&gt;)。 但是使用:map,它可以触发自定义映射(或部分映射)。

    然后,而不是:

    autocmd FileType python map <C-k> :write <CR> :! python % <CR>
    

    以下会更好:

    autocmd FileType python map <C-k> :write <CR>:! python % <CR>
    

    还有这个,真的更好:

    autocmd FileType python nnoremap <C-k> :write <CR>:! python % <CR>
    

    【讨论】:

      猜你喜欢
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多