From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stephen Berman Newsgroups: gmane.emacs.help Subject: Re: "Soft" indent with visual-line-mode? Date: Sun, 11 Dec 2011 23:23:49 +0100 Message-ID: <87vcpmlpca.fsf@escher.fritz.box> References: <8CAC7B1B-0C66-4D38-B474-1C4150419B22@stoo.org> <87ab11zlgy.fsf@escher.local.home> <4EE26EB2.3030401@stoo.org> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: dough.gmane.org 1323642261 31880 80.91.229.12 (11 Dec 2011 22:24:21 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Sun, 11 Dec 2011 22:24:21 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Sun Dec 11 23:24:17 2011 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1RZroe-00059X-M4 for geh-help-gnu-emacs@m.gmane.org; Sun, 11 Dec 2011 23:24:16 +0100 Original-Received: from localhost ([::1]:32817 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RZroe-0000tD-6L for geh-help-gnu-emacs@m.gmane.org; Sun, 11 Dec 2011 17:24:16 -0500 Original-Received: from eggs.gnu.org ([140.186.70.92]:37784) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RZroZ-0000t8-DA for help-gnu-emacs@gnu.org; Sun, 11 Dec 2011 17:24:12 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RZroX-0002KZ-RD for help-gnu-emacs@gnu.org; Sun, 11 Dec 2011 17:24:11 -0500 Original-Received: from lo.gmane.org ([80.91.229.12]:50121) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RZroX-0002KC-GI for help-gnu-emacs@gnu.org; Sun, 11 Dec 2011 17:24:09 -0500 Original-Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1RZroV-000581-Me for help-gnu-emacs@gnu.org; Sun, 11 Dec 2011 23:24:07 +0100 Original-Received: from i59f548cb.versanet.de ([89.245.72.203]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 11 Dec 2011 23:24:07 +0100 Original-Received: from stephen.berman by i59f548cb.versanet.de with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 11 Dec 2011 23:24:07 +0100 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 107 Original-X-Complaints-To: usenet@dough.gmane.org X-Gmane-NNTP-Posting-Host: i59f548cb.versanet.de User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.92 (gnu/linux) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 80.91.229.12 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:83183 Archived-At: On Fri, 09 Dec 2011 15:25:22 -0500 Tim Stewart wrote: > 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) >> (while >> (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 "" >> (save-excursion >> (save-restriction >> (widen) >> (let ((buffer-undo-list t) >> (inhibit-read-only t) >> (mod (buffer-modified-p))) >> (if srb-adaptive-wrap-mode >> (progn >> (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! > > -TimS Glad you find it useful. FYI, in the mean time a cleaner version has been added to the GNU Emacs Lisp Package Archive (ELPA) as adaptive-wrap-prefix.el. This version leaves the fringe indicators alone. (I removed them in my original version for aesthetic reasons, but Stefan Monnier (who improved the code) pointed out that that's an independent feature.) You can download it via `M-x list-packages' (or via the menu: Options->Manage Emacs Packages), or directly from this URL: http://bzr.savannah.gnu.org/lh/emacs/elpa/files/head:/packages/adaptive-wrap-prefix/ Steve Berman