Заставьте {и} игнорировать строки, содержащие только пробелы - PullRequest
16 голосов
/ 05 декабря 2009

Когда вы перемещаетесь по абзацу в vim, используя {и}, он пропускает строки, которые не содержат ничего, кроме пробелов, хотя в остальном они «пустые».

Как мне убедить vim трактовать строки "только пробелы" как разрывы абзаца, чтобы {и} к ним переходили?

Ответы [ 5 ]

6 голосов
/ 06 мая 2010

Вот модифицированная версия, которая обрабатывает счет правильно:

function! ParagraphMove(delta, visual, count)
    normal m'
    normal |
    if a:visual
        normal gv
    endif

    if a:count == 0
        let limit = 1
    else
        let limit = a:count
    endif

    let i = 0
    while i < limit
        if a:delta > 0
            " first whitespace-only line following a non-whitespace character           
            let pos1 = search("\\S", "W")
            let pos2 = search("^\\s*$", "W")
            if pos1 == 0 || pos2 == 0
                let pos = search("\\%$", "W")
            endif
        elseif a:delta < 0
            " first whitespace-only line preceding a non-whitespace character           
            let pos1 = search("\\S", "bW")
            let pos2 = search("^\\s*$", "bW")
            if pos1 == 0 || pos2 == 0
                let pos = search("\\%^", "bW")
            endif
        endif
        let i += 1
    endwhile
    normal |
endfunction

nnoremap <silent> } :<C-U>call ParagraphMove( 1, 0, v:count)<CR>
onoremap <silent> } :<C-U>call ParagraphMove( 1, 0, v:count)<CR>
" vnoremap <silent> } :<C-U>call ParagraphMove( 1, 1)<CR>
nnoremap <silent> { :<C-U>call ParagraphMove(-1, 0, v:count)<CR>
onoremap <silent> { :<C-U>call ParagraphMove(-1, 0, v:count)<CR>
" vnoremap <silent> { :<C-U>call ParagraphMove(-1, 1)<CR>
2 голосов
/ 04 сентября 2015

Как было сказано ранее, если вы запустите :help paragraph, вы увидите, что строки с пробелами не рассматриваются как граница.

В то же время есть два проекта плагинов, которые могут помочь:


Если вы используете Pathogen, просто скачайте с одного из сайтов, упомянутых выше.

Если вы используете Vundle, вставьте одно из следующих значений в .vimrc:

  • Улучшено движение абзаца:

    Bundle 'vim-scripts/Improved-paragraph-motion'
    
  • Движение абзаца Vim:

    Bundle 'dbakker/vim-paragraph-motion'
    

Запустите :BundleInstall после перезагрузки, и движения { } должны остановиться на строках, содержащих пробельные символы.

2 голосов
/ 10 марта 2010

Это то, что беспокоило меня долгое время. Вероятно, «правильным» решением было бы представить патч для самого vim, который позволил бы вам настраивать границы абзацев с помощью регулярного выражения (например: устанавливать абзацы, но на самом деле полезно).

Тем временем я создал функцию и пару сопоставлений, которые почти делают правильные вещи:

function! ParagraphMove(delta, visual)
    normal m'
    normal |
    if a:visual
        normal gv
    endif

    if a:delta > 0
        " first whitespace-only line following a non-whitespace character
        let pos1 = search("\\S", "W")
        let pos2 = search("^\\s*$", "W")
        if pos1 == 0 || pos2 == 0
            let pos = search("\\%$", "W")
        endif
    elseif a:delta < 0
        " first whitespace-only line preceding a non-whitespace character
        let pos1 = search("\\S", "bW")
        let pos2 = search("^\\s*$", "bW")
        if pos1 == 0 || pos2 == 0
            let pos = search("\\%^", "bW")
        endif
    endif
    normal |
endfunction

nnoremap <silent> } :call ParagraphMove( 1, 0)<CR>
onoremap <silent> } :call ParagraphMove( 1, 0)<CR>
" vnoremap <silent> } :call ParagraphMove( 1, 1)<CR>
nnoremap <silent> { :call ParagraphMove(-1, 0)<CR>
onoremap <silent> { :call ParagraphMove(-1, 0)<CR>
" vnoremap <silent> { :call ParagraphMove(-1, 1)<CR>

Это неправильно обрабатывает счет, например, '4} или в визуальном режиме (раскомментируйте строки vnoremap на свой страх и риск), но, похоже, подходит для таких вещей, как не загромождение текущего шаблона поиска и не мерцание. Кроме того, 'd}', 'y}' и т. Д., Кажется, работают нормально. Если у кого-то есть идеи, как сделать подсчет или исправить визуальный режим, пожалуйста, дайте мне знать.

1 голос
/ 05 декабря 2009

Команды {и} перемещаются по «абзацу», а документация vim (см. :help paragraph) гласит:

Обратите внимание, что пустая строка (только содержащий пробел) не является граница абзаца.

Так что единственный способ сделать это - переназначить {и}. Что-то вроде:

nmap { ?^\\s*$<CR>
nmap } /^\\s*$<CR>

может работать, но вы можете настроить это так, чтобы оно не изменило историю поиска.

0 голосов
/ 12 декабря 2009

У меня никогда не было законной потребности в строках, состоящих только из пробелов, поэтому я решил эту «проблему», добавив следующее к своему .vimrc:

" Highlight spaces at the end of lines.
highlight link localWhitespaceError Error
au Syntax * syn match localWhitespaceError /\(\zs\%#\|\s\)\+$/ display

" Remove end of line white space.
noremap <Leader>r ma:%s/\s\+$//e<CR>`a

Итак, если { и } пропускает только пробелы, я использую свое сопоставление, чтобы удалить его и повторить попытку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...