help-gnu-emacs
[Top][All Lists]
Advanced

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

Re: Tabs and Spaces


From: Pascal J. Bourguignon
Subject: Re: Tabs and Spaces
Date: Mon, 25 May 2009 17:14:39 +0200
User-agent: Gnus/5.101 (Gnus v5.10.10) Emacs/22.2 (gnu/linux)

use.address@my.homepage.invalid (Chris Gordon-Smith) writes:

> Pascal J. Bourguignon <pjb@informatimago.com> wrote:
>> use.address@my.homepage.invalid (Chris Gordon-Smith) writes:
>> 
>>> Pascal J. Bourguignon <pjb@informatimago.com> wrote:
>>>> use.address@my.homepage.invalid (Chris Gordon-Smith) writes:
>>>> 
>>>>> Hello All
>>>>>
>>>>> I have recenly started using emacs for programming, after years using 
>>>>> KDevelop. One problem I have is indenting code. I have my own indentation 
>>>>> style. and ideally I would like to setup emacs to support it 
>>>>> automatically. 
>>>>> However, in the short term I'll settle for having emacs convert a TAB 
>>>>> keypress into the correct number of spaces to fill whitespace up to the 
>>>>> next tabstop.
>>>>>
>>>>> At the moment I have
>>>>>
>>>>> (global-set-key (kbd "TAB") 'self-insert-command) 
>>>>>
>>>>> in my .emacs to force insertion of a tab, but I have to keep invoking 
>>>>> untabify manually (otherwise my code looks misaligned when I upload it to 
>>>>> Google Code).
>>>>>
>>>>> Can anyone help.
>>>> 
>>>> You shouldn't insert TAB, this is very bad.  At the very least, you
>>>> may compute the number of spaces you need to insert and insert them
>>>> rather.
>>> Yes, that's what I would like to do. Can you suggest how to do this. Do I 
>>> need to put something in my .emacs file. What would it look like?
>>>
>>>> 
>>>> But depending on the language you use, a different mode will be used
>>>> to edit your source and each mode may provide its own indenting rules.
>>>> 
>>>> In the case of Lisp, you may add a indent-function property to the
>>>> plist of the operator name.
>>>> 
>>>> In the case of C, you may customize the variable: c-offsets-alist. See
>>>> also: c-style-alist ; perhaps there's already a style defined that
>>>> you'll like.
>> 
>> 
>> In my post, there was a subliminal question, but it didn't reach your
>> consciousness, I'm sorry.  Here it is:
>
> It wasn't really a question, and the fact that you had mentioned that the 
> solution to the problem might be language dependent did register with me.
>
> I think its a pity that you chose to answer in what appears to be a rather 
> rude manner.

That wasn't intended.  Sorry again.


>>   What programming language do you use?
>
> C++.  But I had already established before my original post that the 
> standard emacs indenting would not suit me. Perhaps I should have mentioned 
> this.

c++-mode is derived from c-mode, you can configure c-offsets-alist and
possibly define your own c-style in c-style-alist.

The point here is that almost all the syntactic elements of C/C++ are
already taken into account by the C indenting functions, so you only
need to specify the indenting you want, and let the existing machinery
do the work for you.



>> Depending on the answer you give, you may well have nothing to program.
>> Otherwise, you could do something like this:
>> 
>> (defconst +space+ 32 "ASCII code for the space character")
>> 
>> (defun my-language/indent-line ()
>>   (interactive) 
>>   (let ((where (let ((m (make-marker))) (set-marker m (point)) m))
>>         (indent (my-language/get-indent-from-some-parsing-around (point))))
>>      (beginning-of-line)
>>      (looking-at "^[ \t]*")
>>      (delete-region (beginning-of-line) (match-end))
>>      (goto-char (beginning-of-line))
>>      (insert (make-string indent +space+))
>>      (goto-char where)
>>      (set-marker where nil)))
>> 
>> 
>> (local-set-key (kbd "TAB") 'my-language/indent-line)
>> 
>> 
>> Of course, all the difficulty (or simplicity, depends on your language)
>> is in implementing my-language/get-indent-from-some-parsing-around.
>> 
>> 
>
> Thanks for this.
> I'll need to read it and understand it before I use it, but it looks like a 
> good starting point.

Well, C++ is quite difficult to parse, so you should really first try
to configure the existing emacs C indentation feature.

However, if you want to write your own parser, you may use the
bovinator from cedet: http://cedet.sourceforge.net/
                      http://cedet.sourceforge.net/semantic.shtml

-- 
__Pascal Bourguignon__


reply via email to

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