Что такое Vim-эквивалент функции Cma Co (delete-blank-lines) в Emacs?

1 ответ1

1

Vim не имеет встроенной функции, которая делает это. Вероятно, самый «похожий на vim» способ сделать это - определить текстовый объект.

Текстовые объекты - чрезвычайно полезная функция vim, которая позволяет вам делать что-то вроде этого:

dip     "(d)elete (i)nside (p)aragraph

или же

yaW    "(y)ank (a)round this (W)ORD

Мы можем определить текстовый объект для "пустых строк". Давайте использовать "е" в качестве нашей мнемоники. Это означает, что функции, которые мы ищем,

die    "delete inside this empty block (leaving one blank line)

а также

dae    "Delete around this empty block (Leaving no blank lines)

Самое замечательное в текстовых объектах заключается в том, что добавление этого заставит работать любой другой оператор. Таким образом , вы можете сделать cie или yie также. Вот соответствующие строки, чтобы добавить к вашему .vimrc

vnoremap ie :<C-u>silent! normal! ?^.?+1<C-v><cr>V/^./-1<C-v><cr>k<cr>
onoremap ie :<C-u>silent! normal! ?^.?+1<C-v><cr>V/^./-1<C-v><cr>k<cr>
vnoremap ae :<C-u>silent! normal! ?^.?+1<C-v><cr>V/^./-1<C-v><cr><cr>
onoremap ae :<C-u>silent! normal! ?^.?+1<C-v><cr>V/^./-1<C-v><cr><cr>

Я не буду объяснять каждый из них (так как большинство из них очень похожи), но основная идея заключается в том, что мы сопоставляем, ie с этим набором нажатий клавиш в нормальном режиме:

?^.?+1<C-v><cr>V/^./-1<C-v><cr>k

Давайте разберемся с этим:

?               " Search backwards
 ^.             " For a non-blank line
   ?+1          " And offset to one line forward. (So that we find the first blank after a non-blank)
      <C-v><cr> " Enter. (The <C-v> is necessary because we enter it from :normal

"Start a visual selection
V

/                   " Search forwards
 ^.                 " For a non-blank line
   /-1              " And offset to one line backwards. 
      <C-v><cr>     " Enter. (The <C-v> is necessary because we enter it from "normal"
               k    " (optional) if this is an 'i' mapping, not an 'a' mapping, move up one line so that we leave a line

Это не совсем то же самое, что и Emacs. Но опять же, вы используете Vim в конце концов. Вы не должны пытаться скопировать точно такую же функциональность. Это даст вам аналогичную функциональность, сохраняя при этом ощущение «vim-esque».

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .