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?

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

This is why we puzzle

Novel, Lo Tech SF/Fantasy

Unexpected behavior of the procedure `Area` on the object 'Polygon'

What are the balance implications behind making invisible things auto-hide?

What are the advantages of simplicial model categories over non-simplicial ones?

Using substitution ciphers to generate new alphabets in a novel

Redundant comparison & "if" before assignment

putting logo on same line but after title, latex

Biological Blimps: Propulsion

What to do when eye contact makes your subordinate uncomfortable?

How do you make your own symbol when Detexify fails?

Creepy dinosaur pc game identification

How do apertures which seem too large to physically fit work?

PTIJ: Haman's bad computer

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

What is Cash Advance APR?

Mixing PEX brands

Add big quotation marks inside my colorbox

Calculating total slots

Did arcade monitors have same pixel aspect ratio as TV sets?

Why did the EU agree to delay the Brexit deadline?

Is there a RAID 0 Equivalent for RAM?

How can mimic phobia be cured?



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 2 hours ago

























                answered 4 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

                    Bett Inhaltsverzeichnis Geschichte | Bettformen | Bettgrößen | Andere Bezeichnungen | Bettenmangel | Betten in der bildenden Kunst | Schlafmedizinische Gesichtspunkte | Siehe auch | Literatur | Weblinks | Einzelnachweise | NavigationsmenüBett, Bettstatt, BettstelleCommons: BettBabybetten: Anwendung, Ausstattungsmerkmale und VergleichskriterienWasserbetten. Vorurteile im TestHapfnNursch10.1007/s11818-012-0584-74006250-8AKS4329276-8

                    Luksemburg Sisukord Nimi | Asend | Loodus | Riigikord | Haldusjaotus | Rahvastik | Riigikaitse | Majandus | Taristu | Ajalugu | Eesti ja Luksemburgi suhted | Haridus | Kultuur | Vaata ka | Viited | Välislingid | Navigeerimismenüü50° N, 6° EÜlevaade Luksemburgi kaitsealadest.Luksemburgi rahvaarv. Statistikaamet.World Bank'i andmebaasÜlevaade Luksemburgi loodusest.Ülevaade Luksemburgi metsadest.Guy Colling. "Red List of the Vascular Plants of Luxembourg." Travaux scientifiques du Musée national d’histoire naturelle Luxembourg. 2005.Luxembourg’s biodiversity at risk.Maailma kahepaiksete andmebaas.Denis Lepage. "Luxembourg." Avibase.Ülevaade temperatuuridest. Luksemburgi meteoroloogiateenistus.Ülevaade Luksemburgist. Euroopa Liidu esinduse koduleht.Système politique. TerritoireÜlevaade Luksemburgi rahvastikust. Luksemburgi statistikaamet.Luksemburgi rahvastik. Luksemburgi statistikaamet.The World FactbookMonique Borsenberger, Paul Dickes. "Religions au Luxembourg. Quelle évolution entre 1999-2008". Luksemburgi statistikaamet. 2011.Luksemburgi peapiiskopkond. Catholic-Hierarchy.Luksemburgi armee koduleht.Luksemburgi armee relvastus.Eesti Välisministeerium.Luksemburgi rahvastik. Luksemburgi statistikaamet.Luksemburgi Eesti Seltsi koduleht.Helen Eelrand. "Raadio, mis muutis maailma." Eesti Päevaleht. 13. märts 2004.Ülevaade Luksemburgi haridussüsteemist.Ülevaade Luksemburgi keskkoolidest.Luksemburgr

                    Valle di Casies Indice Geografia fisica | Origini del nome | Storia | Società | Amministrazione | Sport | Note | Bibliografia | Voci correlate | Altri progetti | Collegamenti esterni | Menu di navigazione46°46′N 12°11′E / 46.766667°N 12.183333°E46.766667; 12.183333 (Valle di Casies)46°46′N 12°11′E / 46.766667°N 12.183333°E46.766667; 12.183333 (Valle di Casies)Sito istituzionaleAstat Censimento della popolazione 2011 - Determinazione della consistenza dei tre gruppi linguistici della Provincia Autonoma di Bolzano-Alto Adige - giugno 2012Numeri e fattiValle di CasiesDato IstatTabella dei gradi/giorno dei Comuni italiani raggruppati per Regione e Provincia26 agosto 1993, n. 412Heraldry of the World: GsiesStatistiche I.StatValCasies.comWikimedia CommonsWikimedia CommonsValle di CasiesSito ufficialeValle di CasiesMM14870458910042978-6