Мягкая обертка на 80 символов в Vim в окне произвольной ширины

Я хочу использовать функцию Vim soft wrap (:set wrap) для переноса некоторого кода на 80 символов, независимо от моей фактической ширины окна.

Мне еще не удалось найти способ сделать это - всякая мягкая упаковка кажется привязанной к ширине окна

  • textwidth и wrapmargin предназначены для жесткой упаковки (они вставляют символы новой строки в файл)
  • вертикальное разбиение на несколько окон и использование :vertical resize 80 (возможно, с :set breakat=, чтобы разрешить перерывы на любом символе) на одном из них (хотя и немного хакерском), но ломается при использовании :set number as номера строк занимают переменное количество столбцов (в зависимости от длины файла), и они являются частью 80.

Есть ли способ сделать это в vim? Это не выглядит многообещающим, согласно другим источникам.

В настоящее время мое приближение состоит только в том, чтобы /^.\{80}\zs.\+ использовать мой поиск по умолчанию, чтобы он, по крайней мере, был выделен. Я подумал о добавлении для него элемента :syntax, но это сломалось, когда оно перекрыло другие элементы синтаксиса, поэтому я отказался от этой идеи.

Ответ 1

Вы могли бы

  • установить большую минимальную ширину столбца с номерами строк с помощью :set numberwidth=6 и
  • тогда вы можете изменить размер окна с помощью :set columns=86 (или с помощью мыши) на правильный размер.

Если вы редактируете файл с миллионом строк, у вас могут возникнуть проблемы, но это маловероятно. Таким же образом вы тратите впустую 6 колонок экранной недвижимости. Таким образом, есть еще все виды проблем.

Вы можете выделить 80-й столбец, используя :match как здесь и здесь.

Помимо этого я не вижу никакого способа сделать это. Похоже, это было бы неплохо.

Ответ 2

У меня нет решения для мягкой упаковки, но что касается маркировки столбца, то с Vim 7.3 (выпущено 2010-08-15) :set colorcolumn=80 будет выделено столбец 80. Цвет будет зависеть от вашего файла синтаксиса.

См. Сопоставление столбцов Vim 80, :h colorcolumn.

Ответ 3

Попробуйте следующее:

set columns=80
autocmd VimResized * if (&columns > 80) | set columns=80 | endif
set wrap
set linebreak
set showbreak=+++

Вы можете удалить if (&columns > 80) |, если вы всегда хотите 80 столбцов.

Ответ 4

Вы пробовали 'linebreak'?

        *'linebreak'* *'lbr'* *'nolinebreak'* *'nolbr'*
  'linebreak' 'lbr' boolean (default off)
        local to window
        {not in Vi}
        {not available when compiled without the  |+linebreak|
        feature}
If on Vim will wrap long lines at a character in 'breakat' rather
than at the last character that fits on the screen.  Unlike
'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file,
it only affects the way the file is displayed, not its contents.  The
value of 'showbreak' is used to put in front of wrapped lines.
This option is not used when the 'wrap' option is off or 'list' is on.
Note that <Tab> characters after an <EOL> are mostly not displayed
with the right amount of white space.

Ответ 5

Нет хорошего способа сделать это. Мы можем взломать временную программную setlocal softwrap с помощью autocmd если изменим ответ @eborisch. Если мы изменяем размер каждый раз, когда вводим буфер, и мы изменяем размер до определенной длины, когда установлена локальная переменная softwrap, мы получаем желаемое поведение.

Предположим, что мы хотим мягко обернуть до 80 столбцов, мы можем написать следующее в .vimrc.

augroup softwrap
    autocmd VimResized * if (exists('b:softwrap') && &columns > 80) | set columns=80 | endif
    autocmd BufEnter * set columns=999
augroup END

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

let b:softwrap=1
set columns=80