использование переменных и выражений в команде поиска и замены - PullRequest
1 голос
/ 21 сентября 2011

Я пытаюсь настроить некоторые сочетания клавиш / макросы для комментирования / раскомментирования блоков текста в моем .vimrc, но мне не удается заставить его работать.

Я определяю некоторые переменные:

let g:comment_id='~'
autocmd BufRead,BufNewFile *.c,*.cpp,*.cxx,*.h,*.hpp,*.hxx,*.ipp let b:comment_open='//'
autocmd BufRead,BufNewFile *.f90,*.F90 let b:comment_open='!'

А потом я пробую разные способы их использования, но каждый раз, когда это не удается:

noremap <silent> ,cc :s/^/<C-R>=(b:comment_open.g:comment_id)/<CR>:nohlsearch<CR>
noremap <silent> ,uc :s/<C-R>=(b:comment_open.g:comment_id)//<CR>:nohlsearch<CR>

-> E15: недопустимое выражение: /, E15: недопустимое выражение: (b: comment_open.g: comment_id) //

noremap <silent> ,cc :s/^/<C-R>=(b:comment_open.g:comment_id)<CR>/<CR>:nohlsearch<CR>
noremap <silent> ,uc :s/<C-R>=(b:comment_open.g:comment_id)<CR>//<CR>:nohlsearch<CR>

-> E488: завершающие символы

noremap <silent> ,cc :s/^/\=(b:comment_open.g:comment_id)/<CR>:nohlsearch<CR>
noremap <silent> ,uc :s/\=(b:comment_open.g:comment_id)//<CR>:nohlsearch<CR>

-> cc: ok, uc: E64: \ = ничего не следует, E476: недопустимая команда

Я на самом деле не могу понять, как 'CR' и \ = работают и значат ...

Спасибо за вашу помощь

1 Ответ

2 голосов
/ 21 сентября 2011

Использование:

nnoremap <silent> ,cc :s/^/\=b:comment_open.g:comment_id/<CR>:nohlsearch<CR>
nnoremap <silent> ,uc :s@\V<c-r>=escape(b:comment_open.g:comment_id,'\@')<cr>@@<cr>:nohlsearch<cr>

Ссылка: :help sub-replace-expression

В паттерне необходимо включить очень ненамного, чтобы избежать всех специальных символов, и даже при этом вам необходимо экранировать как разделитель, так и обратную косую черту.

...