Có cách nào dễ dàng để chuyển đổi "do/end" và "{}" trong ruby trong Vim?Có cách nào dễ dàng để chuyển đổi "do/end" và "{}" trong ruby trong Vim?
(TextMate thực hiện điều này với ^{
.)
Có cách nào dễ dàng để chuyển đổi "do/end" và "{}" trong ruby trong Vim?Có cách nào dễ dàng để chuyển đổi "do/end" và "{}" trong ruby trong Vim?
(TextMate thực hiện điều này với ^{
.)
Bạn sẽ phải hoặc là sử dụng searchpair(), hoặc để chơi với% (miễn là matchit được cài đặt, và như bạn đang trên bắt đầu/kết thúc), sau đó đánh dấu hai vị trí, kiểm tra xem đó là văn bản hoặc dấu ngoặc và cuối cùng là cập nhật hai dòng.
nnoremap <buffer> <c-x>{ :call <sid>ToggleBeginOrBracket()<cr>
let s:k_be = [ 'begin', 'end' ]
function! s:ToggleBeginOrBracket()
let c = lh#position#char_at_mark('.')
if c =~ '[{}]'
" don't use matchit for {,}
exe 'normal! %s'.s:k_be[1-(c=='}')]."\<esc>``s".s:k_be[(c=='}')]."\<esc>"
else
let w = expand('<cword>')
if w == 'begin'
" use mathit
normal %
exe "normal! ciw}\<esc>``ciw{\<esc>"
elseif w == 'end'
" use mathit
normal %
exe "normal! ciw{\<esc>``ciw}\<esc>"
else
throw 'Cannot toggle block: cursor is not on {, }, begin, nor end'
endif
endif
endfunction
Trường hợp lh#position#char_at_mark()
được định nghĩa here.
PS: đây chắc chắn là câu hỏi SO vì nó kết hợp ngữ cảnh ruby và tập lệnh vim nâng cao.
Khám phá plugin mới này: https://github.com/jgdavey/vim-blockle.
30 chars pad
Có một plugin splitjoin.vim mà thực hiện điều này độc đáo (GJ/GS ánh xạ cho tách/tham gia).
Vâng, không có lý do gì cho giải pháp phức tạp. Chỉ cần sử dụng matchit.vim. :) – graywh
Khớp không giải quyết yêu cầu của OP. (Và thậm chí không có vim được giới thiệu, nó vẫn còn liên quan đến việc điều chỉnh một công cụ phát triển, cho các mục đích phát triển) –