有没有办法为 运行 多个命令添加自定义键盘快捷键到 Vim?
Is there a way to add custom keyboard shortcuts to Vim for running numerous commands?
我遇到以下问题 - 每当我在 Vim 中完成一些 C++ 代码的编写并想要编译并 运行 它时,我必须:
- 退出插入模式
- 使用命令
:w
保存文件
- 写
:! g++ *.cpp -o programName; ./programName
以便编译运行一次
最后两个命令输入一次后,我显然是利用键盘上的上箭头键来获取最后几个命令,而不是在以后的编译和运行中一遍又一遍地写下来。
但对我来说还是有点慢。所以我想知道是否有某种方法可以创建一个键盘快捷键来输入最后两个命令,甚至可以同时执行所有这三个命令!
您可以使用 map
将键映射到命令。 nmap
用于普通模式,imap
用于插入模式等
map <key> command
你提到的 cpp
编译应该是这样的:
autocmd FileType cpp nmap <buffer> <F5> :w<bar>!g++ -o %:r % && ./%:r<CR>
将此命令添加到您的 vimrc
并将编译并 运行 当前的 cpp 文件。
FileType cpp
- 直接检测 cpp
文件,(不需要手动正则表达式)。
nmap
- 用于普通模式下的映射键。
buffer
- 对于当前缓冲区(在多次拆分的情况下)。
<F5>
- 用于映射 'F5' 键。
而执行的命令是::w | !g++ -o %:r % && ./%:r<CR>
在上面的命令中,%
是文件名(扩展名),而%:r
是文件名(没有扩展名),
<CR>
代表"Enter"按钮(马车Return)
加速您使用的内容
如果您 :set autowrite
,Vim 将在调用外部命令 (:!
) 之前自动保留源文件。
您可以通过 :!!
(旧的 vi 技巧)或 / 重复最后一个外部命令,然后通过 @:
(仍然少两次按键)重复最后一个 Ex 命令。
但是,这不会缩放,因此您最好使用 映射。
映射
由于这是特定于 C++ 的,我建议您在 文件类型插件 中定义一个 缓冲区本地映射 :
您可以通过在 :autocmd Filetype cpp ...
之前为某些文件类型定义它,并将其放入您的 ~/.vimrc
。但是当您为各种文件类型添加映射和其他设置时,这会变得笨拙。最好将命令放入 ~/.vim/ftplugin/cpp_mappings.vim
。 (这需要您有 :filetype plugin on
。)
nnoremap <buffer> <F5> :update<Bar>!g++ -o %:r % && ./%:r<CR>
注释
- You should use
:noremap
;它使映射不受重新映射和递归的影响。
:update
是 :write
的变体,只有在确实存在未持久化的更改时才执行写入;所以,它的效率稍微高一些。
- 对于
%:r
占位符(使映射独立于当前文件名),请参阅 :help cmdline-special
。
我遇到以下问题 - 每当我在 Vim 中完成一些 C++ 代码的编写并想要编译并 运行 它时,我必须:
- 退出插入模式
- 使用命令
:w
保存文件
- 写
:! g++ *.cpp -o programName; ./programName
以便编译运行一次
最后两个命令输入一次后,我显然是利用键盘上的上箭头键来获取最后几个命令,而不是在以后的编译和运行中一遍又一遍地写下来。
但对我来说还是有点慢。所以我想知道是否有某种方法可以创建一个键盘快捷键来输入最后两个命令,甚至可以同时执行所有这三个命令!
您可以使用 map
将键映射到命令。 nmap
用于普通模式,imap
用于插入模式等
map <key> command
你提到的 cpp
编译应该是这样的:
autocmd FileType cpp nmap <buffer> <F5> :w<bar>!g++ -o %:r % && ./%:r<CR>
将此命令添加到您的 vimrc
并将编译并 运行 当前的 cpp 文件。
FileType cpp
- 直接检测 cpp
文件,(不需要手动正则表达式)。
nmap
- 用于普通模式下的映射键。
buffer
- 对于当前缓冲区(在多次拆分的情况下)。
<F5>
- 用于映射 'F5' 键。
而执行的命令是::w | !g++ -o %:r % && ./%:r<CR>
在上面的命令中,%
是文件名(扩展名),而%:r
是文件名(没有扩展名),
<CR>
代表"Enter"按钮(马车Return)
加速您使用的内容
如果您 :set autowrite
,Vim 将在调用外部命令 (:!
) 之前自动保留源文件。
您可以通过 :!!
(旧的 vi 技巧)或 / 重复最后一个外部命令,然后通过 @:
(仍然少两次按键)重复最后一个 Ex 命令。
但是,这不会缩放,因此您最好使用 映射。
映射
由于这是特定于 C++ 的,我建议您在 文件类型插件 中定义一个 缓冲区本地映射 :
您可以通过在 :autocmd Filetype cpp ...
之前为某些文件类型定义它,并将其放入您的 ~/.vimrc
。但是当您为各种文件类型添加映射和其他设置时,这会变得笨拙。最好将命令放入 ~/.vim/ftplugin/cpp_mappings.vim
。 (这需要您有 :filetype plugin on
。)
nnoremap <buffer> <F5> :update<Bar>!g++ -o %:r % && ./%:r<CR>
注释
- You should use
:noremap
;它使映射不受重新映射和递归的影响。 :update
是:write
的变体,只有在确实存在未持久化的更改时才执行写入;所以,它的效率稍微高一些。- 对于
%:r
占位符(使映射独立于当前文件名),请参阅:help cmdline-special
。