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

Bug in Vim 7.2.438: try, catch and cscope

Expand Messages
  • Gary Johnson
    After a recent update, I started noticing erroneous behavior in a number of my cscope mappings. After some experimenting I discovered that Vim is failing to
    Message 1 of 6 , Jun 29, 2010
      After a recent update, I started noticing erroneous behavior in a
      number of my cscope mappings. After some experimenting I discovered
      that Vim is failing to execute a "cs find" command when it follows a
      "cs add" command in a catch block. This has worked fine for a long
      time and through Vim 7.2.148 but stopped working at or before Vim
      7.2.438.

      I boiled my configuration and functions down to the following
      plugin.

      ------------------------ cscope.vim ------------------------
      set laststatus=2
      set cmdheight=10

      set csverb
      set csqf=s-

      function! Csfind()
      try
      let x = y
      catch /.*/
      echo v:exception
      cs add cscope.out
      cs find s mch_early_init
      echo "Here"
      endtry
      endfunction
      ------------------------------------------------------------

      The first settings just make the command/status area large enough to
      display a number of messages without overwriting or stopping.

      The "let x = y" was a randomly-chosen command that would generate an
      error. The 'echo "Here"' was included to demonstrate that execution
      continued beyond the "cs find" command.

      To demonstrate the behavior, I cd'd to my vim72/src directory (so
      that others could use the same data) in which I had built a cscope
      database. Then I executed

      vim -X -N -u NONE --cmd 'runtime plugin/cscope.vim' -c 'call Csfind()'

      Using Vim 7.2.148 this works correctly: Vim opens a buffer
      containing main.c with the cursor on line 181 and the following text
      on the status lines:

      Vim(let):E121: Undefined variable: y
      (1 of 6): <<global>> mch_early_init();
      Here

      Using Vim 7.2.438, however, this fails: Vim opens an empty buffer
      and displays this on the status lines:

      Vim(let):E121: Undefined variable: y
      Added cscope database cscope.out
      Here

      A "cs find s mch_early_init" command will work if executed now,
      but I need it to work immediately after the "cs add cscope.out"
      command, as it used to.

      With my normal ~/.vimrc, the first set of messages includes the
      "Added cscope database cscope.out" line just before the "(1 of 6)"
      line. I don't know why it didn't appear in this example, but I
      didn't think that detail was all that important.

      Regards,
      Gary

      --
      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
    • Bryan Venteicher
      ... I wager I altered this when I submitted 7.2.433, adding CScope QuickFixCmd{Pre,Post} autocmd event similar to what already exists for make, grep, etc. If
      Message 2 of 6 , Jun 30, 2010
        > From: "Gary Johnson" <garyjohn@...>
        > To: "vim dev" <vim_dev@...>
        > Sent: Tuesday, June 29, 2010 5:40:39 PM
        > Subject: Bug in Vim 7.2.438: try, catch and cscope

        > After a recent update, I started noticing erroneous behavior in a
        > number of my cscope mappings. After some experimenting I discovered
        > that Vim is failing to execute a "cs find" command when it follows a
        > "cs add" command in a catch block. This has worked fine for a long
        > time and through Vim 7.2.148 but stopped working at or before Vim
        > 7.2.438.
        >
        > I boiled my configuration and functions down to the following
        > plugin.
        >
        > ------------------------ cscope.vim ------------------------
        > set laststatus=2
        > set cmdheight=10
        >
        > set csverb
        > set csqf=s-
        >
        > function! Csfind()
        > try let x = y
        > catch /.*/
        > echo v:exception
        > cs add cscope.out
        > cs find s mch_early_init
        > echo "Here"
        > endtry endfunction
        > ------------------------------------------------------------
        >

        I wager I altered this when I submitted 7.2.433, adding CScope
        QuickFixCmd{Pre,Post} autocmd event similar to what already exists
        for make, grep, etc. If you try to say a :vimgrep in your catch block,
        that goes no where too, right?

        A few potential fixes come to mind:
        - If you're not explicity needing it, remove the query type from 'csfs'
        in the catch block.
        - Do the 'cs find' bit outside of the catch block.
        - Revert 433. I had been carrying it around as a private patch for a
        couple of years and find it to very useful.


        > The first settings just make the command/status area large enough to
        > display a number of messages without overwriting or stopping.
        >
        > The "let x = y" was a randomly-chosen command that would generate an
        > error. The 'echo "Here"' was included to demonstrate that execution
        > continued beyond the "cs find" command.
        >
        > To demonstrate the behavior, I cd'd to my vim72/src directory (so
        > that others could use the same data) in which I had built a cscope
        > database. Then I executed
        >
        > vim -X -N -u NONE --cmd 'runtime plugin/cscope.vim' -c 'call Csfind()'
        >
        > Using Vim 7.2.148 this works correctly: Vim opens a buffer
        > containing main.c with the cursor on line 181 and the following text
        > on the status lines:
        >
        > Vim(let):E121: Undefined variable: y
        > (1 of 6): <<global>> mch_early_init();
        > Here
        >
        > Using Vim 7.2.438, however, this fails: Vim opens an empty buffer
        > and displays this on the status lines:
        >
        > Vim(let):E121: Undefined variable: y
        > Added cscope database cscope.out
        > Here
        >
        > A "cs find s mch_early_init" command will work if executed now,
        > but I need it to work immediately after the "cs add cscope.out"
        > command, as it used to.
        >
        > With my normal ~/.vimrc, the first set of messages includes the
        > "Added cscope database cscope.out" line just before the "(1 of 6)"
        > line. I don't know why it didn't appear in this example, but I
        > didn't think that detail was all that important.
        >
        > Regards,
        > Gary
        >
        > -- 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 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
      • Gary Johnson
        ... I didn t understand that. What is csfs and what is removing the query type? ... One of the ideas behind the actual plugin is to add the cscope database
        Message 3 of 6 , Jul 1, 2010
          On 2010-07-01, Bryan Venteicher wrote:
          > > From: "Gary Johnson"
          > > To: "vim dev"
          > > Sent: Tuesday, June 29, 2010 5:40:39 PM
          > > Subject: Bug in Vim 7.2.438: try, catch and cscope
          >
          > > After a recent update, I started noticing erroneous behavior in a
          > > number of my cscope mappings. After some experimenting I discovered
          > > that Vim is failing to execute a "cs find" command when it follows a
          > > "cs add" command in a catch block. This has worked fine for a long
          > > time and through Vim 7.2.148 but stopped working at or before Vim
          > > 7.2.438.
          > >
          > > I boiled my configuration and functions down to the following
          > > plugin.
          > >
          > > ------------------------ cscope.vim ------------------------
          > > set laststatus=2
          > > set cmdheight=10
          > >
          > > set csverb
          > > set csqf=s-
          > >
          > > function! Csfind()
          > > try let x = y
          > > catch /.*/
          > > echo v:exception
          > > cs add cscope.out
          > > cs find s mch_early_init
          > > echo "Here"
          > > endtry endfunction
          > > ------------------------------------------------------------
          > >
          >
          > I wager I altered this when I submitted 7.2.433, adding CScope
          > QuickFixCmd{Pre,Post} autocmd event similar to what already exists
          > for make, grep, etc. If you try to say a :vimgrep in your catch block,
          > that goes no where too, right?
          >
          > A few potential fixes come to mind:
          > - If you're not explicity needing it, remove the query type from 'csfs'
          > in the catch block.

          I didn't understand that. What is 'csfs' and what is removing the
          query type?

          > - Do the 'cs find' bit outside of the catch block.

          One of the ideas behind the actual plugin is to add the cscope
          database without the user having to think about it, but only when
          it's needed. The Csfind() function tries to execute a "cs find"
          command. If that fails because there are no cscope connections, the
          plugin tries to execute "cs add". If that succeeds, another "cs
          find" is attempted.

          The result is that the Csfind() function behaves like "cs find", but
          automatically adds the proper cscope connection the first time it is
          called.

          Therefore, the "cs find" bit logically belongs in the catch block.
          It might be possible to set a flag in the catch block and test it
          later outside the catch block to conditionally execute the "cs
          find" bit, but I'd rather avoid such a kludge if there is another
          way around the bug.

          > - Revert 433. I had been carrying it around as a private patch for a
          > couple of years and find it to very useful.

          I'll try that as soon as I figure out how. I haven't done anything
          fancy with Mercurial yet.

          Thanks for the pointer to the likely problematic change set. I was
          not looking forward to performing a binary search of 291 change
          sets.

          Are you planning on fixing this?

          Regards,
          Gary

          --
          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
        • Bryan Venteicher
          ... Fat fingers: csqf . Query type would be s in your example (:cs find {querytype} {name}) Of course, if it is in there in the first place because you want
          Message 4 of 6 , Jul 1, 2010
            > From: "Gary Johnson" <garyjohn@...>
            > To: "vim dev" <vim_dev@...>
            > Sent: Thursday, July 1, 2010 2:04:42 AM
            > Subject: Re: Bug in Vim 7.2.438: try, catch and cscope

            > On 2010-07-01, Bryan Venteicher wrote:
            > > > From: "Gary Johnson"
            > > > To: "vim dev"
            > > > Sent: Tuesday, June 29, 2010 5:40:39 PM
            > > > Subject: Bug in Vim 7.2.438: try, catch and cscope
            > >
            > > > After a recent update, I started noticing erroneous behavior in a
            > > > number of my cscope mappings. After some experimenting I
            > > > discovered that Vim is failing to execute a "cs find" command when
            > > > it follows a
            > > > "cs add" command in a catch block. This has worked fine for a long
            > > > time and through Vim 7.2.148 but stopped working at or before Vim
            > > > 7.2.438.
            > > >
            > > > I boiled my configuration and functions down to the following
            > > > plugin.
            > > >
            > > > ------------------------ cscope.vim ------------------------
            > > > set laststatus=2
            > > > set cmdheight=10
            > > >
            > > > set csverb
            > > > set csqf=s-
            > > >
            > > > function! Csfind()
            > > > try let x = y
            > > > catch /.*/
            > > > echo v:exception
            > > > cs add cscope.out
            > > > cs find s mch_early_init
            > > > echo "Here"
            > > > endtry endfunction
            > > > ------------------------------------------------------------
            > > >
            > >
            > > I wager I altered this when I submitted 7.2.433, adding CScope
            > > QuickFixCmd{Pre,Post} autocmd event similar to what already exists
            > > for make, grep, etc. If you try to say a :vimgrep in your catch
            > > block, that goes no where too, right?
            > >
            > > A few potential fixes come to mind:
            > > - If you're not explicity needing it, remove the query type from
            > > 'csfs'
            > > in the catch block.
            >
            > I didn't understand that. What is 'csfs' and what is removing the
            > query type?

            Fat fingers: 'csqf'. Query type would be 's' in your example (:cs find {querytype} {name})
            Of course, if it is in there in the first place because you want to use the quickfix
            window for the results of the find in the catch, this really isn't helpful.

            >
            > > - Do the 'cs find' bit outside of the catch block.
            >
            > One of the ideas behind the actual plugin is to add the cscope
            > database without the user having to think about it, but only when
            > it's needed. The Csfind() function tries to execute a "cs find"
            > command. If that fails because there are no cscope connections, the
            > plugin tries to execute "cs add". If that succeeds, another "cs
            > find" is attempted.
            >
            > The result is that the Csfind() function behaves like "cs find", but
            > automatically adds the proper cscope connection the first time it is
            > called.
            >
            > Therefore, the "cs find" bit logically belongs in the catch block.
            > It might be possible to set a flag in the catch block and test it
            > later outside the catch block to conditionally execute the "cs
            > find" bit, but I'd rather avoid such a kludge if there is another
            > way around the bug.

            Yes, I would thinking adding some flag to do the cs add/find.
            You could also :redir ':cs show' to see if a database is loaded.

            >
            > > - Revert 433. I had been carrying it around as a private patch for a
            > > couple of years and find it to very useful.
            >
            > I'll try that as soon as I figure out how. I haven't done anything
            > fancy with Mercurial yet.
            >
            > Thanks for the pointer to the likely problematic change set. I was
            > not looking forward to performing a binary search of 291 change
            > sets.
            >
            > Are you planning on fixing this?

            Off hand, short of backing it out, I don't see a way to fix it, although
            it has been awhile since I poked around the Vim source. It makes Cscope
            behave more like make, grep, etc, which to me, is the a good thing.

            >
            > Regards,
            > Gary
            >
            > -- 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 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
          • Gary Johnson
            ... I would like to continue to have the freedom to set csqf to use quickfix or not for each query type as I choose. In the actual plugin, I have more than
            Message 5 of 6 , Jul 1, 2010
              On 2010-07-01, Bryan Venteicher wrote:
              > > From: "Gary Johnson"
              > > To: "vim dev"
              > > Sent: Thursday, July 1, 2010 2:04:42 AM
              > > Subject: Re: Bug in Vim 7.2.438: try, catch and cscope
              >
              > > On 2010-07-01, Bryan Venteicher wrote:
              > > > > From: "Gary Johnson"
              > > > > To: "vim dev"
              > > > > Sent: Tuesday, June 29, 2010 5:40:39 PM
              > > > > Subject: Bug in Vim 7.2.438: try, catch and cscope
              > > >
              > > > > After a recent update, I started noticing erroneous behavior in a
              > > > > number of my cscope mappings. After some experimenting I
              > > > > discovered that Vim is failing to execute a "cs find" command when
              > > > > it follows a
              > > > > "cs add" command in a catch block. This has worked fine for a long
              > > > > time and through Vim 7.2.148 but stopped working at or before Vim
              > > > > 7.2.438.
              > > > >
              > > > > I boiled my configuration and functions down to the following
              > > > > plugin.
              > > > >
              > > > > ------------------------ cscope.vim ------------------------
              > > > > set laststatus=2
              > > > > set cmdheight=10
              > > > >
              > > > > set csverb
              > > > > set csqf=s-
              > > > >
              > > > > function! Csfind()
              > > > > try let x = y
              > > > > catch /.*/
              > > > > echo v:exception
              > > > > cs add cscope.out
              > > > > cs find s mch_early_init
              > > > > echo "Here"
              > > > > endtry endfunction
              > > > > ------------------------------------------------------------
              > > > >
              > > >
              > > > I wager I altered this when I submitted 7.2.433, adding CScope
              > > > QuickFixCmd{Pre,Post} autocmd event similar to what already exists
              > > > for make, grep, etc. If you try to say a :vimgrep in your catch
              > > > block, that goes no where too, right?
              > > >
              > > > A few potential fixes come to mind:
              > > > - If you're not explicity needing it, remove the query type from
              > > > 'csfs'
              > > > in the catch block.
              > >
              > > I didn't understand that. What is 'csfs' and what is removing the
              > > query type?
              >
              > Fat fingers: 'csqf'. Query type would be 's' in your example (:cs find {querytype} {name})
              > Of course, if it is in there in the first place because you want to use the quickfix
              > window for the results of the find in the catch, this really isn't helpful.

              I would like to continue to have the freedom to set 'csqf' to use
              quickfix or not for each query type as I choose. In the actual
              plugin, I have more than just 's' in 'csqf'. Being able to traverse
              the list of places found by "cs find s" and other query types using
              ^N and ^P (mapped to :cn<CR> and :cp<CR>) is really important to
              me--I use that all the time.

              > > > - Revert 433. I had been carrying it around as a private patch for a
              > > > couple of years and find it to very useful.
              > >
              > > I'll try that as soon as I figure out how. I haven't done anything
              > > fancy with Mercurial yet.

              hg backout --merge -r2152
              hg ci

              I just did that and my plugin is now working fine again.

              > > Are you planning on fixing this?
              >
              > Off hand, short of backing it out, I don't see a way to fix it, although
              > it has been awhile since I poked around the Vim source. It makes Cscope
              > behave more like make, grep, etc, which to me, is the a good thing.

              The desired behavior seems like a good thing, but this side effect
              seems like a bug in the implementation, not a natural consequence of
              the desired behavior.

              Regards,
              Gary

              --
              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
            • Bryan Venteicher
              ... Sure. I also frequently use the CScope quickfix window. I find it much handier than the :tjump style results paired with :tn and :tp. ... It is a
              Message 6 of 6 , Jul 1, 2010
                > From: "Gary Johnson" <garyjohn@...>
                > To: "vim dev" <vim_dev@...>
                > Sent: Thursday, July 1, 2010 3:23:01 AM
                > Subject: Re: Bug in Vim 7.2.438: try, catch and cscope

                > On 2010-07-01, Bryan Venteicher wrote:
                > > > From: "Gary Johnson"
                > > > To: "vim dev"
                > > > Sent: Thursday, July 1, 2010 2:04:42 AM
                > > > Subject: Re: Bug in Vim 7.2.438: try, catch and cscope
                > >
                > > > On 2010-07-01, Bryan Venteicher wrote:
                > > > > > From: "Gary Johnson"
                > > > > > To: "vim dev"
                > > > > > Sent: Tuesday, June 29, 2010 5:40:39 PM
                > > > > > Subject: Bug in Vim 7.2.438: try, catch and cscope
                > > > >
                > > > > > After a recent update, I started noticing erroneous behavior
                > > > > > in a
                > > > > > number of my cscope mappings. After some experimenting I
                > > > > > discovered that Vim is failing to execute a "cs find" command
                > > > > > when it follows a
                > > > > > "cs add" command in a catch block. This has worked fine for a
                > > > > > long time and through Vim 7.2.148 but stopped working at or
                > > > > > before Vim
                > > > > > 7.2.438.
                > > > > >
                > > > > > I boiled my configuration and functions down to the following
                > > > > > plugin.
                > > > > >
                > > > > > ------------------------ cscope.vim ------------------------
                > > > > > set laststatus=2
                > > > > > set cmdheight=10
                > > > > >
                > > > > > set csverb
                > > > > > set csqf=s-
                > > > > >
                > > > > > function! Csfind()
                > > > > > try let x = y
                > > > > > catch /.*/
                > > > > > echo v:exception
                > > > > > cs add cscope.out
                > > > > > cs find s mch_early_init
                > > > > > echo "Here"
                > > > > > endtry endfunction
                > > > > > ------------------------------------------------------------
                > > > > >
                > > > >
                > > > > I wager I altered this when I submitted 7.2.433, adding CScope
                > > > > QuickFixCmd{Pre,Post} autocmd event similar to what already
                > > > > exists for make, grep, etc. If you try to say a :vimgrep in your
                > > > > catch block, that goes no where too, right?
                > > > >
                > > > > A few potential fixes come to mind:
                > > > > - If you're not explicity needing it, remove the query type from
                > > > > 'csfs'
                > > > > in the catch block.
                > > >
                > > > I didn't understand that. What is 'csfs' and what is removing the
                > > > query type?
                > >
                > > Fat fingers: 'csqf'. Query type would be 's' in your example (:cs
                > > find {querytype} {name})
                > > Of course, if it is in there in the first place because you want to
                > > use the quickfix
                > > window for the results of the find in the catch, this really isn't
                > > helpful.
                >
                > I would like to continue to have the freedom to set 'csqf' to use
                > quickfix or not for each query type as I choose. In the actual
                > plugin, I have more than just 's' in 'csqf'. Being able to traverse
                > the list of places found by "cs find s" and other query types using
                > ^N and ^P (mapped to :cn<CR> and :cp<CR>) is really important to
                > me--I use that all the time.

                Sure. I also frequently use the CScope quickfix window. I find it much
                handier than the :tjump style results paired with :tn and :tp.

                > > > > - Revert 433. I had been carrying it around as a private patch
                > > > > for a
                > > > > couple of years and find it to very useful.
                > > >
                > > > I'll try that as soon as I figure out how. I haven't done anything
                > > > fancy with Mercurial yet.
                >
                > hg backout --merge -r2152
                > hg ci
                >
                > I just did that and my plugin is now working fine again.
                >
                > > > Are you planning on fixing this?
                > >
                > > Off hand, short of backing it out, I don't see a way to fix it,
                > > although it has been awhile since I poked around the Vim source. It
                > > makes Cscope
                > > behave more like make, grep, etc, which to me, is the a good thing.
                >
                > The desired behavior seems like a good thing, but this side effect
                > seems like a bug in the implementation, not a natural consequence of
                > the desired behavior.

                It is a consequence of how Vim keeps track if there is currently an
                exception and matching the behavior of make and friends.

                Perhaps something like this is suitable for your script:
                function! Csfind()
                try
                cs add cscope.out
                catch /E568: duplicate cscope database not added/
                catch
                throw v:exception
                endtry

                cs find ...
                endfunction

                >
                > Regards,
                > Gary
                >
                > -- 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 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
              Your message has been successfully submitted and would be delivered to recipients shortly.