I want to do the following maps in my .vimrc.local
```
inoremap <C-H> <Left>
nnoremap <C-H> <C-W><C-H>
inoremap <C-J> <Down>
inoremap <C-K> <Up>
inoremap <C-L> <Right>
```
When I restart my vim, the fist two mapping failed, and the last three commands succeeded. However, when I source ~/.vimrc.local, then all the five mapping methods are OK. That means, I need to load my .vimrc.local myself.
I've already write source ~/.vimrc.local in my .vimrc . And if I source ~/.vimrc rather than .vimrc.local, it works as well.
What's wrong with my mapping? Is there any conflict? I searched in my .vimrc and .vimrc.local, but didn't find conflicts.
I'm using OS X 10.9 and MacVim Snapshot 71, and the main .vimrc from spf13. There are my .vimrc and .vimrc.local.
How can I do the mapping without manually reload .vimrc?
Thanks!
Related
I have the following in my .vimrc
nnoremap <c-h> zh
nnoremap <c-j> <c-e>
nnoremap <c-k> <c-y>
nnoremap <c-l> zl
and nmap reports the following mappings
n <C-H> * zh
n <NL> * <C-E>
n <C-K> * <C-Y>
n <C-L> * zl
The main problem I have is that <c-h> hasn't actually been remapped to zh. <c-h> still acts as the default behavior, which just moves the cursor left.
I've done this in a clean .vimrc file so it's not due to a plugin collision. This is happening with vim 7.4 on a redhat 7.2 system that I remote into from putty. I've tried to replicate this on my windows machine using WSL but it works as expected there.
The minor problem is the second row of nmap, why does it say <NL> instead of <C-J> The mapping seems to be behaving as expected.
I ask this question generally, but I will put it in terms of the specific problem I'm having.
I'm using the vim-lawrencium plugin for a project under Mercurial source control. I use the :Hgstatus command to open the status buffer.
The status buffer comes with some nice keymaps to make it easy to add files to the commit, look at diffs, and finalize the commit.
nnoremap <buffer> <silent> <cr> :Hgstatusedit<cr>
nnoremap <buffer> <silent> <C-N> :call search('^[MARC\!\?I ]\s.', 'We')<cr>
nnoremap <buffer> <silent> <C-P> :call search('^[MARC\!\?I ]\s.', 'Wbe')<cr>
nnoremap <buffer> <silent> <C-D> :Hgstatustabdiff<cr>
nnoremap <buffer> <silent> <C-V> :Hgstatusvdiff<cr>
nnoremap <buffer> <silent> <C-U> :Hgstatusdiffsum<cr>
nnoremap <buffer> <silent> <C-H> :Hgstatusvdiffsum<cr>
nnoremap <buffer> <silent> <C-A> :Hgstatusaddremove<cr>
nnoremap <buffer> <silent> <C-S> :Hgstatuscommit<cr>
nnoremap <buffer> <silent> <C-R> :Hgstatusrefresh<cr>
nnoremap <buffer> <silent> q :bdelete!<cr>
Most of these seem to work. I've successfully tried diffing, adding, and q to close the status, but the <C-S> shortcut doesn't work at all. I can manually run the :Hgstatuscommit command it's mapped to. I've also looked at :map to verify the key is actually mapped for that buffer, and it does show up in the list.
What is my next step in debugging this? I want to fix this specific problem, but I also want to know how to fix it in the event I run across broken shortcuts in the future. I'm new to Vim, so I'm at a bit of a loss at this point.
UPDATE: Output of :verbose map <C-S>
v <C-S> *#:Hgstatuscommit<CR>
Last set from ~/.spf13-vim-3/.vim/bundle/vim-lawrencium/plugin/lawrencium.vim
n <C-S> *#:Hgstatuscommit<CR>
Last set from ~/.spf13-vim-3/.vim/bundle/vim-lawrencium/plugin/lawrencium.vim
SOLUTION: Turned out the problem was that my shell was intercepting Ctrl-S and it was never getting to Vim.
I added a Vim alias to my .zshrc to fix:
alias vim="stty stop '' -ixoff ; vim"
ttyctl -f
Found the fix on the Vim Wikia which also has a solution for bash shells.
Software Flow Control
If you are using using a terminal then it is often the case that <c-s> is being used for terminal's software flow control (XON/XOFF). Which makes <c-s> a trickier key to map.
Turn off flow control by adding the following to some startup script (e.g. ~/.bash_profile or ~/.bashrc):
stty -ixon
If you have frozen your terminal then you can unfreeze it by pressing <c-q>.
Generic map debuging
You can debug pretty much any custom vim mapping via the following command:
:verbose map
This will list out each key/chord ({lhs}) maps to what command ({rhs}), mode, and file the mapping was sourced from. For more information on this listing see :h map-listing and :h :map-verbose.
We can filter this list in a few ways:
Supplying a mode. e.g. :verbose nmap for normal mode and :verbose imap for insert mode.
Proving the key we want to query for. e.g :verbose nmap <c-s>
Can also see buffer specific mappings by adding <buffer>. e.g. :verbose nmap <buffer> <c-s>
So for your question the best way to debug what your mapping is set to would be to run the following query:
:verbose nmap <buffer> <c-s>
Note: Vim's native command are not listed via :verbose map. The best way to find one of Vim's native commands is to help. See :h for more.
First, check that <C-S> still mapped to :Hgstatuscommit
map <C-S>
Hgstatuscommit calls s:HgStatus_Commit. Open its definition on line 1134 and put some debugging print outs:
echom a:linestart
echom a:lineend
echom a:bang
echom a:vertical
After using the mapping, check :messages.
I’d suspect that <C-S> is mapped to something else. You can use :map
<C-S> to check how (or if) its mapping is configured. Even better, you can
add the prefix to see where the mapping was set from, e.g., when I run
:verbose map <C-L>, the following is displayed:
<C-L> * :noh<CR><C-L>
Last set from ~/.vimrc
By contrast, I haven’t set a mapping for <C-S> so when I run, :map <C-S>,
I get:
No mapping found
Prepending verbose to a command is a useful general debugging technique as it can show where any Vim option was set, e.g., :verbose set background? shows what the background option is currently set to and which Vim configuration file it was set in:
background=dark
Last set from ~/.vimrc
I'm new to vim.
I'm using MacVim.
I use
:set number
which shows line numbers.
I've added
set number
to my vimrc, to make show line numbers by default.
My vimrc:
no <down> <Nop>
no <left> <Nop>
no <right> <Nop>
no <up> <Nop>
ino <down> <Nop>
ino <left> <Nop>
ino <right> <Nop>
ino <up> <Nop>
set number
But line numbers don't show up.
Everything in vimrc except set number works fine. What am I doing wrong?
Problem was that I had one .vimrc in the ~/ and one in the ~/.vim/.vimrc.
The one that was in the ~/ was overriding the one in in ~/.vim/.vimrc.
I'd comment but I'm not allowed :(
I usually have had that problem when either the file or the line is corrupted or has Ctrl characters or in someversions of Unix if there was a space in the wrong place
try :set list and make sure there isn't a Tab, missing Line Feed or something
There's a way of viewing the Control Characters that don't display in :set list but can't remember it.
Shove comes to push delete the line and the one above and below. Save and retype it andsee if it fixes it.
I love the dragvisuals vim plugin introduced in Damien Conway's OSCON 2013 talk. There is a github clone for the plugin here: https://github.com/atweiden/vim-dragvisuals. The problem is I can't get it to work. Here are the steps that I have taken:
1.Drop the script in my $VIMRUNTIME/plugin path and added the relevant settings to my .vimrc
ru plugin/dragvisuals.vim
vmap <expr> <LEFT> DVB_Drag('left')
vmap <expr> <RIGHT> DVB_Drag('right')
vmap <expr> <DOWN> DVB_Drag('down')
vmap <expr> <UP> DVB_Drag('up')
vmap <expr> D DVB_Duplicate()
let g:dvb_trimws = 1
2.The script gets loaded successfully because it is output by :scriptnames
/vim/runtime/path/dragvisuals.vim
But all of the functions (DVB_Drag, DVB_Duplicate) are not loaded. Am I missing anything?
EDIT:
At first I tried putting the script in ~/.vim/plugin as well as as ~/.vim/bundle/vim-dragsvisual/plugin because I use vundle to manage my plugins. But it didn't work; that's why I put the script in $VIMRUNTIME as the last resort.
Start again by placing the plugin in ~/.vim/plugin and removing the ru plugin/dragvisuals.vim from your ~/.vimrc.
Installed correctly, that plugin seems to work perfectly and does exactly what it's supposed to do, here.
Never touch $VIMRUNTIME.
I have the following keys mapped in my .vimrc file:
noremap <silent> <C-h> :bprev<CR>
noremap <silent> <C-l> :bnext<CR>
The commands they execute are provided from the buftabs script.
What I would like to do is prevent those key mappings from being executed when I'm in the NERDTree split. The reason for this is if the commands are run while in NERDTree, a file buffer gets loaded in the split instead. Then, to fix it, the window needs to be closed and opened again.
This is a similar problem as explained in another question, but the problem there was corrected by configuring the plugin, while the buftabs script does not have such an option.
In order to disable a mapping in certain buffers, one can define
a buffer-local mapping for the same key sequence, overriding the
original mapping with a no-op:
:autocmd FileType nerdtree noremap <buffer> <c-h> <nop>
:autocmd FileType nerdtree noremap <buffer> <c-l> <nop>
(See :help :map-arguments and :help <nop> for details on
<buffer> and <nop>, respectively.)
I updated my vimrc by looking at ib.'s solution.
autocmd FileType nerdtree noremap <buffer> <A-PageDown> <ESC>:wincmd w <bar> bnext<CR>
autocmd FileType nerdtree noremap <buffer> <A-PageUp> <ESC>:wincmd w <bar> bprevious<CR>
It goes back to the previous window and executes the command.