Why doesn't "map! <C-q> :q <CR> " work in vim? - vim

I input :map! <C-q> :q <CR> in command line mode, then return to normal mode, and press ctrl-q, but vim does not quit. Why?

As Johnsyweb suggested, Ctrl-Q does not reach Vim in the first place. This holds for the popular Ctrl-S as well. Both can be fixed by adding
silent !stty -ixon > /dev/null 2>/dev/null
to your .vimrc as it forces these control sequences to reach the application.

Why anyone would want to add yet another way of quitting Vim to the plethora already available is beyond me. However...
On Fedora 15, Ctrl-Q is likely being captured by your terminal as XON (resume) and therefore not reaching Vim to quit the application.
You can check if there's an error in your mapping or a clash like so:
:verbose map! <C-Q>
:map! is for specifing mappings in insert and command-line modes.
normal-mode mappings are (usually) specified like so:
:nmap <C-Q> :q<CR>

Related

Remap Esc in Command Line Mode for Vim

I want to use <leader>e to return to normal mode from whatever mode I am in. For insert mode I use
inoremap <leader>e <esc>
I wanted the same thing to exit command line mode, so I wrote
cnoremap <leader>c <esc>
However, when it exits command line mode, it tries to execute whatever what written past the command line. However, when I just use <esc> normally, it exists command line mode without executing anything. I usually have to press <enter> to execute the command.
Can anyone help me understand what is going on here, and what I can do to get the behavior I want.
Thanks!
According to help:
CTRL-[ *c_CTRL-[* *c_<Esc>* *c_Esc*
<Esc> When typed and 'x' not present in 'cpoptions', quit
Command-line mode without executing. In macros or when 'x'
present in 'cpoptions', start entered command.
It seems "in macros" applies to right-hand side of a mapping too (well, it's not "typed"). You can use CTRL-C instead as it will never execute the command:
*c_CTRL-C*
CTRL-C quit command-line without executing
So just do:
cnoremap <leader>c <c-c>

Why is vim starting in delete mode?

As stated in the question, my vim starts out in delete mode. If I open a file and hit j to start navigating, that'll delete the first line.
I've isolated the problem down to this line in my .vimrc:
nnoremap <silent> <esc> :noh<return><esc>
I don't understand why this would even trigger delete mode. On top of that, I believe I added <silent> to instruct vim to make this binding without executing it, which doesn't seem to be the case.
What's the explanation for why this is happening?
(side note, this mapping is to tell vim to clear search highlights when I hit esc)
If you run this command in terminal:
$ vim file.txt -c 'nnoremap <silent> <esc> :noh'
It'll show this at the bottom:
:noh[>1;3201;0c
vim enters change-mode somehow.
You can change <esc> to <F5>(or other keys).
If you use gvim, there's no problem.
It's caused by terminal special key escaping.

Move forward/backwards one word in command mode?

Lets say I am copying a file with the vim command mode and my cursor is at the end of the line.
:!cp path/to/original/file path/to/new/file
Is there a way I can jump back a word like I can in the shell by typing Esc b?
You cannot use "Esc b" because, obviously, that would discard the command you where typing. However you can bind some keys to move around.
The question as already be answered here : Navigating in Vim's Command Mode
The easy way is just to add :
cnoremap <C-a> <Home>
cnoremap <C-e> <End>
cnoremap <C-p> <Up>
cnoremap <C-n> <Down>
cnoremap <C-b> <Left>
cnoremap <C-f> <Right>
cnoremap <M-b> <S-Left>
cnoremap <M-f> <S-Right>
In your .vimrc
For entering and editing complex commands, you may like working directly in the command line window which is accessed with the normal mode command q:. See :h 20.5 and :h q:. Or if you are already in command mode, you can access the command line window with C-f.
For example, in normal mode type q: to get into the command line window. (or type C-f from command line mode.
You can move around previous commands using standard motions and you can edit as usual.
When you want to execute a command that you just edited, press enter in normal mode in
this command line window. The line your cursor is on will be executed as a command in
the window you were in before you opened the command line window.
Another option to consider is to edit/yank the command from another buffer. You can do this by yanking the desired text and pasting it in command mode by typing C-R n, where n is the register you yanked to.
BTW: I like the mappings that #rks provided. But if you don't have these mappings, you can use the out of the box commands. Look up :h c_<S-Left> and :h c_<S-Right> and :h 20.1.
A nice vim feature is ctrl-f. Typing ^f (or whatever key is specified in the cedit option, with ctrl-f being the default) from command line mode has the same effect as typing q: from normal mode; it pulls your entire command history into a window and lets you edit it as a buffer. Try :help cmdwin for more details.
In vim's command mode, I just use ctrl-left and ctrl-right arrows. The same works in bash - I wasn't aware of the esc-b method there.
No editing of the .vimrc file is required for this on my Ubuntu and Debian systems, but YMMV on others. It's presumably based on the standard configuration that's packaged for the OS

vimrc help : trying to map Ctrl-s to :w

My current .vimrc file is
syntax on
colorscheme zellner
set nu
set ruler
set si "Smart indet
map <C-s> :w<cr>
I thought the last line would allow me to hit control-s to automatically save while in normal mode?
{
The last line is just the trim downed version of what I really want which is
map <C-s> <esc>:w<cr>a
}
Am I forgetting something?
I'm using vim 7.3 that came with my mac.
Like mentioned if you want it on both modes you have to just put
inoremap <C-s> <esc>:w<cr>a
nnoremap <C-s> :w<cr>a
in your .vimrc.
But note that if you are using the terminal vim then you might have a problem
mapping ctrl-s. By default it stops the flow. In that case add the following to your .bashrc (not sure if the same problem in zsh):
stty -ixon
If I got it right, you want
:inoremap <C-s> <esc>:w<cr>a
Whoops, just read you want it in normal mode
:nnoremap <C-s> :w<cr>
When you're writing commands in vim files (like .vimrc) you don't need the :. It is only a method of entering commands on the command line.

In vim how to map "save" to ctrl-s

In vim, how can I map "save" (:w) to ctrl-s.
I am trying "map" the command, but xterm freezes when I press ctrl-s.
If I give ctrl-v,ctrl-s still I see only a ^, not ^S.
Ctrl+S is a common command to terminals to stop updating, it was a way to slow the output so you could read it on terminals that didn't have a scrollback buffer. First find out if you can configure your xterm to pass Ctrl+S through to the application. Then these map commands will work:
noremap <silent> <C-S> :update<CR>
vnoremap <silent> <C-S> <C-C>:update<CR>
inoremap <silent> <C-S> <C-O>:update<CR>
BTW: if Ctrl+S freezes your terminal, type Ctrl+Q to get it going again.
In linux with VI, you want to press Ctrl-S and have it save your document. This worked for me, put the following three lines in your .vimrc file. This file should be located in your home directory: ~/.vimrc. If this file doesn't exist you can create it.
:nmap <c-s> :w<CR>
:imap <c-s> <Esc>:w<CR>a
The first line says: pressing Ctrl-S within a document will perform a :w <enter> keyboard combination.
The second line says: pressing Ctrl-S within a document while in 'insert' mode will escape to normal mode, perform a :w <enter, then press a to get back into insert mode. Your cursor may move during this event.
You may notice that pressing Ctrl-S performs an 'XOFF' which stops commands from being received (If you are using ssh).
To fix that, place these two commands in your ~/.bash_profile
bind -r '\C-s'
stty -ixon
What that does is turn off the binding of Ctrl-S and gets rid of any XOFF onscreen messages when pressing Ctrl-S. Note, after you make changes to your .bash_profile you have to re-run it with the command 'source .bash_profile' or logout/login.
More Info: http://vim.wikia.com/wiki/Map_Ctrl-S_to_save_current_or_new_files
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 (if you use)
# ~/.zshrc
# enable control-s and control-q
stty start undef
stty stop undef
setopt noflowcontrol
bash (if you use)
# ~/.bash_profile or ~/.bashrc
# enable control-s and control-q
stty -ixon
Mac OSX Terminal + zsh?
In your .zprofile
alias vim="stty stop '' -ixoff; vim"
Why?, What's happening? See Here, but basically for most terminals ctrl+s is already used for something, so this alias vim so that before we run vim we turn off that mapping.
In your .vimrc
nmap <c-s> :w<cr>
imap <c-s> <esc>:w<cr>a
Why? What's happening? This one should be pretty obvious, we're just mapping ctrl+s to different keystrokes depending on if we are in normal mode or insert mode.

Resources