Loading ...
Sorry, an error occurred while loading the content.

Re: Way to cancel the change that prompts FileChangedRO event?

Expand Messages
  • Benji Fisher
    ... I think that vim 6.2 (just released) has a :stopinsert command that may be helpful here. Personally, I prefer to avoid :normal in autocommands and
    Message 1 of 11 , Jun 1, 2003
    • 0 Attachment
      Stahlman Family wrote:
      > I understand that the intended use of the FileChangedRO event is to allow
      > checkout of a file prior to modification. In my case, however, I am setting up
      > a FileChangedRO autocommand that will prompt the user to check the file out of
      > version control, BUT will also permit him to cancel the checkout (and rollback
      > or undo the modification). I realize I could probably just re-read the entire
      > file into the buffer to discard the change that generated the FileChangedRO
      > event, but this is not an aesthetically pleasing solution - what if the
      > readonly file is a 5MB file that took several seconds to load in the first
      > place. It seems that there should be a way simply to cancel the change and
      > then undo; I tried various things along the lines of
      >
      > :exe "normal \<Esc>u"
      > from within the autocommand (actually, a function called by the autocommand),
      > but this appeared to have no effect. If the event was prompted by a "cw" in
      > normal mode, for example, I was still in insert mode after :exe "normal
      > \<Esc>u" was executed from within the autocommand. Any insights into what is
      > going on here? I even tried using a variation of Eatchar() to eat up the
      > characters that had started the change, but without much success. I may have
      > to wade through the source code to see what's going on here, but I thought I'd
      > see if there was something obvious I had missed in the help or something...
      >
      > Thanks,
      > Brett S.

      I think that vim 6.2 (just released) has a :stopinsert command that may be
      helpful here.

      Personally, I prefer to avoid :normal in autocommands and functions.
      There is an :undo command that does pretty much the same as :normal u .

      HTH --Benji Fisher
    • Stahlman Family
      Benji, Thanks. I tried :undo as well. The problem is that Vim doesn t apply the changes to the text until after the autocommands for FileChangedRO have
      Message 2 of 11 , Jun 1, 2003
      • 0 Attachment
        Benji,
        Thanks. I tried :undo as well. The problem is that Vim doesn't apply the
        changes to the text until after the autocommands for FileChangedRO have
        completed, and there is no way to tell Vim from within the autocommand to skip
        making the changes. I didn't see the stopinsert command in help. Oh well... I
        guess if I unwittingly attempt to change a version-controlled file that I
        don't really want to check out, it's not too much to ask that I do an undo
        once I have realized my mistake...

        Thanks,
        Brett S.

        ----- Original Message -----
        From: "Benji Fisher" <benji@...>
        To: "Stahlman Family" <stahlmana@...>
        Cc: <vim@...>
        Sent: Sunday, June 01, 2003 7:50 PM
        Subject: Re: Way to cancel the change that prompts FileChangedRO event?


        > Stahlman Family wrote:
        > > I understand that the intended use of the FileChangedRO event is to allow
        > > checkout of a file prior to modification. In my case, however, I am
        setting up
        > > a FileChangedRO autocommand that will prompt the user to check the file
        out of
        > > version control, BUT will also permit him to cancel the checkout (and
        rollback
        > > or undo the modification). I realize I could probably just re-read the
        entire
        > > file into the buffer to discard the change that generated the
        FileChangedRO
        > > event, but this is not an aesthetically pleasing solution - what if the
        > > readonly file is a 5MB file that took several seconds to load in the first
        > > place. It seems that there should be a way simply to cancel the change and
        > > then undo; I tried various things along the lines of
        > >
        > > :exe "normal \<Esc>u"
        > > from within the autocommand (actually, a function called by the
        autocommand),
        > > but this appeared to have no effect. If the event was prompted by a "cw"
        in
        > > normal mode, for example, I was still in insert mode after :exe "normal
        > > \<Esc>u" was executed from within the autocommand. Any insights into what
        is
        > > going on here? I even tried using a variation of Eatchar() to eat up the
        > > characters that had started the change, but without much success. I may
        have
        > > to wade through the source code to see what's going on here, but I thought
        I'd
        > > see if there was something obvious I had missed in the help or
        something...
        > >
        > > Thanks,
        > > Brett S.
        >
        > I think that vim 6.2 (just released) has a :stopinsert command that
        may be
        > helpful here.
        >
        > Personally, I prefer to avoid :normal in autocommands and functions.
        > There is an :undo command that does pretty much the same as :normal u .
        >
        > HTH --Benji Fisher
        >
        >
        >
        >
      • Antoine J. Mechelynck
        ... [...] gvim 6.2 (release) has indeed a :stopinsert command (command-line completion on :stopi finds it), but there is no help tag for it (:help :stopinsert
        Message 3 of 11 , Jun 1, 2003
        • 0 Attachment
          Stahlman Family <stahlmana@...> wrote:
          > Benji,
          > Thanks. I tried :undo as well. The problem is that Vim doesn't
          > apply the changes to the text until after the autocommands for
          > FileChangedRO have completed, and there is no way to tell Vim from
          > within the autocommand to skip making the changes. I didn't see the
          > stopinsert command in help. Oh well... I guess if I unwittingly
          > attempt to change a version-controlled file that I don't really want
          > to check out, it's not too much to ask that I do an undo once I have
          > realized my mistake...
          >
          > Thanks,
          > Brett S.

          [...]

          gvim 6.2 (release) has indeed a :stopinsert command (command-line completion
          on :stopi finds it), but there is no help tag for it (:help :stopinsert
          gives an error, even after :helptags $VIMRUNTIME/doc). The help for
          :stopinsert is located in insert.txt, immediately after the help for
          :startinsert, but it lacks a line above it saying *:stopi* *:stopinsert*
          (that additional line should come immediately before line 948 in my version
          of insert.txt, dated 2003 May 20 "for version 6.2").

          Regards,
          Tony.
        • Hari Krishna Dara
          ... skip ... If there is a way to make Vim believe that a change was never attempted on this file, it will be more useful, because once you undo, you can t
          Message 4 of 11 , Jun 2, 2003
          • 0 Attachment
            On Sun, 1 Jun 2003 at 10:25pm, Stahlman Family wrote:

            > Benji,
            > Thanks. I tried :undo as well. The problem is that Vim doesn't apply the
            > changes to the text until after the autocommands for FileChangedRO have
            > completed, and there is no way to tell Vim from within the autocommand to
            skip
            > making the changes. I didn't see the stopinsert command in help. Oh well... I
            > guess if I unwittingly attempt to change a version-controlled file that I
            > don't really want to check out, it's not too much to ask that I do an undo
            > once I have realized my mistake...
            >
            > Thanks,
            > Brett S.
            >

            If there is a way to make Vim believe that a change was never attempted
            on this file, it will be more useful, because once you undo, you can't
            expect to get the FileChangedRO autocommand again even when you make a
            genuine attempt to edit it later on.

            For the original question, there is probably no direct way of doing it.
            As you said, the change is not attempted by Vim until the autocommand is
            completed. We need to have an autocommand triggered right after the
            change attempt is completed. I can only think of CursorHold which can
            work in this case. How about something like this (untested):


            let s:_updatetime = &updatetime
            set updatetime=1 " Let it be triggered as soon as possible.
            aug CancelChanges
            au!
            let bufName = substitute(bufname('%'), "\\\\", '/', 'g')
            let bufName = escape(bufName, '[,{ ')
            exec 'au CursorHold ' . bufName . ' :call <SID>CancelChanges()'
            aug END


            function! s:CancelChanges()
            let updatetime = s:_updatetime
            aug CancelChanges
            au!
            aug END

            stopinsert " Vim 6.2
            undo
            endfunction


            If there are other CursorHold autocommands defined, then they will also
            get triggered, but I can't imagine that to be harmful.

            HTH,
            Hari


            __________________________________
            Do you Yahoo!?
            Yahoo! Calendar - Free online calendar with sync to Outlook(TM).
            http://calendar.yahoo.com
          • Stahlman Family
            Hari, Thanks. I was thinking along these lines yesterday, but wasn t sure what the granularity was on the CursorHold event - i.e., how sure I could be that it
            Message 5 of 11 , Jun 2, 2003
            • 0 Attachment
              Hari,
              Thanks. I was thinking along these lines yesterday, but wasn't sure what
              the granularity was on the CursorHold event - i.e., how sure I could be that
              it would fire immediately after the change was made. I see that you've set it
              to 1ms, which I'm guessing may really be 55 ms or so on a Windows system, but
              even then, the delay would not be noticeable (provided the user is not
              frantically pressing keys or moving the mouse in an attempt to undo the change
              :-), so this would probably be a perfectly good solution. Thanks for the
              implementation code,

              Brett S.

              ----- Original Message -----
              From: "Hari Krishna Dara" <hari_vim@...>
              To: "Stahlman Family" <stahlmana@...>
              Cc: "Benji Fisher" <benji@...>; <vim@...>
              Sent: Monday, June 02, 2003 1:03 PM
              Subject: Re: Way to cancel the change that prompts FileChangedRO event?


              >
              > On Sun, 1 Jun 2003 at 10:25pm, Stahlman Family wrote:
              >
              > > Benji,
              > > Thanks. I tried :undo as well. The problem is that Vim doesn't apply
              the
              > > changes to the text until after the autocommands for FileChangedRO have
              > > completed, and there is no way to tell Vim from within the autocommand to
              > skip
              > > making the changes. I didn't see the stopinsert command in help. Oh
              well... I
              > > guess if I unwittingly attempt to change a version-controlled file that I
              > > don't really want to check out, it's not too much to ask that I do an undo
              > > once I have realized my mistake...
              > >
              > > Thanks,
              > > Brett S.
              > >
              >
              > If there is a way to make Vim believe that a change was never attempted
              > on this file, it will be more useful, because once you undo, you can't
              > expect to get the FileChangedRO autocommand again even when you make a
              > genuine attempt to edit it later on.
              >
              > For the original question, there is probably no direct way of doing it.
              > As you said, the change is not attempted by Vim until the autocommand is
              > completed. We need to have an autocommand triggered right after the
              > change attempt is completed. I can only think of CursorHold which can
              > work in this case. How about something like this (untested):
              >
              >
              > let s:_updatetime = &updatetime
              > set updatetime=1 " Let it be triggered as soon as possible.
              > aug CancelChanges
              > au!
              > let bufName = substitute(bufname('%'), "\\\\", '/', 'g')
              > let bufName = escape(bufName, '[,{ ')
              > exec 'au CursorHold ' . bufName . ' :call <SID>CancelChanges()'
              > aug END
              >
              >
              > function! s:CancelChanges()
              > let updatetime = s:_updatetime
              > aug CancelChanges
              > au!
              > aug END
              >
              > stopinsert " Vim 6.2
              > undo
              > endfunction
              >
              >
              > If there are other CursorHold autocommands defined, then they will also
              > get triggered, but I can't imagine that to be harmful.
              >
              > HTH,
              > Hari
              >
              >
              > __________________________________
              > Do you Yahoo!?
              > Yahoo! Calendar - Free online calendar with sync to Outlook(TM).
              > http://calendar.yahoo.com
              >
              >
            • Hari Krishna Dara
              ... change ... and when you get this working, I would appreciate if you post the working version here. I would like to use it for my Perforce plugin as well :)
              Message 6 of 11 , Jun 3, 2003
              • 0 Attachment
                On Mon, 2 Jun 2003 at 10:40pm, Stahlman Family wrote:

                > Hari,
                > Thanks. I was thinking along these lines yesterday, but wasn't sure what
                > the granularity was on the CursorHold event - i.e., how sure I could be that
                > it would fire immediately after the change was made. I see that you've set it
                > to 1ms, which I'm guessing may really be 55 ms or so on a Windows system, but
                > even then, the delay would not be noticeable (provided the user is not
                > frantically pressing keys or moving the mouse in an attempt to undo the
                change
                > :-), so this would probably be a perfectly good solution. Thanks for the
                > implementation code,
                >
                > Brett S.

                and when you get this working, I would appreciate if you post the
                working version here. I would like to use it for my Perforce plugin as
                well :)

                BTW, anyone has any tricks to make Vim continue to fire FileChangedRO
                event after cancelling the attempt to modify the file? Added to the
                other workaround, the combo will make it an ideal feature to have in any
                SCM plugin.

                Thanks,
                Hari

                __________________________________
                Do you Yahoo!?
                Yahoo! Calendar - Free online calendar with sync to Outlook(TM).
                http://calendar.yahoo.com
              • Benji Fisher
                ... Does :doautocmd not work? HTH --Benji Fisher
                Message 7 of 11 , Jun 3, 2003
                • 0 Attachment
                  Hari Krishna Dara wrote:

                  > BTW, anyone has any tricks to make Vim continue to fire FileChangedRO
                  > event after cancelling the attempt to modify the file? Added to the
                  > other workaround, the combo will make it an ideal feature to have in any
                  > SCM plugin.

                  Does :doautocmd not work?

                  HTH --Benji Fisher
                • Hari Krishna Dara
                  ... I am not sure what you mean, when exactly would you execute :doautocmd here? The intention is to know when the user first starts modifying a readonly file,
                  Message 8 of 11 , Jun 3, 2003
                  • 0 Attachment
                    On Tue, 3 Jun 2003 at 2:55pm, Benji Fisher wrote:

                    > Hari Krishna Dara wrote:
                    >
                    > > BTW, anyone has any tricks to make Vim continue to fire FileChangedRO
                    > > event after cancelling the attempt to modify the file? Added to the
                    > > other workaround, the combo will make it an ideal feature to have in any
                    > > SCM plugin.
                    >
                    > Does :doautocmd not work?
                    >
                    > HTH --Benji Fisher
                    >

                    I am not sure what you mean, when exactly would you execute :doautocmd
                    here? The intention is to know when the user first starts modifying a
                    readonly file, and currently there is only one way of doing this, ie
                    through FileChangedRO autocommand. Currently Vim fires this even only
                    the first time you attempt and if you can cancel that change and try
                    again subsequently, the event is not fired again (even if you reload the
                    file etc.).

                    Thanks,
                    Hari

                    __________________________________
                    Do you Yahoo!?
                    Yahoo! Calendar - Free online calendar with sync to Outlook(TM).
                    http://calendar.yahoo.com
                  • Benji Fisher
                    ... Sorry, I misunderstood the question. I suppose you have already tried setting nomodified and nomodifiable and readonly etc.? I do not have any
                    Message 9 of 11 , Jun 3, 2003
                    • 0 Attachment
                      Hari Krishna Dara wrote:
                      > On Tue, 3 Jun 2003 at 2:55pm, Benji Fisher wrote:
                      >
                      >
                      >>Hari Krishna Dara wrote:
                      >>
                      >>
                      >>>BTW, anyone has any tricks to make Vim continue to fire FileChangedRO
                      >>>event after cancelling the attempt to modify the file? Added to the
                      >>>other workaround, the combo will make it an ideal feature to have in any
                      >>>SCM plugin.
                      >>
                      >> Does :doautocmd not work?
                      >>
                      >>HTH --Benji Fisher
                      >>
                      >
                      >
                      > I am not sure what you mean, when exactly would you execute :doautocmd
                      > here? The intention is to know when the user first starts modifying a
                      > readonly file, and currently there is only one way of doing this, ie
                      > through FileChangedRO autocommand. Currently Vim fires this even only
                      > the first time you attempt and if you can cancel that change and try
                      > again subsequently, the event is not fired again (even if you reload the
                      > file etc.).

                      Sorry, I misunderstood the question. I suppose you have already tried
                      setting 'nomodified' and 'nomodifiable' and 'readonly' etc.? I do not have any
                      better suggestions.

                      --Benji Fisher
                    • Hari Krishna Dara
                      ... any ... Yes, setting those will not help. Vim must be registering the fact that this event has been already fired, so the trick would probably work towards
                      Message 10 of 11 , Jun 3, 2003
                      • 0 Attachment
                        On Tue, 3 Jun 2003 at 4:14pm, Benji Fisher wrote:
                        > >
                        > >
                        > > I am not sure what you mean, when exactly would you execute :doautocmd
                        > > here? The intention is to know when the user first starts modifying a
                        > > readonly file, and currently there is only one way of doing this, ie
                        > > through FileChangedRO autocommand. Currently Vim fires this even only
                        > > the first time you attempt and if you can cancel that change and try
                        > > again subsequently, the event is not fired again (even if you reload the
                        > > file etc.).
                        >
                        > Sorry, I misunderstood the question. I suppose you have already tried
                        > setting 'nomodified' and 'nomodifiable' and 'readonly' etc.? I do not have
                        any
                        > better suggestions.
                        >
                        > --Benji Fisher

                        Yes, setting those will not help. Vim must be registering the fact that
                        this event has been already fired, so the trick would probably work
                        towards clearing it. I am not familar with the code, so I don't know if
                        it is possible at all.

                        Thank you,
                        Hari

                        __________________________________
                        Do you Yahoo!?
                        Yahoo! Calendar - Free online calendar with sync to Outlook(TM).
                        http://calendar.yahoo.com
                      Your message has been successfully submitted and would be delivered to recipients shortly.