Vim:禁用特定行的自动换行

时间:2013-10-06 00:44:14

标签: vim line-breaks wrapping textwrapping text-width

我正在使用:set textwidth=80让Vim编辑器自动进行硬包装。但是,有时对于文件中的某些行(例如LaTeX中的表),我不希望Vim自动进行任何硬包装。有没有办法标记某些行来禁用Vim中的硬包装?或者只为指定的行自动:set textwidth=0

4 个答案:

答案 0 :(得分:2)

没有任何开箱即用的功能,但您可以在:autocmd <buffer>事件上构建一个CursorMoved,CursorMovedI的解决方案。在光标的每次移动中,您必须检查您当前是否处于其中某个“特定行”中,并相应地修改本地'textwidth'选项:

autocmd CursorMoved,CursorMovedI <buffer> if IsSpecialLine() | setlocal textwidth=0 | else | setlocal textwidth=80 | endif

将其放入~/.vim/after/ftplugin/tex.vim。 (这要求您拥有:filetype plugin on;在目录之后使用可以覆盖$VIMRUNTIME/ftplugin/tex.vim完成的任何默认文件类型设置。)或者,您可以定义{{1直接在你的:autocmd FileType tex autocmd ...中,但是一旦你有很多自定义,这往往会变得笨拙。

对于~/.vimrc函数,您可能需要匹配当前行(IsSpecialLine())上的正则表达式。如果您可以通过语法突出显示识别“某些行”,我的OnSyntaxChange plugin可以为您完成所有工作。

答案 1 :(得分:2)

我试过Ingo Karkat answer。虽然它确实工作得非常好并且做了OP所要求的,但我发现它让人分心(如果我有长数百个字符的长表,在通过表时会有很多上下移动)并且可能会减慢很多vim on big files(整个文件的textwidthwrap已更改,因此为每个光标移动运行autocmd可能代价高昂。)

所以我提出了一个基于希望你必须尽可能少地修改表的想法的静态解决方案。我已将以下内容添加到ftplugin/tex.vim文件中:

" By default the text is 
let s:textwidth = 90
let &l:textwidth=s:textwidth

" Toggle between "textwidth and wrap" and "textwidth=0 and nowrap".
" When editing a table, can be useful to have all the '&' aligned (using e.g.
" ':Tabularize /&') but without line brakes and wraps. Besides it's very
" annoying when line brakes "happen" while editing.
" As hopefully tables must be edited only from time to time, one can toggle
" wrap and textwidth by hand. 
function! ToggleTwWrap() "{{{
  " if textwidth and wrap is used, then disable them
  if &textwidth > 0 
    let &l:textwidth=0
    setlocal nowrap
  else " otherwise re-enable them
    let &l:textwidth=s:textwidth
    setlocal wrap
  endif
endfunction

所以现在如果我想手动编辑一个表,我只需要

:call ToggleTwWrap()

禁用包装和textwidth,然后在我完成表格时再次禁用。

当然,您可以创建命令或地图

答案 2 :(得分:0)

您当然可以为特定的文件类型设置它,但我认为您不能为各个行更改这些设置(或任何,真的)。

答案 3 :(得分:0)

Ingo Karat的答案有效,但在每一个光标移动上设置textwidth太慢了。如果文本宽度实际上会发生变化,则此适应版本将仅调用public abstract class Transaction { //Attributes ... //Links Map<Product,Integer> products; //Constructor Transaction() { id = newTrId.incrementAndGet(); date = new Date(); products = new HashMap<>(); } abstract void addProduct(Product aProduct, int aQuantity); BigDecimal calculateTotal() { BigDecimal total = new BigDecimal(0); for(Product eachProduct : products.keySet()) { total.add(eachProduct.getPrice()); } for (Integer eachProduct : products.values()) { } return total; } } 。这大大加快了速度:

setlocal textwidth=