creating a “:KeepCursor” command The 2019 Stack Overflow Developer Survey Results Are In ...
Did God make two great lights or did He make the great light two?
What is this lever in Argentinian toilets?
The following signatures were invalid: EXPKEYSIG 1397BC53640DB551
Keeping a retro style to sci-fi spaceships?
Semisimplicity of the category of coherent sheaves?
Difference between "generating set" and free product?
What do you call a plan that's an alternative plan in case your initial plan fails?
Would an alien lifeform be able to achieve space travel if lacking in vision?
Segmentation fault output is suppressed when piping stdin into a function. Why?
How many people can fit inside Mordenkainen's Magnificent Mansion?
Program that generates brainfuck code that outputs given text
How long does the line of fire that you can create as an action using the Investiture of Flame spell last?
"... to apply for a visa" or "... and applied for a visa"?
How are presidential pardons supposed to be used?
How to politely respond to generic emails requesting a PhD/job in my lab? Without wasting too much time
Windows 10: How to Lock (not sleep) laptop on lid close?
Why can't wing-mounted spoilers be used to steepen approaches?
Can smartphones with the same camera sensor have different image quality?
Python - Fishing Simulator
how can a perfect fourth interval be considered either consonant or dissonant?
How to make `trap` know if the EXIT is after successful program finish or because of premature as an error or something
Movie about afterlife I think? Large towers with clothing and food?
Why can't devices on different VLANs, but on the same subnet, communicate?
Why use ultrasound for medical imaging?
creating a “:KeepCursor” command
The 2019 Stack Overflow Developer Survey Results Are In
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)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?
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
add a comment |
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
add a comment |
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
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
search command-line cursor command
asked Mar 22 at 18:18
MassMass
6,5271421
6,5271421
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
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.
Originally I usedfeedkeys
becausehlsearch
doesn't work when using execute from a function. So basically the difference is puttingexecute
inside the command, not inside a function?
– Mass
Mar 23 at 0:55
I have tried this a few ways. Inside a function, outside a function, w/feedkeys()
, w/:execute
, w/call execute()
. From what I can tell you can usefeedkeys()
,:execute
,execute()
, it doesn't matter. For some reason it is the function that seems to be the problem here. I only kept it out of the function so that the errors would look "native", so I stumbled on the solution by accident. This might be a a bug, but I am not on the latest version of Vim. I am on Vim 8.1 patches 1-950.
– Peter Rincker
Mar 24 at 1:44
add a comment |
Can it be written?
Possibly, but it might be a lot harder than expected. Because, what do you do with commands that close the current window? Or commands, that add lines above the current cursor position?
One problem you are running into is described unter :h function-search-undo.
The last used search pattern and the redo command "."
will not be changed by the function. This also
implies that the effect of :nohlsearch is undone
when the function returns.
The only way I know to circumvent this is to make use of using feedkeys()
, but apparently, this does not work with the x
flag, you have given to the feedkeys command (and I am not actually sure this is needed here). So using
call feedkeys(':'.a:qargs."<cr>", 'imt')
and your example starts to work (well, almost). However, if you start using this, you'll notice the cursor position will be off, despite the fact, that winrestview()
should have restored the cursor position. I think this happens, because the feedkeys()
call will insert the command after the current command is executed, e.g. after the function s:keepcursor()
returns. I dont' know a way around this (well, perhaps a workaround would be to try to make use of timers, but I consider this ugly).
Note, there is also this script that implements a :KeepView
command.
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
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.
Originally I usedfeedkeys
becausehlsearch
doesn't work when using execute from a function. So basically the difference is puttingexecute
inside the command, not inside a function?
– Mass
Mar 23 at 0:55
I have tried this a few ways. Inside a function, outside a function, w/feedkeys()
, w/:execute
, w/call execute()
. From what I can tell you can usefeedkeys()
,:execute
,execute()
, it doesn't matter. For some reason it is the function that seems to be the problem here. I only kept it out of the function so that the errors would look "native", so I stumbled on the solution by accident. This might be a a bug, but I am not on the latest version of Vim. I am on Vim 8.1 patches 1-950.
– Peter Rincker
Mar 24 at 1:44
add a comment |
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.
Originally I usedfeedkeys
becausehlsearch
doesn't work when using execute from a function. So basically the difference is puttingexecute
inside the command, not inside a function?
– Mass
Mar 23 at 0:55
I have tried this a few ways. Inside a function, outside a function, w/feedkeys()
, w/:execute
, w/call execute()
. From what I can tell you can usefeedkeys()
,:execute
,execute()
, it doesn't matter. For some reason it is the function that seems to be the problem here. I only kept it out of the function so that the errors would look "native", so I stumbled on the solution by accident. This might be a a bug, but I am not on the latest version of Vim. I am on Vim 8.1 patches 1-950.
– Peter Rincker
Mar 24 at 1:44
add a comment |
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.
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.
edited Mar 22 at 21:05
answered Mar 22 at 19:02
Peter RinckerPeter Rincker
10.6k11828
10.6k11828
Originally I usedfeedkeys
becausehlsearch
doesn't work when using execute from a function. So basically the difference is puttingexecute
inside the command, not inside a function?
– Mass
Mar 23 at 0:55
I have tried this a few ways. Inside a function, outside a function, w/feedkeys()
, w/:execute
, w/call execute()
. From what I can tell you can usefeedkeys()
,:execute
,execute()
, it doesn't matter. For some reason it is the function that seems to be the problem here. I only kept it out of the function so that the errors would look "native", so I stumbled on the solution by accident. This might be a a bug, but I am not on the latest version of Vim. I am on Vim 8.1 patches 1-950.
– Peter Rincker
Mar 24 at 1:44
add a comment |
Originally I usedfeedkeys
becausehlsearch
doesn't work when using execute from a function. So basically the difference is puttingexecute
inside the command, not inside a function?
– Mass
Mar 23 at 0:55
I have tried this a few ways. Inside a function, outside a function, w/feedkeys()
, w/:execute
, w/call execute()
. From what I can tell you can usefeedkeys()
,:execute
,execute()
, it doesn't matter. For some reason it is the function that seems to be the problem here. I only kept it out of the function so that the errors would look "native", so I stumbled on the solution by accident. This might be a a bug, but I am not on the latest version of Vim. I am on Vim 8.1 patches 1-950.
– Peter Rincker
Mar 24 at 1:44
Originally I used
feedkeys
because hlsearch
doesn't work when using execute from a function. So basically the difference is putting execute
inside the command, not inside a function?– Mass
Mar 23 at 0:55
Originally I used
feedkeys
because hlsearch
doesn't work when using execute from a function. So basically the difference is putting execute
inside the command, not inside a function?– Mass
Mar 23 at 0:55
I have tried this a few ways. Inside a function, outside a function, w/
feedkeys()
, w/ :execute
, w/ call execute()
. From what I can tell you can use feedkeys()
, :execute
, execute()
, it doesn't matter. For some reason it is the function that seems to be the problem here. I only kept it out of the function so that the errors would look "native", so I stumbled on the solution by accident. This might be a a bug, but I am not on the latest version of Vim. I am on Vim 8.1 patches 1-950.– Peter Rincker
Mar 24 at 1:44
I have tried this a few ways. Inside a function, outside a function, w/
feedkeys()
, w/ :execute
, w/ call execute()
. From what I can tell you can use feedkeys()
, :execute
, execute()
, it doesn't matter. For some reason it is the function that seems to be the problem here. I only kept it out of the function so that the errors would look "native", so I stumbled on the solution by accident. This might be a a bug, but I am not on the latest version of Vim. I am on Vim 8.1 patches 1-950.– Peter Rincker
Mar 24 at 1:44
add a comment |
Can it be written?
Possibly, but it might be a lot harder than expected. Because, what do you do with commands that close the current window? Or commands, that add lines above the current cursor position?
One problem you are running into is described unter :h function-search-undo.
The last used search pattern and the redo command "."
will not be changed by the function. This also
implies that the effect of :nohlsearch is undone
when the function returns.
The only way I know to circumvent this is to make use of using feedkeys()
, but apparently, this does not work with the x
flag, you have given to the feedkeys command (and I am not actually sure this is needed here). So using
call feedkeys(':'.a:qargs."<cr>", 'imt')
and your example starts to work (well, almost). However, if you start using this, you'll notice the cursor position will be off, despite the fact, that winrestview()
should have restored the cursor position. I think this happens, because the feedkeys()
call will insert the command after the current command is executed, e.g. after the function s:keepcursor()
returns. I dont' know a way around this (well, perhaps a workaround would be to try to make use of timers, but I consider this ugly).
Note, there is also this script that implements a :KeepView
command.
add a comment |
Can it be written?
Possibly, but it might be a lot harder than expected. Because, what do you do with commands that close the current window? Or commands, that add lines above the current cursor position?
One problem you are running into is described unter :h function-search-undo.
The last used search pattern and the redo command "."
will not be changed by the function. This also
implies that the effect of :nohlsearch is undone
when the function returns.
The only way I know to circumvent this is to make use of using feedkeys()
, but apparently, this does not work with the x
flag, you have given to the feedkeys command (and I am not actually sure this is needed here). So using
call feedkeys(':'.a:qargs."<cr>", 'imt')
and your example starts to work (well, almost). However, if you start using this, you'll notice the cursor position will be off, despite the fact, that winrestview()
should have restored the cursor position. I think this happens, because the feedkeys()
call will insert the command after the current command is executed, e.g. after the function s:keepcursor()
returns. I dont' know a way around this (well, perhaps a workaround would be to try to make use of timers, but I consider this ugly).
Note, there is also this script that implements a :KeepView
command.
add a comment |
Can it be written?
Possibly, but it might be a lot harder than expected. Because, what do you do with commands that close the current window? Or commands, that add lines above the current cursor position?
One problem you are running into is described unter :h function-search-undo.
The last used search pattern and the redo command "."
will not be changed by the function. This also
implies that the effect of :nohlsearch is undone
when the function returns.
The only way I know to circumvent this is to make use of using feedkeys()
, but apparently, this does not work with the x
flag, you have given to the feedkeys command (and I am not actually sure this is needed here). So using
call feedkeys(':'.a:qargs."<cr>", 'imt')
and your example starts to work (well, almost). However, if you start using this, you'll notice the cursor position will be off, despite the fact, that winrestview()
should have restored the cursor position. I think this happens, because the feedkeys()
call will insert the command after the current command is executed, e.g. after the function s:keepcursor()
returns. I dont' know a way around this (well, perhaps a workaround would be to try to make use of timers, but I consider this ugly).
Note, there is also this script that implements a :KeepView
command.
Can it be written?
Possibly, but it might be a lot harder than expected. Because, what do you do with commands that close the current window? Or commands, that add lines above the current cursor position?
One problem you are running into is described unter :h function-search-undo.
The last used search pattern and the redo command "."
will not be changed by the function. This also
implies that the effect of :nohlsearch is undone
when the function returns.
The only way I know to circumvent this is to make use of using feedkeys()
, but apparently, this does not work with the x
flag, you have given to the feedkeys command (and I am not actually sure this is needed here). So using
call feedkeys(':'.a:qargs."<cr>", 'imt')
and your example starts to work (well, almost). However, if you start using this, you'll notice the cursor position will be off, despite the fact, that winrestview()
should have restored the cursor position. I think this happens, because the feedkeys()
call will insert the command after the current command is executed, e.g. after the function s:keepcursor()
returns. I dont' know a way around this (well, perhaps a workaround would be to try to make use of timers, but I consider this ugly).
Note, there is also this script that implements a :KeepView
command.
answered Mar 25 at 7:58
Christian BrabandtChristian Brabandt
16.2k2646
16.2k2646
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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