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


78

在vim中,如何映射“保存”(:w)到ctrl- s

我正在尝试“映射”命令,但是当我按xterm时会冻结 ctrl-s

如果我给ctrl- vctrl-s我仍然只看到一个^,而不是^S


8
Vim通常的:w有什么问题?我ctrl -s冻结了xterm,因为它冻结了终端中的所有输出。(“ stty -ixon”可能会有所帮助)
Yoni H 2010年

17
按下(Escape shift Colon w Enter)比按下Ctrl-s花费大约三倍的时间。尽管我发现按ctrl-s会比进入Esc移位结肠更容易导致腕管移位,但是它分散了应变,有两种选择可以保存。
埃里克·莱斯钦斯基

Answers:


143

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

4
带bash的Terminal.app也需要.bashrc中的“ stty -ixon”。
乔纳森·波特

@ ned-batchelder如果您映射到Ctrl-W可以吗?vim或终端默认命令会出现问题吗?
Thi G.

@ThiG。<C-W>通常用于窗口拆分和窗口命令
Juve 2016年

5
顺便说一句,这是搜索引擎将我带到这里的原因,谢谢。
蒂莫西LJ斯图尔特

70

在具有VI的Linux中,您需要按Ctrl-S并保存您的文档。这对我有用,在您的.vimrc文件中放入以下三行。该文件应位于您的主目录中:/home/el/.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而当按下摆脱任何XOFF的屏幕上的信息Ctrl- S。请注意,对.bash_profile进行更改后,必须使用命令'source .bash_profile'或注销/登录重新运行它。

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


3
对于gnome终端,只需在.bashrc中添加'stty -ixon'就足够了。
DavidG 2013年

1
:imap <cs> <Esc>:w <CR> a <-----当在行的开头时,这将无法正常工作('a'将追加而不是插入,这就是我想要的期望)。有没有办法根据游标的位置将其设置为“ a”或“ i”?
alexandernst 2014年

您能否解释一下为什么要使用两个imap命令?看来您只需要imap <c-s> <Esc>:w<CR>a。谢谢。
gwintrob 2015年

我以为第二个imap命令行很重要,但进一步检查它什么也没做。极好的捕获,我删除了I脚线。
Eric Leschinski 2015年

1
您使用a代替i是否有原因?
DemiImp

12

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> # visual mode: escape to normal and save吗?
BlackBeltScripting

10

Mac OSX Terminal + zsh?

在您的.zprofile中

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

为什么?发生了什么事?看到这里,但基本上对于大多数终端ctrl+s,已经用于某些东西,因此使用别名vim,以便在运行vim之前关闭该映射。

在您的.vimrc中

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

为什么?发生了什么?这很明显,我们只是将ctrl+s映射到不同的击键,具体取决于我们是处于普通模式还是插入模式。


您先生拯救了我的一天
xechelonx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.