在vim中如何将“保存”映射到ctrl-s

93
在vim中,我该如何将“保存”(:w)映射到ctrl-s
我试图"map"这个命令,但是当我按下ctrl-s时,xterm会冻结。
如果我输入ctrl-v后再输入ctrl-s,我仍然只看到一个^,而不是^S

8
Vim通常的:w有什么问题吗? 我猜测ctrl-s会冻结你的xterm,因为它会冻结终端中的所有输出。('stty -ixon'或许可以帮到你) - Yoni H
21
按下“Esc Shift冒号w Enter”比按下Ctrl-s键慢大约三倍。虽然我发现按下Ctrl-s会比按下Esc Shift冒号w enter更容易引起腕隧道综合症,但有两个保存选项可以分散压力。 - Eric Leschinski
多年来,我一直在想到底是什么让我的vi会话冻结了...Ctrl-Q - ron
4个回答

168

Ctrl+S是终端常用的命令,用于停止更新屏幕内容,这是一种在没有回滚缓冲区的终端上减慢输出速度以便于阅读的方法。首先确定你是否可以配置你的xterm来将Ctrl+S传递给应用程序。然后这些映射命令将起作用:

noremap <silent> <C-S>          :update<CR>
vnoremap <silent> <C-S>         <C-C>:update<CR>
inoremap <silent> <C-S>         <C-O>:update<CR>

顺便提一下:如果按下 Ctrl+S 导致终端冻结,可以输入 Ctrl+Q 来解冻。


7
当你在.zshrc文件中包含"stty -ixon"时,它可以与OSX、iTerm2、ZSH和oh-my-zsh一起使用。 - Richard
5
在您的 .bashrc 文件中添加 "stty -ixon" 也是使用带有 bash 的 Terminal.app 所必需的。 - Jonathan Potter
@ned-batchelder,如果将其映射到Ctrl-W,可以吗?会对vim或终端默认命令造成问题吗? - Thi G.
@ThiG。<C-W>通常用于窗口分割和窗口命令。 - Juve
7
顺便说一下,正是由于“顺便提一句”,搜索引擎才把我带到了这里。谢谢。 - Timothy L.J. Stewart

80

在Linux中使用VI编辑器,你想按下Ctrl-S保存你的文档。这对我起作用了,将以下三行代码放入你的.vimrc文件中。这个文件应该位于你的主目录下:~/.vimrc。如果这个文件不存在,你可以创建它。

:nmap <c-s> :w<CR>
:imap <c-s> <Esc>:w<CR>a

第一行表示:在文档中按下 Ctrl-S 将执行一个键盘组合命令 :w <enter>

第二行表示:在“插入”模式下,按下文档中的 Ctrl-S 将切换到正常模式,执行一个 :w <enter> 命令,然后按下 a 恢复到插入模式。在此过程中,您的光标可能会移动。

您可能会注意到,按下 Ctrl-S 会执行“XOFF”,停止接收命令(如果您使用 ssh)。

要解决这个问题,请将这两个命令放在您的 ~/.bash_profile 文件中。

bind -r '\C-s'
stty -ixon

它的作用是关闭 Ctrl-S 的绑定并且清除按下 Ctrl-S 时出现在屏幕上的任何 XOFF 消息。请注意,在更改您的 .bash_profile 后,您必须使用命令 'source .bash_profile' 或注销/登录重新运行它。

更多信息:http://vim.wikia.com/wiki/Map_Ctrl-S_to_save_current_or_new_files


3
对于 GNOME 终端,只需要在我的 .bashrc 文件中添加 'stty -ixon' 即可。 - DavidGamba
1
imap <c-s> <Esc>:w<CR>a <----- 当光标位于行首时,这个命令不会按预期工作('a' 会追加而不是插入,我希望的是插入)。有没有办法根据光标位置让它执行 'a' 或 'i' 呢? - alexandernst
请问您为什么使用了两个 imap 命令?似乎只需要 imap <c-s> <Esc>:w<CR>a 就可以了。谢谢。 - gwintrob
我认为第二个imap命令行有重要意义,但进一步检查后发现它没有作用。非常好的发现,我已经删除了无用的行。 - Eric Leschinski
我建议使用非递归映射(noremap vs nmap),以避免未来出现意外的痛苦。请参阅http://learnvimscriptthehardway.stevelosh.com/chapters/05.html。 - studgeek
1
你使用a而不是i有什么原因吗? - DemiImp

15

vim

# ~/.vimrc
nnoremap <c-s> :w<CR> " normal mode: save
inoremap <c-s> <Esc>:w<CR>l " insert mode: escape to normal and save
vnoremap <c-s> <Esc>:w<CR> " visual mode: escape to normal and save

如果您使用zsh

# ~/.zshrc
# enable control-s and control-q
stty start undef
stty stop undef
setopt noflowcontrol

如果您使用bash

# ~/.bash_profile or ~/.bashrc
# enable control-s and control-q
stty -ixon

应该是vnoremap <c-s> <Esc>:w<CR> # 可视模式: 退出并保存,是吗? - BlackBeltScripting
顺便提一下,在.vimrc中似乎#不能用于注释。请使用双引号("):"<comment txt> - Dut A.

12

如何在Mac OSX终端上使用zsh?

在您的.zprofile文件中

alias vim="stty stop '' -ixoff; vim"

为什么? 发生了什么事情? 请参见这里,但基本上对于大多数终端,ctrl+s已经用于某些操作,因此此别名的作用是在运行vim之前关闭该映射。

在你的 .vimrc 文件中

nmap <c-s> :w<cr>
imap <c-s> <esc>:w<cr>a

为什么?发生了什么事情? 这个很明显,我们只是在普通模式或插入模式下将ctrl+s映射到不同的按键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接