How do I map ctrl x ctrl o to ctrl space in terminal vim?
After searching a bit on the net it seems that I can't map CtrlSpace to 开发者_开发问答anything/alot. Is there a way to do it today, what I found was usually 2 years old.
I've run into the same issue, the short answer is yes you can, and not only in the gui version. Adding this on you .vimrc
is enough:
inoremap <C-Space> <C-x><C-o>
inoremap <C-@> <C-Space>
The problem seems to be that Terminal.app doesn't interpret <C-Space>
correctly and Vim understands it as <C-@>
which is a built-in mapping (:help CTRL-@
).
Maybe you could go with something like the following in your .vimrc:
if !has("gui_running")
inoremap <C-@> <C-x><C-o>
endif
which seems to work, here, but I don't like the idea of overriding built-ins like that.
Instead you should try with <Leader>
(:help leader
), it gives you huge possibilities for defining your own custom mappings and (depending on the mapleader
you choose) won't interfere with OS/app specific shortcuts/limitations and hence be more portable.
With this in my .vimrc:
let mapleader=","
inoremap <leader>, <C-x><C-o>
I just hit ,,
to complete method names.
The nitpicker broke pablox solution. The crux of the solution was just about remapping. So when you disable remapping, it cannot work.
If you really want to throw in a noremap
, this is what it looks like:
inoremap <expr><C-space> neocomplete#start_manual_complete()
imap <C-@> <C-Space>
What will not work: inoremap <C-@> <C-Space>
'cause the <C-Space>
part will not be remapped itself.
- Have you tried
:inoremap <c-space> <c-x><c-o>
? - Does CtrlX CtrlO do anything when you type in insert mode? Is
omnifunc
set?
Add the following code to ~/.vimrc
:
" Ctrl-Space for completions. Heck Yeah!
inoremap <expr> <C-Space> pumvisible() \|\| &omnifunc == '' ?
\ "\<lt>C-n>" :
\ "\<lt>C-x>\<lt>C-o><c-r>=pumvisible() ?" .
\ "\"\\<lt>c-n>\\<lt>c-p>\\<lt>c-n>\" :" .
\ "\" \\<lt>bs>\\<lt>C-n>\"\<CR>"
imap <C-@> <C-Space>
Source: https://coderwall.com/p/cl6cpq
To accommodate both Windows and Linux I applied this to ~/.vimrc
if has("unix")
inoremap <C-@> <c-x><c-o>
elseif has("win32")
inoremap <C-Space> <c-x><c-o>
endif
I had better results with this set of mappings across all modes on Mac OS. Have not tested Windows or Linux.
I don't understand how the excepted answer is supposed to work in terminal mode.
inoremap <C-space> <ESC>
vnoremap <C-space> <ESC>
cnoremap <C-space> <C-c>
" When in terminal, <C-Space> gets interpreted as <C-@>
imap <C-@> <C-space>
vmap <C-@> <C-space>
cmap <C-@> <C-space>
Like the others said, using inoremap
with the correct key for your term (as discovered using i_Ctrl_v) should work. I will add to this another possible cause for problems with insert mode mappings: paste mode. As the docs state:
When the 'paste' option is switched on (also when it was already on): - mapping in Insert mode and Command-line mode is disabled
This may seem irrelevant, but this very thing tripped me up trying to get a similar inoremap
binding to work in Vim 8.2. I had set paste
in my .vimrc, and had to chop it up with :finish
statements (as [recommended in the vim faq) to isolate the line causing the problem.
精彩评论