I'm trying to cerate a function who toggle a block of code into comments. I did this:
" Commenting blocks of code. filetype on augroup commentgroup autocmd FileType c,cpp,java,scala let b:comment_leader = '//' autocmd FileType sh,ruby,python let b:comment_leader = '#' autocmd FileType conf,fstab let b:comment_leader = '#' autocmd FileType tex let b:comment_leader = '%' autocmd FileType mail let b:comment_leader = '>' autocmd FileType vim let b:comment_leader = '"' augroup END fun! TestFunc() if (synIDattr(synID(line("."), col("."), 0), "name") =~ 'comment\c') exe ':s/^'escape(b:comment_leader,'\/')'//e' else exe ':s/^/'escape(b:comment_leader,'\/')'/e' endif endfun map <C-t> :call TestFunc() <CR>
It's inspired from this answer to get the comment character depending the file type, and this answer to get the condition who permit to know if we are in a commented line.
The problem is, it add spaces around the
escape(...) part, and in
C language if the
// is not at the first column, it's not considered as commented. So, this function is always commenting, and never uncommenting.
I thought to use a variable like:
let var=escape(b:comment_leader,'\/') exe ':s/^/var/e'
But it's considered as text, not as a variable. And I don't know if we can use a variable in a command like this.
So, is there a way to achieve what I'm trying to do ?