[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: "Soft" indent with visual-line-mode?

From: Tim Stewart
Subject: Re: "Soft" indent with visual-line-mode?
Date: Fri, 09 Dec 2011 15:25:22 -0500
User-agent: Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv: Gecko/20110417 Lightning/1.0b2 Thunderbird/3.1.4

On 09/11/09 08:58 AM, Stephen Berman wrote:
On Wed, 9 Sep 2009 13:53:58 -0400 Tim Stewart<>  wrote:

Hello Emacs Help,

I like the idea of using longlines-mode or visual-line-mode to spend less time
formatting code as I write.  However, it is not useful to me  when the wrapped
lines start in the first column and break up the flow  of the code.

As an example, this is what I get now with a line that is indented 4 spaces.
This is all one line, wrapped by the editor for me:

     This is a test of the emergency broadcast system.  This is only a test. In
the event of a real emergency, your head would have exploded.

And this is what I want:

     This is a test of the emergency broadcast system.  This is only a test. In
     the event of a real emergency, your head would have exploded.

I've heard this referred to as a "soft" indent.  I believe that Visual
SlickEdit 9 and Kate both support this feature if you'd like other  examples.

Does anyone know of a feature or add-on for Emacs that can accomplish this?
I've scoured the 'Tubes and can't find anything.

The following code might do what you want, though it might need some
tweaking.  (To use it, evaluate it and call the minor mode manually or
add it to appropriate mode hooks.)

Steve Berman

(defun srb-adaptive-indent (beg end)
   "Indent the region between BEG and END with adaptive filling."
   (goto-char beg)
       (let ((lbp (line-beginning-position))
            (lep (line-end-position)))
        (put-text-property lbp lep 'wrap-prefix (fill-context-prefix lbp lep))
        (search-forward "\n" end t))))

(define-minor-mode srb-adaptive-wrap-mode
   "Wrap the buffer text with adaptive filling."
   :lighter ""
       (let ((buffer-undo-list t)
            (inhibit-read-only t)
            (mod (buffer-modified-p)))
        (if srb-adaptive-wrap-mode
              (setq word-wrap t)
              (unless (member '(continuation) fringe-indicator-alist)
                (push '(continuation) fringe-indicator-alist))
              (jit-lock-register 'srb-adaptive-indent))
          (jit-lock-unregister 'srb-adaptive-indent)
          (remove-text-properties (point-min) (point-max) '(wrap-prefix pref))
          (setq fringe-indicator-alist
                (delete '(continuation) fringe-indicator-alist))
          (setq word-wrap nil))
        (restore-buffer-modified-p mod)))))

It took me quite a while to try this. Thank you Steve, it works quite well! It was a little odd in Emacs Lisp mode, but seems to work great in more block-oriented code like Python, C, Perl, etc.

I also added the following to make it easy to enable globally and I tucked it away in my load-path as srb-adaptive-wrap-mode.el:

(defun turn-on-srb-adaptive-wrap-mode ()
  (srb-adaptive-wrap-mode 1))

(define-globalized-minor-mode global-srb-adaptive-wrap-mode
  srb-adaptive-wrap-mode turn-on-srb-adaptive-wrap-mode
  :lighter "")

(provide 'srb-adaptive-wrap-mode)

I also turn on the gutter arrows to make it more obvious what's happening:

; Let's show the fringe indicators when in visual-line-mode
(setq visual-line-fringe-indicators
       '(left-curly-arrow right-curly-arrow))

Thanks again!


Tim Stewart
Stoo Research
+1 404 993 6492

reply via email to

[Prev in Thread] Current Thread [Next in Thread]