Vim 维姆:为什么这些绑定只在某些时候起作用?

Vim 维姆:为什么这些绑定只在某些时候起作用?,vim,key-bindings,Vim,Key Bindings,我的.vimrc中有这些绑定。它们大部分时间工作,但有时不工作:它们只保存文件而不运行它 然后我进入插入模式,退出它回到正常模式,然后它们再次工作。有什么问题吗 谢谢 autocmd FileType python map <C-k> :write <CR> :! python % <CR> autocmd FileType lisp map <C-k> :write <CR> :! clisp % <CR> autocm

我的.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>
autocmd文件类型python映射:write:!蟒蛇%
autocmd文件类型lisp映射:写入:!clisp%
autocmd文件类型scala映射:写入:!斯卡拉%

此处有许多主题需要讨论,因此无需进一步讨论:

映射 当前映射
map…
仅在正常、可视和操作员挂起模式下工作。但是,在可视模式或运算符挂起模式下执行映射将只保存一系列行的缓冲区(读取不好)。我建议您只对正常模式进行映射

两条一般经验法则:

  • 对于正常情况,始终提供类似
    n
    的模式
  • 始终使用
    noremp
    而不是
    map
    ,除非要映射到
    映射
因此,您的一个映射可能与此类似:

nnoremap <c-k> :w<cr>:!python %<cr>
基于文件类型的映射 您需要做两件事:

  • 使用
    noremap
    选项创建本地到特定缓冲区的映射
  • 仅加载特定文件类型的映射
这可以通过
.vimrc
中的
autocmd
FileType
事件来完成,如下所示:

autocmd FileType python nnoremap <buffer> <c-k> :w<cr>:!python %:p<cr>
我个人更倾向于ftplugin方法,但是在
.vimrc
文件中有一个万事俱备的插件会很好

有关更多帮助,请参阅:

:h :au
:h FileType
:h map-local
:h ftplugin
:h :make
:h 'makeprg'
:h :compiler
:h c_%
:make
一种更像vim的方法是使用
:make
。(假设您希望lint vs执行当前缓冲区)

  • :make
    将执行
    'makeprg'
    。它默认设置为
    make
    ,这是C项目的一大特点
  • 运行
    :make
    后,快速修复列表将包含任何错误
  • 通过
    :compiler
    命令设置编译器
  • 可以像这样传递额外的参数
    :make foo command
  • 当前文件名可以用
    %
    表示。e、 g.
    :make%
通常人们在ftplugins(例如
~/.vim/ftplugin/perl.vim
autocmd
的文件类型perl编译器perl中设置do
:compiler
/
'makeprg'

Fop更多帮助请参见:

:h :au
:h FileType
:h map-local
:h ftplugin
:h :make
:h 'makeprg'
:h :compiler
:h c_%
快速修复列表
  • 使用
    :cnext
    :cprev
    在错误之间移动
  • :copen
    在窗口中打开快速修复列表(
    :cclose
    关闭)
  • :cwindow
    仅在出现错误时打开快速修复列表窗口
  • 可能希望对
    :cnext
    和朋友使用更好的映射。我推荐Tim Pope的插件
有关更多帮助,请参阅以下内容:

:h quickfix
:h :cnext
:h :cope
使用
的替代方案:make
  • 只需使用
    挂起vim并运行构建系统。(缺点:在快速修复列表中出现)
  • 使用
    编译。(与挂起相同的缺点)例如
    :!制造
  • 是一种语法检查系统,用于在保存时检查文件
  • (异步Lint引擎)是一个插件,用于在编辑文本文件时在NeoVim和Vim 8中提供Lint
  • 可以用来在后台运行东西。非常适合测试套件
  • 可能想考虑像或./LI>的终端复用器。
  • 尝试使用
    :make
结论 我个人会安装,因为这样就不需要映射了。学习如何使用位置(或快速修复)列表也是一个好主意。当你准备把手弄脏时,你可以学习并使用
:make

tl;博士
安装。

此处有许多主题需要讨论,无需进一步ado:

映射 当前映射
map…
仅在正常、可视和操作员挂起模式下工作。但是,在可视模式或运算符挂起模式下执行映射将只保存一系列行的缓冲区(读取不好)。我建议您只对正常模式进行映射

两条一般经验法则:

  • 对于正常情况,始终提供类似
    n
    的模式
  • 始终使用
    noremp
    而不是
    map
    ,除非要映射到
    映射
因此,您的一个映射可能与此类似:

nnoremap <c-k> :w<cr>:!python %<cr>
基于文件类型的映射 您需要做两件事:

  • 使用
    noremap
    选项创建本地到特定缓冲区的映射
  • 仅加载特定文件类型的映射
这可以通过
.vimrc
中的
autocmd
FileType
事件来完成,如下所示:

autocmd FileType python nnoremap <buffer> <c-k> :w<cr>:!python %:p<cr>
我个人更倾向于ftplugin方法,但是在
.vimrc
文件中有一个万事俱备的插件会很好

有关更多帮助,请参阅:

:h :au
:h FileType
:h map-local
:h ftplugin
:h :make
:h 'makeprg'
:h :compiler
:h c_%
:make
一种更像vim的方法是使用
:make
。(假设您希望lint vs执行当前缓冲区)

  • :make
    将执行
    'makeprg'
    。它默认设置为
    make
    ,这是C项目的一大特点
  • 运行
    :make
    后,快速修复列表将包含任何错误
  • 通过
    :compiler
    命令设置编译器
  • 可以像这样传递额外的参数
    :make foo command
  • 当前文件名可以用
    %
    表示。e、 g.
    :make%
通常人们在ftplugins(例如
~/.vim/ftplugin/perl.vim
autocmd
的文件类型perl编译器perl
中设置do
:compiler
/
'makeprg'

Fop更多帮助请参见:

:h :au
:h FileType
:h map-local
:h ftplugin
:h :make
:h 'makeprg'
:h :compiler
:h c_%
快速修复列表 <