55

Edit: The problem of an enabled mouse in vim appears to be specific to gnome-terminal (version 3.4.1.1-1; I am using gnome 3 fallback mode). If I run xterm, mouse support in vim is disabled by default, and I have the option to enable it (:set mouse=a, which I never do) and disable it (:set mouse=). In contrast, when I run vim in gnome-terminal, mouse support is enabled by default and it is not possible to disable it (:set mouse= has no effect). Is there a solution short of changing terminal emulator?


I want to completely disable mouse support in vim. I am running vim version 2:7.3.547-3 through gnome-terminal version 3.4.1.1-1. The following commands, whether executed directly in vim or added to my .vimrc file, fail to disable mouse support:

set mouse =
set mouse =""

Based on reading the vim manual and posts online, one or both of these commands should work. In particular, the vim manual states the following

'mouse'                 string  (default "", "a" for GUI, MS-DOS and Win32)
    The mouse can be enabled for different modes:
            n       Normal mode
            v       Visual mode
            i       Insert mode
            c       Command-line mode
            h       all previous modes when editing a help file
            a       all previous modes
            r       for |hit-enter| and |more-prompt| prompt 
    Normally you would enable the mouse in all four modes with: >
            :set mouse=a
    When the mouse is not enabled, the GUI will still use the mouse for
    modeless selection.  This doesn't move the text cursor.

I am using a laptop and each time my hand brushes the trackpad, my cursor position in vim moves abruptly.

8 Answers 8

32

I've found what cause this bad behavior with many linux flavors :

/usr/share/vim/vim80/defaults.vim # may be "vim81" depending on your vim version

it's 'sourced' if there's no ~/.vimrc but even if you have a /etc/vimrc or such /etc file, so if you don't have one just create a blank one as suggested by @lgpasquale:

mkdir ~/.vim/; [[ -s ~/.vim/vimrc ]] && echo "aborted, file exists" || :> ~/.vim/vimrc

If you liked the other features (like syntax highlighting) that you got from defaults.vim, you can use this command rather the the previous one:

mkdir ~/.vim/; [[ -s ~/.vim/vimrc ]] && echo "aborted, file exists" || echo -e "source /usr/share/vim/vim80/defaults.vim\nset mouse=" > ~/.vim/vimrc
10
  • 2
    Thank you! Commenting out the line "mouse -a" in that file solved the issue for me (on Archlinux)
    – luckyrumo
    Nov 3, 2016 at 20:57
  • 2
    You don't need to edit that file (which is part of vim-runtime on archlinux). As it's stated in that file, it is only loaded if no vimrc is found. That means that placing a .vimrc file in your home should solve the problem (it did for me). It doesn't need to contain anything, it can even be an empty file.
    – lgpasquale
    Dec 13, 2016 at 22:28
  • This is the real solution for Fedora 25.
    – KamikazeCZ
    Dec 14, 2016 at 12:24
  • I confirm this worked for me in Debian 8 in late 2017.
    – Criggie
    Jan 6, 2017 at 8:30
  • 1
    @rlf In my opinion editing a file under /usr/share/ which is managed by your package manager is a bad idea. If you want to keep some of the options in defaults.vim, I would copy them to ~/.vimrc.
    – lgpasquale
    Jun 23, 2017 at 15:08
27

mouse support is disabled by default, so something is turning it on. Likely the reason your set mouse= is failing is because it's running before whatever is turning it on. I'd look through the rest of your vimrc, and possibly the system wide vimrc (/etc/vim/vimrc is a standard location).

As a last resort, you can do this really ugly hack which will cause the command to run as one of the last things done before giving you control of the editor.

autocmd BufEnter * set mouse=
7
  • 2
    My /etc/vim/vimrc file is pretty bare (runtime! debian.vim and a conditional if filereadable("/etc/vim/vimrc.local") ; source /etc/vim/vimrc.local; endif). The /etc/vim/vimrc.local file does not exist on my system. My ~/.vimrc file only has a few lines that I have added manually. An strace of vim reveals that it checks the following locations for config files: /usr/share/vim/vimrc, /etc/vim/vimrc.local (ENOENT), and /home/user/.vimrc. (Why do I receive the ENOENT error; doesn't the if statement prevent attempts to open this non-existent file?).
    – user001
    Aug 2, 2012 at 1:38
  • Also, if I type :set mouse= directly in vim, shouldn't this override any settings from config files? Why would direct execution of this statement within vim not disable mouse control?
    – user001
    Aug 2, 2012 at 1:40
  • 1
    @user001 You see the ENOENT as vim has to check if the file exists. This is typically done by calling stat which returns ENOENT if the file does not exist. Aug 2, 2012 at 5:29
  • 2
    @user001 ah, the fact that it doesnt work when typed into the current session is critical info. Based on this, I'm not sure it's vim that's the problem. Maybe gnome-terminal is doing something horrible. Can you try a different terminal emulator?
    – phemmer
    Aug 2, 2012 at 12:30
  • Hi, good suggestion. I tried in xterm and had no problem with mouse activation. I could reproduce the problem by typing :set mouse=a in vim running in xterm (and reverse it by typing :set mouse=). Any idea how to troubleshoot the gnome-terminal glitch? Should I start a new thread? Thanks.
    – user001
    Aug 2, 2012 at 12:54
11

I ran into this on my OS X "Terminal" app on a Fedora Server 25 host. I've permanently solved it with this in my .vimrc with:

set mouse=
set ttymouse=

Now I can scroll up to my previous bash history in my terminal's scrollback with my mouse.

3
  • It is strongly recommended to create a vimrc.local in the same catalogue, because vimrc.local wont be updated if vim get updates
    – Orphans
    Aug 22, 2017 at 9:57
  • It worked for me on Raspbian 9.4. Other answers did not solve undesired mouse behaviour when I log in via PUTTY.
    – Dmitry
    Sep 22, 2018 at 21:53
  • For anyone else cutting and pasting, note set ttymouse= had strange behaviour for me, e.g. caused behaviour of arrow keys, escape key to change.
    – mozboz
    Jan 8, 2019 at 14:48
4

I had pretty much the same complaints as you about the newer Vim's sensitivity to the mouse. Using set mouse="" did not do it for me, either.

I have set mouse=c (no quotes) close to the bottom of my .vimrc file. That seemed to keep Vim from using the mouse, except when using "PuTTY" to ssh in from my (ugh!) Windows machine at work. I have to use shift-middle-button to paste in PuTTY.

2018-03-30 Edit: I have now started using: :mouse= (no quotes or anything) on some remote (CentOS 6.7) instances of vim to get rid of undesired mouse effects.

1
  • Hi, thanks for the suggestion. I added this to my .vimrc file and tried executing it interactively (:set mouse=c), but neither had an effect in my case.
    – user001
    Aug 2, 2012 at 2:14
4

On debian stretch some central settings are loaded after loading /etc/vim/vimrc and /etc/vim/vimrc.local. See /etc/vim/vimrc:

...
" Vim will load $VIMRUNTIME/defaults.vim if the user does not have a vimrc.
" This happens after /etc/vim/vimrc(.local) are loaded, so it will override
" any settings in these files.
" If you don't want that to happen, uncomment the below line to prevent
" defaults.vim from being loaded.
"let g:skip_defaults_vim = 1
...

This file defaults to /usr/share/vim/vim80/defaults.vim. Now changing a central file under /usr/share/... is

  • evil
  • non-permanent, it gets reverted after an update

Setting skip_defaults_vim by uncommentig the above line removes all other options set by that file. To just remove the unwanted options put the following into /etc/vimrc.local:

" /etc/vim/vimrc.local
" honor skip_defaults_vim from the master /etc/vim/vimrc file
if ! exists('skip_defaults_vim')
  " Source the defaults file manually from here
  source $VIMRUNTIME/defaults.vim
endif

" avoid loading the defaults twice
let g:skip_defaults_vim = 1

" revert any unwanted changes the defaults file introduced
set mouse=

" set any other options you want centrally on your system
"set paste " uncomment if you want paste insert enabled
"...

This loads the defaults.vim manually and turns off the automatic loading, thus giving you a chance to revert any unwanted settings, without having to create a .vimrc for every user account.

1
  • Your answer finally gave me a real solution to my problems in Debian 10 "Buster". Thanks a lot.
    – aef
    Oct 2, 2019 at 14:04
3

Add this to your .vimrc:

if has("gui_running")
    "echo "yes, we have a GUI"
    set mouse=a
else
    "echo "Boring old console"
    set mouse=
endif
4
  • 1
    This is of no relevance to the question asked.
    – GKFX
    Sep 24, 2016 at 19:54
  • @GKFX Are you sure? It looks relevant to me. Note that has("gui_running") is 0 in a terminal environment. This answer, unlike the others, takes extra effort to only disable the mouse in a terminal environment, which the question asks, while leaving it enabled in gvim.
    – hvd
    Jul 29, 2017 at 6:23
  • @hvd I worded my comment a bit harshly; I apologize. However, this answer just puts an if block around what the OP had already tried, so it's unlikely to be helpful.
    – GKFX
    Jul 29, 2017 at 13:15
  • 1
    @GKFX Fair point, and applies to other answers as well.
    – hvd
    Jul 29, 2017 at 13:23
0

Somewhat related to the question, if you are using neovim(nvim) you should put set mouse= in your ~/.config/nvim/init.vim configuration file.

If the directory doesn't exist create it with mkdir -p ~/.config/nvim/

0

The best option so far that I've found is from another question that happens to address the same mouse option override.

Add to your local ~/.vimrc:

source $VIMRUNTIME/defaults.vim
set mouse-=a

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.