Christian Brabandt wrote:
> On Mo, 23 Mär 2015, Tony Mechelynck wrote:
>
> > On 17/03/15 23:03, Bram Moolenaar wrote:
> > >
> > >Tony Mechelynck wrote:
> > >
> > >>In the current $VIMRUNTIME/vimrc_example.vim ("Last change: 2014 Nov
> > >>05") the following autocommand is defined at lines 73 to 81:
> > >>
> > >> " When editing a file, always jump to the last known cursor position.
> > >> " Don't do it when the position is invalid or when inside an event
> > >>handler
> > >> " (happens when dropping a file on gvim).
> > >> " Also don't do it when the mark is in the first line, that is the
> > >>default
> > >> " position when opening a file.
> > >> autocmd BufReadPost *
> > >> \ if line("'\"") > 1 && line("'\"") <= line("$") |
> > >> \ exe "normal! g`\"" |
> > >> \ endif
> > >>
> > >>
> > >>This results in failing to go back to the last known cursor position if
> > >>it was in line 1 but not at start-of-line. (The default position is _at
> > >>start_ of line 1.) I have a file with a long first line, in which it
> > >>would be extremely useful to me to be able to reload the file with the
> > >>cursor correctly positioned in that first line, just like it is if it
> > >>happened to be in line 2 or higher when the file was last closed in Vim.
> > >>
> > >>IMHO the first condition (before the &&) should be
> > >>either
> > >> line("'\"") >= 1
> > >>or
> > >> line("'\"") > 0
> > >>
> > >>and (again, IMHO) the two-line comment sentence starting "Also" should
> > >>be removed.
> > >
> > >If the " mark is at the default position we most likely don't want to
> > >move the cursor there. However, if it is not on the first non-blank in
> > >the first line then that is not the default position. Thus if the mark
> > >is in line 1 the column needs to be compared with the indent of the
> > >first line.
> >
> > Are there cases where the cursor would end up at a "meaningful"
> > position if we don't move it at the BufReadPost autocommand? In my
> > experience, in that case it ends up at start of line 1 anyway.
> > Moving the cursor to where it already is wouldn't be harmful (and it
> > wouldn't be costly either, compared to the time needed to get the
> > file from disk).
> >
> > But if you insist, I suppose that
> >
> > \ if (line("'\"") > 1 && line("'\"") <= line("$"))
> > \ || (line("'\"") == 1 && virtcol("'\"") > (indent(1) + 1)) |
> >
> > would be an acceptable replacement for the current if-line (and its
> > time cost would of course still be negligible against the disk read
> > time). (I know that most of the expression parentheses I wrote are
> > not necessary for the parser; however, they make the meaning more
> > obvious to the human reader. "Adding superfluous parentheses doesn't
> > harm, but removing necessary ones cause bugs.")
> >
> > IIUC, virtcol() is necessary because indent() is counted in spaces
> > but the indent could be made of hard tabs. Also, when there is no
> > indent indent() is zero but the first nonblank is in column 1, hence
> > the "+ 1" at the end. Without it, we would still move the cursor
> > when the mark is "at" the indent.
> >
> > >
> > >>I see that line() returns zero if the mark is not defined: I suppose
> > >>this would be the case for a file which already exists but wasn't edited
> > >>with Vim before. In that case (finding the mark not set) it would still
> > >>be expected that he cursor be left at its default start-of-file
> > >>position, e.g. by sidestepping the g`" in the autocomand.
>
> I suspect this won't work reliably always. I was just trying to suggest
> using lastpos.vim from
> http://www.vim.org/scripts/script.php?script_id=3059 which is a small
> plugin from Andy Wokula that should fix the problem. At least that was
> what I thought when reading the code. Unfortunately, this didn't work if
> I moved the cursor on an arbitrary position on the first line and
> reloaded that file (:e!).
>
> Turns out, this is some peculiarity of the way Vim reads the file and it
> if the cursors line is still line 1 after the autocommand has been
> executed, the cursor will be moved to the first line, if 'sol' is set
> (which is the default). That one was hard to find, the fix however is
> simple:
Thanks!
--
CRONE: Who sent you?
ARTHUR: The Knights Who Say Ni!
CRONE: Aaaagh! (she looks around in rear) No! We have no shrubberies here.
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.