3

I want colocolumn to be 80 by default for all buffers, but if textwidth is set (and not 0) for a buffer, then I want colorcolumn to be +0.

I know this could be done by just setting tw to 80 in my .vimrc but I do not want a max line length because the auto line breaks can easily lead to syntax errors.

I have tried using an autocmd to set the colorcolumn option whenever the tw changes but the problem with this is that the OptionSet event does not fire when vim starts up, so any tw settings by some file-type plugin would not change the colorcolumn setting.

autocmd! OptionSet textwidth call s:SetColorColumn()
function! s:SetColorColumn()
    if &textwidth == 0
        setlocal colorcolumn=80
    else
        setlocal colorcolumn=+0
    endif
endfunction

When using the FileType event, the problem is similar. Although it fires on startup it fires when the filetype is set but before the ftplugin files were sourced so the tw was not yet set.

Is there any way I can accomplish this or will I just have to set textwidth or just live with colorcolumn being 80 all the time?


I'm using vim 8.0.0086 from the terminal.

And here is the output of vim --version (just in case):

VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Nov 15 2016 18:04:06)
Included patches: 1-86
Compiled by Arch Linux
Huge version with GTK2 GUI.  Features included (+) or not (-):
+acl             +file_in_path    +mouse_sgr       +tag_old_static
+arabic          +find_in_path    -mouse_sysmouse  -tag_any_white
+autocmd         +float           +mouse_urxvt     +tcl/dyn
+balloon_eval    +folding         +mouse_xterm     +termguicolors
+browse          -footer          +multi_byte      +terminfo
++builtin_terms  +fork()          +multi_lang      +termresponse
+byte_offset     +gettext         -mzscheme        +textobjects
+channel         -hangul_input    +netbeans_intg   +timers
+cindent         +iconv           +num64           +title
+clientserver    +insert_expand   +packages        +toolbar
+clipboard       +job             +path_extra      +user_commands
+cmdline_compl   +jumplist        +perl/dyn        +vertsplit
+cmdline_hist    +keymap          +persistent_undo +virtualedit
+cmdline_info    +lambda          +postscript      +visual
+comments        +langmap         +printer         +visualextra
+conceal         +libcall         +profile         +viminfo
+cryptv          +linebreak       +python/dyn      +vreplace
+cscope          +lispindent      +python3/dyn     +wildignore
+cursorbind      +listcmds        +quickfix        +wildmenu
+cursorshape     +localmap        +reltime         +windows
+dialog_con_gui  +lua/dyn         +rightleft       +writebackup
+diff            +menu            +ruby/dyn        +X11
+digraphs        +mksession       +scrollbind      -xfontset
+dnd             +modify_fname    +signs           +xim
-ebcdic          +mouse           +smartindent     -xpm
+emacs_tags      +mouseshape      +startuptime     +xsmp_interact
+eval            +mouse_dec       +statusline      +xterm_clipboard
+ex_extra        +mouse_gpm       -sun_workshop    -xterm_save
+extra_search    -mouse_jsbterm   +syntax          
+farsi           +mouse_netterm   +tag_binary      
   system vimrc file: "/etc/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  system gvimrc file: "/etc/gvimrc"
    user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
    system menu file: "$VIMRUNTIME/menu.vim"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK  -pthread -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/libdrm -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/pango-1.0 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -D_FORTIFY_SOURCE=2  -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1       
Linking: gcc   -L. -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-rpath,/usr/lib/perl5/core_perl/CORE  -Wl,-O1,--sort-common,--as-needed,-z,relro -L/usr/local/lib -Wl,--as-needed -o vim   -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lSM -lICE -lXt -lX11 -lXdmcp -lSM -lICE  -lm -lncurses -lelf -lnsl    -lacl -lattr -lgpm -ldl   -Wl,-E -Wl,-rpath,/usr/lib/perl5/core_perl/CORE -Wl,-O1,--sort-common,--as-needed,-z,relro -fstack-protector-strong -L/usr/local/lib  -L/usr/lib/perl5/core_perl/CORE -lperl -lpthread -lnsl -ldl -lm -lcrypt -lutil -lc   -L/usr/lib -ltclstub8.6 -ldl -lz -lpthread -lieee -lm     

1 Answer 1

4

You're on the right track, you just need to add the same function to the BufEnter autocmd:

set textwidth=0

function! s:SetColorColumn()
    if &textwidth == 0
        setlocal colorcolumn=80
    else
        setlocal colorcolumn=+0
    endif
endfunction

augroup colorcolumn
    autocmd!
    autocmd OptionSet textwidth call s:SetColorColumn()
    autocmd BufEnter * call s:SetColorColumn()
augroup end

From :help BufEnter:

BufEnter                        After entering a buffer.  Useful for setting
                                options for a file type.  Also executed when
                                starting to edit a buffer, after the
                                BufReadPost autocommands.
5
  • Must have totally skipped over that event when reading the docs, works like a charm. Minor issue: the OptionSet event does not seem to fire when I set the file type myself while editing and the plugin changes the textwidth, do you know of any event that could handle such a case? I'm going to accept this answer though, because that's not something that's going to happen very often. Commented Nov 24, 2016 at 17:01
  • @patrick96 I think you're looking for the FileType event? autocmd FileType * call s:SetColorColumn(). Commented Nov 24, 2016 at 17:09
  • unfortunately not. FileType fires when setting the file type but before the file type plugins are sourced Commented Nov 24, 2016 at 17:11
  • @patrick96 It's probably best to update the question with the commands your using and contents of the file you're sourcing, so I (or someone else) can reproduce the problem and fix it. Commented Nov 24, 2016 at 17:26
  • It's alright. Changing the filetype while editing is something that rarely ever happens and if it does you can just either reload the file or set tw manually Commented Nov 24, 2016 at 17:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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