VIM:为什么这些绑定有时只能起作用?

时间:2015-07-08 21:32:09

标签: vim key-bindings

我的.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>

2 个答案:

答案 0 :(得分:4)

这里有很多话题需要讨论,以便进一步讨论:

映射

您当前的映射map <c-k> ...仅适用于普通,可视和操作员待处理模式。但是,在可视模式或操作员挂起模式下执行映射会仅使用一系列行保存缓冲区(读取不好)。我建议你只为正常模式制作映射。

两条一般经验法则:

  • 始终为n提供正常的模式。
  • 除非您要映射到noremp映射,否则请始终使用map而不是<Plug>

因此,您的一个映射可能看起来与此类似:

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

了解更多信息:

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

基于文件类型的映射

你需要做两件事:

  • 使用<buffer>的{​​{1}}选项创建特定缓冲区的本地映射。
  • 仅为特定文件类型加载映射。

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

.vimrc

另一种方法是通过创建文件类型插件。 (有关详细信息,请参阅autocmd FileType python nnoremap <buffer> <c-k> :w<cr>:!python %:p<cr>

一个简单的例子就是创建一个名为:h ftplugin的文件,并将映射放在里面:

~/.vim/ftplugin/python.vim

我个人更倾向于使用ftplugin方法,但在nnoremap <buffer> <c-k> :w<cr>:!python %:p<cr> 文件中包含所有内容可能会很好。

如需更多帮助,请参阅:

.vimrc

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

这样做更像vim的方法是使用:make。 (假设您想要lint vs执行当前缓冲区)

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

通常,人们会在ftplugins的一侧设置:make % / :complier,例如'makeprg'~/.vim/ftplugin/perl.vim例如autocmd

更多帮助请看:

autocmd FileType perl compiler perl

quickfix list

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

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

:cnext

使用:h quickfix :h :cnext :h :cope

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

结论

我个人会安装ALE,因为这样就不需要你的映射了。学习如何使用位置(或quickfix)列表也是一个好主意。当您准备好弄脏手时,您可以学习并使用:make

TL;博士

安装ALE

答案 1 :(得分:0)

<CR>:之间插入的空格可能会导致错误,因为在执行映射期间确实输入了此空间。

使用:noremap:nnoremap(大部分时间都应该使用,正如Peter Rincker在他的回答中所写的那样),这不会是一个大问题,因为它只会移动光标右边有一个字符(见:h <space>)。 但是使用: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>