Vim:在执行“:write”命令后进入插入模式

4
我想在编写完成后返回插入模式(参见:else
function! SaveOrSaveAsInInsert()
  if @% == ""
    :browse saveas
  else
    :w     
    "//TODO: Return to insert mode
  endif
endfunction

尝试使用 ":w<CR>a" 但不起作用。谢谢!
编辑:
@Randy Morris 评论使用 "startinsert",它可以工作。 另一方面,":h inserting-ex" 表示:
这些命令不能与 ":global" 或 ":vglobal" 一起使用。 ":append" 和 ":insert" 在 ":if" 和 ":endif",":for" 和 ":endfor",":while" 和 ":endwhile" 之间不起作用。
所以我的问题是,我只能使用 "startinsert" 的 "i" 等效方法,还是有办法绕过 "a" 的行为?或者我应该坚持使用 "imap <C-s> <Esc>w<CR>a" 而不进行文件名测试?

3
我认为你想要使用startinsert,但我现在无法进行测试。 - Randy Morris
是的,请将其作为答案编写。谢谢。 - Eric Fortis
4个回答

4

inoremap <expr> <c-s> "\<esc>:" . (@% == "" ? "browse saveas" : "w") . "\<cr>gi"

我使用gi回到插入模式。使用表达式映射来确定文件是否已保存。

该代码是一个键盘映射的示例,按下后会执行一些操作。如果当前文件未保存,则会打开“浏览另存为”对话框,否则会将更改保存到当前文件中,并返回插入模式。


2

我在我的 .vimrc 文件中使用这个快捷键,它可以让Ctrl-S保存并返回之前的模式。这可能会帮助你理解它的作用。 ;-)

" Use CTRL-S for saving, also in Insert mode
noremap <C-S> :update<CR>
vnoremap <C-S> <C-C>:update<CR>
inoremap <C-S> <C-O>:update<CR>

0

通过以下方式使它工作:

:inoremap <silent> <C-S> 
   <Esc>:if expand("%") == ""<CR>:browse saveas<CR>:else<CR>:w<CR>:endif<CR>a

0
您可以定义一个伪 noop 映射,该映射适用于所有模式:
function s:Save()
    update
    return ""
endfunction
inoremap <expr> <C-s> <SID>Save()
nnoremap <expr> <C-s> <SID>Save()
<...>

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