Re: emacs question

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: emacs question
Дата
Msg-id 2130.944244243@sss.pgh.pa.us
обсуждение исходный текст
Ответ на emacs question  (Thomas Lockhart <lockhart@alumni.caltech.edu>)
Список pgsql-hackers
Thomas Lockhart <lockhart@alumni.caltech.edu> writes:
> I'm running into trouble trying to get the tab vs space stuff right.
> For Postgres, I want to set the tabbing to 4 columns, and to preserve
> tabs in the input and output. I think I can do that, with
>   (setq tab-width 4)
>   (setq standard-indent 4)
> though I'm not sure that standard-indent needs to be adjusted at all.

> For my other project, I need 2-column indents always space filled, so
> no tabs allowed. It happens to be C++, so I can differentiate between
> the C code for Postgres.

I am not sure whether you have the correct mental model for this, so
here it is: there are two different things going on here, the "physical"
width of tab stops and the "logical" notion of syntax-driven
indentation.  A TAB character stored in a file is displayed as "indent
to the next tab stop", where tab stops are every tab-width columns, 8 by
default.  (I think you can also choose to set up a user-defined list of
tab stop locations, but I've never done that.)  The tab stops have
*nothing* to do with logical indentation of source code --- that's
driven by separate logic that says "indent this many columns relative to
the previous line when you see this kind of syntactic context".  After
the logical-indent code has decided what column it thinks the line
should start at, it then constructs a whitespace prefix of the right
length, which normally will use the right number of tabs and spaces
based on the current "physical" tab stop settings.  When you press TAB
in c++-mode, that doesn't mean "insert one tab character", it means
"reindent the current line by recomputing the appropriate leading
whitespace".  It could insert or delete any combination of tabs and
spaces.  (If you really want to insert one tab character, you use the
usual escape for inserting control codes: control-Q TAB.)

(If you already had your head screwed on straight, sorry for the
digression.)

> But I'm also having trouble getting things to space-fill when
> indenting. I've tried

>   (setq c++-mode-hook 'rtc-cc-mode)

>   (defun rtc-cc-mode ()
>     (setq tab-width 2)
>     (setq standard-indent 2)
>     (setq indent-tab-mode nil))

I doubt that you want to be messing with the default tab-stop-distance
setting here.  And you shouldn't need to mess with standard-indent
either; I have no idea what that controls, but it's not the basis for
indenting in C or C++ mode AFAIK.  The logical indent per syntactic
level in these modes is set by c-basic-offset, which may already be 2
depending on which c-style value you are using.  Finally, as far as
suppressing use of tabs to do logical indentation, you've almost got it
right, but the variable is named "indent-tabs-mode".

Also, if you want to have different conventions for different projects,
setting a c++-mode-hook is probably not the way to go; that will get run
*any* time you visit a c++ file.  I'd suggest a trick that someone
(Peter E. I think) recently pointed out to me: you can pattern-match on
the location of a source file in an auto-mode-alist pattern.  So I've
now got this in my .emacs:

; Cmd to set tab stops &etc for working with PostgreSQL code
(defun pgsql-c-mode () "Set PostgreSQL C indenting conventions in current buffer." (interactive) (c-mode)            ;
selectmajor mode to customize (setq tab-width 4)        ; some people have weird ideas about tabs (c-set-style "bsd")
    ; sets c-basic-offset to 4, plus other stuff (c-set-offset 'case-label '+)    ; tweak case indent to match PG
custom
)

; Invoke pgsql-c-mode automatically when loading appropriate files
(setq auto-mode-alist     (cons '("\\`/users/postgres/.*\\.[ch]\\'" . pgsql-c-mode)    (cons
'("\\`/users/tgl/pgsql/.*\\.[ch]\\'". pgsql-c-mode)      auto-mode-alist)))
 

which means that I get Postgres-customized C mode whenever I visit a
.c or .h file under /users/postgres/ or /users/tgl/pgsql/ (customize
paths to taste of course).

You can use the above defun as-is for Postgres code, and for your other
project you probably want a mode-set command like

(defun foobar-cc-mode () "Set so-and-so's C++ indenting conventions in current buffer." (interactive) (c++-mode)
       ; select major mode to customize (setq c-basic-offset 2) (setq indent-tabs-mode nil))
 

(You might also want to call c-set-style if the other project doesn't
use GNU-flavor brace layout and so forth --- and you can get really down
and dirty if you need to, by tweaking offsets for individual syntax
elements.  But that's a last resort if you have to adhere to an
unconventional set of layout guidelines.  c-set-style can get you pretty
close to all the popular formats I've heard of.)

This is already OK to invoke by hand, and then you can add some
auto-mode-alist entries to invoke it automatically when you visit
files with the right path prefix and suffix.

> My emacs book got me this far, but the behavior seems to be a bit at
> odds with their description and they don't give a specific example
> covering this. Any hints would be *greatly* appreciated.

The online manual (see control-H I) is generally more up-to-date about
how your particular version works than any book is likely to be.  I'm
using version 19, so I might be a little off about how version 20 works,
but I hadn't heard that they reworked the indent logic in any major way.

It'd be well worth your while to read the manual's section about
"Indentation for Programs"... but in my copy, the last part about
customizing indent tells you about "styles" last, where it probably
should tell you that first instead of presenting the low-level
adjustments first...

Good luck!
        regards, tom lane


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Vince Vielhaber
Дата:
Сообщение: Re: [HACKERS] Re: [Fwd: postgresql-6.5.3. RPMs (Well Done!)]
Следующее
От: Olivier PRENANT
Дата:
Сообщение: postgresql authentification for popper