creating a “:KeepCursor” commandHow to undo last command in command line?How can I repeat last Ex-mode command in normal mode?Copy text based on delimiting stringsHow to simulate Return and Escape for global command without using Control-V?Use pattern of global ex command found on a line to substitute in another lineHow to pipe *characters* to cmd ( `:!` )Search pattern for an if statement that isn't followed by curly brace on the next lineSetting the search pattern to just a portion of a regex patternIs there a setting that hides the last colon-command entered?':norm dtxdty' works different than '0dtxdty', what's happening?

Temporarily disable WLAN internet access for children, but allow it for adults

When were female captains banned from Starfleet?

How can I write humor as character trait?

Non-trope happy ending?

Why would a new[] expression ever invoke a destructor?

Pre-mixing cryogenic fuels and using only one fuel tank

How do you respond to a colleague from another team when they're wrongly expecting that you'll help them?

How should I respond when I lied about my education and the company finds out through background check?

Creepy dinosaur pc game identification

Why should universal income be universal?

How to explain what's wrong with this application of the chain rule?

Mixing PEX brands

Why is it that I can sometimes guess the next note?

Why is short-wave infrared portion of electromagnetic spectrum so sensitive to fire?

How to cover method return statement in Apex Class?

Multiplicative persistence

What if you are holding an Iron Flask with a demon inside and walk into Antimagic Field?

Is there an injective, monotonically increasing, strictly concave function from the reals, to the reals?

Does the UK parliament need to pass secondary legislation to accept the Article 50 extension

This is why we puzzle

Is there a way to get `mathscr' with lower case letters in pdfLaTeX?

Using substitution ciphers to generate new alphabets in a novel

Limits and Infinite Integration by Parts

The IT department bottlenecks progress, how should I handle this?



creating a “:KeepCursor” command


How to undo last command in command line?How can I repeat last Ex-mode command in normal mode?Copy text based on delimiting stringsHow to simulate Return and Escape for global command without using Control-V?Use pattern of global ex command found on a line to substitute in another lineHow to pipe *characters* to cmd ( `:!` )Search pattern for an if statement that isn't followed by curly brace on the next lineSetting the search pattern to just a portion of a regex patternIs there a setting that hides the last colon-command entered?':norm dtxdty' works different than '0dtxdty', what's happening?













1















I'd like to make a command that works like this: :KeepCursor cmd will the given execute ex command string, then restore the cursor's position. A primary example is:



:KeepCursor normal! *


which would perform a keyword search without jumping to the next match. This can of course be accomplished in other ways, but it's a good demonstration of the functionality I'm looking for, which I want to work in every possible case.



This is my attempt so far. I'm using feedkeys+imtx because I'd like the command to behave exactly as though I typed it. I put the cursor restoration in a finally so it works even if the command encounters an error.



function! s:keepcursor(qargs)
let l:view = winsaveview()
let l:winid = win_getid()
try
call feedkeys(':'.a:qargs."<cr>", 'imtx')
finally
if win_getid() != l:winid
if !win_id2win(l:winid)
return
endif
call win_gotoid(l:winid)
endif
call winrestview(l:view)
endtry
endfunction

command! -nargs=* KeepCursor call s:keepcursor(<q-args>)


However, it does not seem to work. Using :KeepCursor normal! * prints the search string but does not highlight anything. Running :hlsearch afterwards highlights the wrong thing.



My questions are a) can it be explained why this doesn't work and b) can such a :KeepCursor command be written?










share|improve this question


























    1















    I'd like to make a command that works like this: :KeepCursor cmd will the given execute ex command string, then restore the cursor's position. A primary example is:



    :KeepCursor normal! *


    which would perform a keyword search without jumping to the next match. This can of course be accomplished in other ways, but it's a good demonstration of the functionality I'm looking for, which I want to work in every possible case.



    This is my attempt so far. I'm using feedkeys+imtx because I'd like the command to behave exactly as though I typed it. I put the cursor restoration in a finally so it works even if the command encounters an error.



    function! s:keepcursor(qargs)
    let l:view = winsaveview()
    let l:winid = win_getid()
    try
    call feedkeys(':'.a:qargs."<cr>", 'imtx')
    finally
    if win_getid() != l:winid
    if !win_id2win(l:winid)
    return
    endif
    call win_gotoid(l:winid)
    endif
    call winrestview(l:view)
    endtry
    endfunction

    command! -nargs=* KeepCursor call s:keepcursor(<q-args>)


    However, it does not seem to work. Using :KeepCursor normal! * prints the search string but does not highlight anything. Running :hlsearch afterwards highlights the wrong thing.



    My questions are a) can it be explained why this doesn't work and b) can such a :KeepCursor command be written?










    share|improve this question
























      1












      1








      1








      I'd like to make a command that works like this: :KeepCursor cmd will the given execute ex command string, then restore the cursor's position. A primary example is:



      :KeepCursor normal! *


      which would perform a keyword search without jumping to the next match. This can of course be accomplished in other ways, but it's a good demonstration of the functionality I'm looking for, which I want to work in every possible case.



      This is my attempt so far. I'm using feedkeys+imtx because I'd like the command to behave exactly as though I typed it. I put the cursor restoration in a finally so it works even if the command encounters an error.



      function! s:keepcursor(qargs)
      let l:view = winsaveview()
      let l:winid = win_getid()
      try
      call feedkeys(':'.a:qargs."<cr>", 'imtx')
      finally
      if win_getid() != l:winid
      if !win_id2win(l:winid)
      return
      endif
      call win_gotoid(l:winid)
      endif
      call winrestview(l:view)
      endtry
      endfunction

      command! -nargs=* KeepCursor call s:keepcursor(<q-args>)


      However, it does not seem to work. Using :KeepCursor normal! * prints the search string but does not highlight anything. Running :hlsearch afterwards highlights the wrong thing.



      My questions are a) can it be explained why this doesn't work and b) can such a :KeepCursor command be written?










      share|improve this question














      I'd like to make a command that works like this: :KeepCursor cmd will the given execute ex command string, then restore the cursor's position. A primary example is:



      :KeepCursor normal! *


      which would perform a keyword search without jumping to the next match. This can of course be accomplished in other ways, but it's a good demonstration of the functionality I'm looking for, which I want to work in every possible case.



      This is my attempt so far. I'm using feedkeys+imtx because I'd like the command to behave exactly as though I typed it. I put the cursor restoration in a finally so it works even if the command encounters an error.



      function! s:keepcursor(qargs)
      let l:view = winsaveview()
      let l:winid = win_getid()
      try
      call feedkeys(':'.a:qargs."<cr>", 'imtx')
      finally
      if win_getid() != l:winid
      if !win_id2win(l:winid)
      return
      endif
      call win_gotoid(l:winid)
      endif
      call winrestview(l:view)
      endtry
      endfunction

      command! -nargs=* KeepCursor call s:keepcursor(<q-args>)


      However, it does not seem to work. Using :KeepCursor normal! * prints the search string but does not highlight anything. Running :hlsearch afterwards highlights the wrong thing.



      My questions are a) can it be explained why this doesn't work and b) can such a :KeepCursor command be written?







      search command-line cursor command






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked 4 hours ago









      MassMass

      6,4051420




      6,4051420




















          1 Answer
          1






          active

          oldest

          votes


















          3















          Can it be written?




          Yup.



          command! -nargs=* -complete=command KeepCursor
          let [s:view, s:win] = [winsaveview(), win_getid()] |
          try |
          execute <q-args> |
          finally |
          if win_id2win(s:win) |
          call win_gotoid(s:win) |
          endif |
          keepjumps call winrestview(s:view) |
          endtry



          Can it be explained why this doesn't work




          There is a lot going on here. I haven't debugged anything, but my guess is feedkeys() is part of your problem. I typically avoid feedkeys() as it is often easier to debug other methods.






          share|improve this answer
























            Your Answer








            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "599"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fvi.stackexchange.com%2fquestions%2f19277%2fcreating-a-keepcursor-command%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            3















            Can it be written?




            Yup.



            command! -nargs=* -complete=command KeepCursor
            let [s:view, s:win] = [winsaveview(), win_getid()] |
            try |
            execute <q-args> |
            finally |
            if win_id2win(s:win) |
            call win_gotoid(s:win) |
            endif |
            keepjumps call winrestview(s:view) |
            endtry



            Can it be explained why this doesn't work




            There is a lot going on here. I haven't debugged anything, but my guess is feedkeys() is part of your problem. I typically avoid feedkeys() as it is often easier to debug other methods.






            share|improve this answer





























              3















              Can it be written?




              Yup.



              command! -nargs=* -complete=command KeepCursor
              let [s:view, s:win] = [winsaveview(), win_getid()] |
              try |
              execute <q-args> |
              finally |
              if win_id2win(s:win) |
              call win_gotoid(s:win) |
              endif |
              keepjumps call winrestview(s:view) |
              endtry



              Can it be explained why this doesn't work




              There is a lot going on here. I haven't debugged anything, but my guess is feedkeys() is part of your problem. I typically avoid feedkeys() as it is often easier to debug other methods.






              share|improve this answer



























                3












                3








                3








                Can it be written?




                Yup.



                command! -nargs=* -complete=command KeepCursor
                let [s:view, s:win] = [winsaveview(), win_getid()] |
                try |
                execute <q-args> |
                finally |
                if win_id2win(s:win) |
                call win_gotoid(s:win) |
                endif |
                keepjumps call winrestview(s:view) |
                endtry



                Can it be explained why this doesn't work




                There is a lot going on here. I haven't debugged anything, but my guess is feedkeys() is part of your problem. I typically avoid feedkeys() as it is often easier to debug other methods.






                share|improve this answer
















                Can it be written?




                Yup.



                command! -nargs=* -complete=command KeepCursor
                let [s:view, s:win] = [winsaveview(), win_getid()] |
                try |
                execute <q-args> |
                finally |
                if win_id2win(s:win) |
                call win_gotoid(s:win) |
                endif |
                keepjumps call winrestview(s:view) |
                endtry



                Can it be explained why this doesn't work




                There is a lot going on here. I haven't debugged anything, but my guess is feedkeys() is part of your problem. I typically avoid feedkeys() as it is often easier to debug other methods.







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited 1 hour ago

























                answered 3 hours ago









                Peter RinckerPeter Rincker

                10.4k11828




                10.4k11828



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Vi and Vim Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fvi.stackexchange.com%2fquestions%2f19277%2fcreating-a-keepcursor-command%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Best approach to update all entries in a list that is paginated?Best way to add items to a paginated listChoose Your Country: Best Usability approachUpdate list when a user is viewing the list without annoying themWhen would the best day to update your webpage be?What should happen when I add a Row to a paginated, sorted listShould I adopt infinite scrolling or classical pagination?How to show user that page objects automatically updateWhat is the best location to locate the comments section in a list pageBest way to combine filtering and selecting items in a listWhen one of two inputs must be updated to satisfy a consistency criteria, which should you update (if at all)?

                    Вунгтау (аеропорт) Загальні відомості | Див. також | Посилання | Навігаційне меню10°22′00″ пн. ш. 107°05′00″ сх. д. / 10.36667° пн. ш. 107.08333° сх. д. / 10.36667; 107.0833310°22′00″ пн. ш. 107°05′00″ сх. д. / 10.36667° пн. ш. 107.08333° сх. д. / 10.36667; 107.083337731608Vinh AirportVinh airport facelift improves serviceвиправивши або дописавши їївиправивши або дописавши їїр

                    Тонконіг бульбистий Зміст Опис | Поширення | Екологія | Господарське значення | Примітки | Див. також | Література | Джерела | Посилання | Навігаційне меню1114601320038-241116202404kew-435458Poa bulbosaЭлектронный каталог сосудистых растений Азиатской России [Електронний каталог судинних рослин Азіатської Росії]Малышев Л. Л. Дикие родичи культурных растений. Poa bulbosa L. - Мятлик луковичный. [Малишев Л. Л. Дикі родичи культурних рослин. Poa bulbosa L. - Тонконіг бульбистий.]Мятлик (POA) Сем. Злаки (Мятликовые) [Тонконіг (POA) Род. Злаки (Тонконогові)]Poa bulbosa Linnaeus, Sp. Pl. 1: 70. 1753. 鳞茎早熟禾 lin jing zao shu he (Description from Flora of China) [Poa bulbosa Linnaeus, Sp. Pl. 1: 70. 1753. 鳞茎早熟禾 lin jing zao shu he (Опис від Флора Китаю)]Poa bulbosa L. – lipnice cibulkatá / lipnica cibulkatáPoa bulbosa в базі даних Poa bulbosa на сайті Poa bulbosa в базі даних «Global Biodiversity Information Facility» (GBIF)Poa bulbosa в базі даних «Euro + Med PlantBase» — інформаційному ресурсі для Євро-середземноморського розмаїття рослинPoa bulbosa L. на сайті «Плантариум»