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

127

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

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

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

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

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

колокольчик-рапунцель
источник
Собственно, как вы настроили поиск по умолчанию?
thethinman

Ответы:

37

Ты мог

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

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

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

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

Брайан Карпер
источник
К сожалению, vim не сохраняет настройки столбцов при изменении размера окна. Это приводит к неудачной ситуации с тайловыми оконными менеджерами, когда нет хорошего способа мягкого переноса до 80 столбцов, если окно слишком велико.
тяготение
Это работает, но не липко. Я предполагаю, что следующим шагом будет настройка autocmd для сохранения столбцов нового желаемого размера для нужных вам типов файлов.
xer0x
1
Это правильный ответ, поскольку он подтверждает, что вы не можете этого делать. И я уверен, что я не единственный, кто не хочет изменять размер окна терминала только для этого. Мне нужно намного больше ширины для использования вне vim.
Шридхар Сарнобат
20

Попробуй это:

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

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

eborisch
источник
На моем терминале iTerm это уменьшает окно. Я не уверен, что это проблема моей среды (я вижу, вы что-то делаете с автоматическим изменением размера), но в противном случае это нежелательно. Спасибо за предложение.
Шридхар Сарнобат
Autocmd отлично работал у меня (с использованием терминала guake).
mzcarlos 05
Прекрасно работает с Tmux + NeoVim в Alacritty.
meh
16

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

См Vim 80 колонки макета проблемы , :h colorcolumn.

ftvs
источник
Цитаты не являются действительным URL-адресом, поэтому это имеет смысл. Имя якоря не должно содержать недопустимые символы URL, ТАК не исправлять ошибки других разработчиков сайта.
Shadow Wizard is Ear For You
1
Shadow Wizard ссылается на предыдущую версию моего ответа, в которой мне интересно, как размещать одинарные кавычки в URL-адресах с помощью Markdown. Затем ib предложил использовать% 27, что сработало. Спасибо, ib.
ftvs
Недавно обнаружил, как выделять только столбцы после 80 ~:let w:eighty_column_match = matchadd('ColorColumn', '\%81v.\+', 100)
rampion
Эта colorwidthвещь полезна по другим причинам, поэтому я рад, что вы это разместили.
Шридхар Сарнобат
2

Вы пробовали '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.
ТЗ.
источник
3
Хм ... но breakatэто всего лишь узор (а не длина), поэтому я не понимаю, как я могу использовать это для принудительного мягкого обертывания на 80 ....
rampion
Хммм, мне интересно, можно ли создать регулярное выражение, которое будет соответствовать словам, общая длина которых (плюс пробелы между ними) меньше или равны n символам.
Шейн Крейтон-Янг
@ ShaneCreighton-Young: подойдет ^.{,80}\bтем, кто использует мягкие / расширяемые вкладки. Обратите внимание, что регулярное выражение perl, а не регулярное выражение vim.
Марк К Коуэн,
0

Нет хорошего способа сделать это. Мы можем взломать импровизированный 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
дурум
источник
Это просто превращает мои файлы в тарабарщину.
Суууэхги