History
Article Edit this page Discussion

Highlight current line

From Vim Tips Wiki

(Redirected from VimTip769)
Jump to: navigation, search

This tip is deprecated for the following reasons:

In Vim 7 you can put ":set cursorline" in your vimrc.

[edit] Duplicate tip

This tip is very similar to the following:

These tips need to be merged – see the merge guidelines.

Tip 769 Previous Next Created: August 14, 2004 Complexity: intermediate Author: Aditya Mahajan Version: 6.0


There is another tip VimTip421 and a script script#555 on how to highlight the current line. But I think that this is much simpler than those.

\%# matches to the current cursor position. Using this one can highlight the whole line

syntax match CurrentLine /.*\%#.*/
hi link CurrentLine Visual

or

hi CurrentLine guifg=white guibg=lightblue

To switch off the highlightline, simply do

syntax match CurrentLine "NONE"

[edit] Comments

I had intended this tip to highlight the current line even when you move the cursor. In my system, this is working. That is, when I move the cursor, the line I am in is getting highlighted. But on reading the documentation carefully (help cursor-position), I realized that this should not work. I do not know why it is working here (for both console vim and GUI), perhaps some setting that I have set, or the screen refreshing routine has changed in vim 6.3

Try refreshing the screen with CTRL-L , something like

nmap j :normal! j<CR><C-L>

and so on for jkl <Up> <Down> <Left> <Right>. But this can cause flickering of the screen, if you are using vim over a telnet or ssh session.


I decided that this was a useful idea so I added the following function and map to my VIMRC file. It uses the CursorHold autocommand to recreate the syntax match. This allows the command to work even when you change to a new file or update the syntax.

function! HighlightCurrentLine()
  if ! exists("g:CurrentLineUpdateTime")
    syntax match CurrentLine /.*\%#.*/
    highlight link CurrentLine Visual
    let g:CurrentLineUpdateTime = &updatetime
    set updatetime=50
    augroup CurrentLine
      au!
      au CursorHold * nested syntax clear CurrentLine | syntax match CurrentLine /.*\%#.*/ containedin=ALL
    augroup END
  else
    highlight CurrentLine NONE
    windo syntax clear CurrentLine
    augroup CurrentLine
      au!
    augroup END
    exe 'set updatetime=' . expand(g:CurrentLineUpdateTime)
    unlet g:CurrentLineUpdateTime
  endif
endfunction
map <silent> <Leader>hl :call HighlightCurrentLine()<CR>

Using vim7 you can use this code to achieve the same:

augroup vim7highlightCurrentLineInActiveWindow
  au WinEnter * if g:HighlightCurrentLine | setlocal cul | endif
  au WinLeave * if g:HighlightCurrentLine | setlocal nocul | endif
augroup end
function! s:ToggleHighlightCurrentLine()
  if !exists('g:HighlightCurrentLine') || g:HighlightCurrentLine==0
    setlocal cul
    let g:HighlightCurrentLine=1
  else
    setlocal nocul
    let g:HighlightCurrentLine=0
  endif
endfunction
command! ToggleHighlightCurrentLine :call <SID>ToggleHighlightCurrentLine()

VimTip1293 is another simple script works for both insert and normal mode. I like it better because it highlights only the active window!


All the solutions I have tried including the scripts get slower and slower as time goes by. This seems to be because the highlighting doesnt clean up properly. This is how i "fixed" it.

let g:highlightnu = 0 " Turn off line highlighting initially
" Toggles current line highlighting
map <silent> <A-g> :call MapKeys()<CR>
" Highlight Current Line
fun! Highlight()
  syntax match CurrentLine /.*\%#.*/
  highlight link CurrentLine Visual
endfun
" Function to move down while highlighting
fun! MvDwn()
  call Clean()
  call cursor((line(".")+1),col("."))
  call Highlight()
endfun
" Function to move down while highlighting
fun! MvUp()
  call Clean()
  call cursor((line(".")-1),col("."))
  call Highlight()
endfun
" Function to clean the highlighting (This is why this script doesn't slow down)
fun! Clean()
  highlight CurrentLine NONE
  windo syntax clear CurrentLine
endfun
" Function to map keys and toggle the highlighting
fun! MapKeys()
  if g:highlightnu == 0
    map <silent> j :call MvDwn()<CR>
    map <silent> k :call MvUp()<CR>
    map <silent> <Up> :call MvUp()<CR>
    map <silent> <Down> :call MvDwn()<CR>
    let g:highlightnu = 1
  elseif g:highlightnu == 1
    unmap j
    unmap k
    unmap <Up>
    unmap <Down>
    call Clean()
    let g:highlightnu = 0
  endif
endfun

Rate this article:

Share this article:

Hubs Highlights International Sites Wikia messages
Entertainment
Gaming
Cartoons & Comics
Science Fiction
Hobbies
Sports
See all...
Grand Theft Auto
Doctor Who
Legend of Zelda Wiki
Terminator Wiki
Everquest II Wiki
Mystery Science Theater 3000
German
Spanish
Chinese
Japanese
More...
Wikia is hiring for several open positions
Send this article to a friend
"Highlight current line"
 
 
Hi!

I thought you'd like this page from Wikia!

http://vim.wikia.com

Come check it out!
Send confirmation