mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:9.0.1921: not possible to use the jumplist like a stack (#25278)
Problem: not possible to use the jumplist like a stack
Solution: Add the 'jumpoptions' setting to make the jumplist
a stack.
Add an option for using jumplist like tag stack
related: vim/vim#7738
closes: vim/vim#13134
ported from NeoVim:
- https://neovim.io/doc/user/motion.html#jumplist-stack
- neovim/neovim@39094b3
- https://vi.stackexchange.com/questions/18344/how-to-change-jumplist-behavior
Based on the feedback in the previous PR, it looks like many people like
this option.
87018255e3
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Co-authored-by: butwerenotthereyet <58348703+butwerenotthereyet@users.noreply.github.com>
This commit is contained in:
parent
dc6c11394b
commit
f094db0e5c
@ -1115,60 +1115,45 @@ If you have included the ' item in the 'shada' option the jumplist will be
|
|||||||
stored in the ShaDa file and restored when starting Vim.
|
stored in the ShaDa file and restored when starting Vim.
|
||||||
|
|
||||||
*jumplist-stack*
|
*jumplist-stack*
|
||||||
When jumpoptions includes "stack", the jumplist behaves like the history in a
|
When 'jumpoptions' option includes "stack", the jumplist behaves like the tag
|
||||||
web browser and like the tag stack. When jumping to a new location from the
|
stack. When jumping to a new location from the middle of the jumplist, the
|
||||||
middle of the jumplist, the locations after the current position will be
|
locations after the current position will be discarded. With this option set
|
||||||
discarded.
|
you can move through a tree of jump locations. When going back up a branch and
|
||||||
|
then down another branch, CTRL-O still takes you further up the tree.
|
||||||
|
|
||||||
This behavior corresponds to the following situation in a web browser.
|
Given a jumplist like the following in which CTRL-O has been used to move back
|
||||||
Navigate to first.com, second.com, third.com, fourth.com and then fifth.com.
|
three times to location X: >
|
||||||
Then navigate backwards twice so that third.com is displayed. At that point,
|
|
||||||
the history is:
|
|
||||||
- first.com
|
|
||||||
- second.com
|
|
||||||
- third.com <--
|
|
||||||
- fourth.com
|
|
||||||
- fifth.com
|
|
||||||
|
|
||||||
Finally, navigate to a different webpage, new.com. The history is
|
|
||||||
- first.com
|
|
||||||
- second.com
|
|
||||||
- third.com
|
|
||||||
- new.com <--
|
|
||||||
|
|
||||||
When the jumpoptions includes "stack", this is the behavior of Nvim as well.
|
|
||||||
That is, given a jumplist like the following in which CTRL-O has been used to
|
|
||||||
move back three times to location X
|
|
||||||
|
|
||||||
jump line col file/text
|
|
||||||
2 1260 8 src/nvim/mark.c <-- location X-2
|
|
||||||
1 685 0 src/nvim/option_defs.h <-- location X-1
|
|
||||||
> 0 462 36 src/nvim/option_defs.h <-- location X
|
|
||||||
1 479 39 src/nvim/option_defs.h
|
|
||||||
2 213 2 src/nvim/mark.c
|
|
||||||
3 181 0 src/nvim/mark.c
|
|
||||||
|
|
||||||
|
jump line col file/text
|
||||||
|
2 1260 8 mark.c <-- location X-2
|
||||||
|
1 685 0 eval.c <-- location X-1
|
||||||
|
> 0 462 36 eval.c <-- location X
|
||||||
|
1 479 39 eval.c
|
||||||
|
2 213 2 mark.c
|
||||||
|
3 181 0 mark.c
|
||||||
|
<
|
||||||
jumping to (new) location Y results in the locations after the current
|
jumping to (new) location Y results in the locations after the current
|
||||||
locations being removed:
|
locations being removed: >
|
||||||
|
|
||||||
jump line col file/text
|
jump line col file/text
|
||||||
3 1260 8 src/nvim/mark.c
|
3 1260 8 mark.c <-- location X-2
|
||||||
2 685 0 src/nvim/option_defs.h
|
2 685 0 eval.c <-- location X-1
|
||||||
1 462 36 src/nvim/option_defs.h <-- location X
|
1 462 36 eval.c <-- location X
|
||||||
>
|
>
|
||||||
|
<
|
||||||
|
|
||||||
Then, when yet another location Z is jumped to, the new location Y appears
|
Then, when yet another location Z is jumped to, the new location Y appears
|
||||||
directly after location X in the jumplist and location X remains in the same
|
directly after location X in the jumplist and location X remains in the same
|
||||||
position relative to the locations (X-1, X-2, etc., ...) that had been before it
|
position relative to the locations (X-1, X-2, etc., ...) that had been before
|
||||||
prior to the original jump from X to Y:
|
it prior to the original jump from X to Y: >
|
||||||
|
|
||||||
jump line col file/text
|
|
||||||
4 1260 8 src/nvim/mark.c <-- location X-2
|
|
||||||
3 685 0 src/nvim/option_defs.h <-- location X-1
|
|
||||||
2 462 36 src/nvim/option_defs.h <-- location X
|
|
||||||
1 100 0 src/nvim/option_defs.h <-- location Y
|
|
||||||
>
|
|
||||||
|
|
||||||
|
jump line col file/text
|
||||||
|
4 1260 8 mark.c <-- location X-2
|
||||||
|
3 685 0 eval.c <-- location X-1
|
||||||
|
2 462 36 eval.c <-- location X
|
||||||
|
1 100 0 buffer.c <-- location Y
|
||||||
|
>
|
||||||
|
<
|
||||||
CHANGE LIST JUMPS *changelist* *change-list-jumps* *E664*
|
CHANGE LIST JUMPS *changelist* *change-list-jumps* *E664*
|
||||||
|
|
||||||
When making a change the cursor position is remembered. One position is
|
When making a change the cursor position is remembered. One position is
|
||||||
|
@ -3569,12 +3569,11 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
'jumpoptions' 'jop' string (default "")
|
'jumpoptions' 'jop' string (default "")
|
||||||
global
|
global
|
||||||
List of words that change the behavior of the |jumplist|.
|
List of words that change the behavior of the |jumplist|.
|
||||||
stack Make the jumplist behave like the tagstack or like a
|
stack Make the jumplist behave like the tagstack.
|
||||||
web browser. Relative location of entries in the
|
Relative location of entries in the jumplist is
|
||||||
jumplist is preserved at the cost of discarding
|
preserved at the cost of discarding subsequent entries
|
||||||
subsequent entries when navigating backwards in the
|
when navigating backwards in the jumplist and then
|
||||||
jumplist and then jumping to a location.
|
jumping to a location. |jumplist-stack|
|
||||||
|jumplist-stack|
|
|
||||||
|
|
||||||
view When moving through the jumplist, |changelist|,
|
view When moving through the jumplist, |changelist|,
|
||||||
|alternate-file| or using |mark-motions| try to
|
|alternate-file| or using |mark-motions| try to
|
||||||
|
11
runtime/lua/vim/_meta/options.lua
generated
11
runtime/lua/vim/_meta/options.lua
generated
@ -3485,12 +3485,11 @@ vim.go.joinspaces = vim.o.joinspaces
|
|||||||
vim.go.js = vim.go.joinspaces
|
vim.go.js = vim.go.joinspaces
|
||||||
|
|
||||||
--- List of words that change the behavior of the `jumplist`.
|
--- List of words that change the behavior of the `jumplist`.
|
||||||
--- stack Make the jumplist behave like the tagstack or like a
|
--- stack Make the jumplist behave like the tagstack.
|
||||||
--- web browser. Relative location of entries in the
|
--- Relative location of entries in the jumplist is
|
||||||
--- jumplist is preserved at the cost of discarding
|
--- preserved at the cost of discarding subsequent entries
|
||||||
--- subsequent entries when navigating backwards in the
|
--- when navigating backwards in the jumplist and then
|
||||||
--- jumplist and then jumping to a location.
|
--- jumping to a location. `jumplist-stack`
|
||||||
--- `jumplist-stack`
|
|
||||||
---
|
---
|
||||||
--- view When moving through the jumplist, `changelist|,
|
--- view When moving through the jumplist, `changelist|,
|
||||||
--- |alternate-file` or using `mark-motions` try to
|
--- |alternate-file` or using `mark-motions` try to
|
||||||
|
@ -4443,12 +4443,11 @@ return {
|
|||||||
deny_duplicates = true,
|
deny_duplicates = true,
|
||||||
desc = [=[
|
desc = [=[
|
||||||
List of words that change the behavior of the |jumplist|.
|
List of words that change the behavior of the |jumplist|.
|
||||||
stack Make the jumplist behave like the tagstack or like a
|
stack Make the jumplist behave like the tagstack.
|
||||||
web browser. Relative location of entries in the
|
Relative location of entries in the jumplist is
|
||||||
jumplist is preserved at the cost of discarding
|
preserved at the cost of discarding subsequent entries
|
||||||
subsequent entries when navigating backwards in the
|
when navigating backwards in the jumplist and then
|
||||||
jumplist and then jumping to a location.
|
jumping to a location. |jumplist-stack|
|
||||||
|jumplist-stack|
|
|
||||||
|
|
||||||
view When moving through the jumplist, |changelist|,
|
view When moving through the jumplist, |changelist|,
|
||||||
|alternate-file| or using |mark-motions| try to
|
|alternate-file| or using |mark-motions| try to
|
||||||
|
@ -151,13 +151,13 @@ void didset_string_options(void)
|
|||||||
(void)opt_strings_flags(p_vop, p_ssop_values, &vop_flags, true);
|
(void)opt_strings_flags(p_vop, p_ssop_values, &vop_flags, true);
|
||||||
(void)opt_strings_flags(p_fdo, p_fdo_values, &fdo_flags, true);
|
(void)opt_strings_flags(p_fdo, p_fdo_values, &fdo_flags, true);
|
||||||
(void)opt_strings_flags(p_dy, p_dy_values, &dy_flags, true);
|
(void)opt_strings_flags(p_dy, p_dy_values, &dy_flags, true);
|
||||||
|
(void)opt_strings_flags(p_jop, p_jop_values, &jop_flags, true);
|
||||||
(void)opt_strings_flags(p_rdb, p_rdb_values, &rdb_flags, true);
|
(void)opt_strings_flags(p_rdb, p_rdb_values, &rdb_flags, true);
|
||||||
(void)opt_strings_flags(p_tc, p_tc_values, &tc_flags, false);
|
(void)opt_strings_flags(p_tc, p_tc_values, &tc_flags, false);
|
||||||
(void)opt_strings_flags(p_tpf, p_tpf_values, &tpf_flags, true);
|
(void)opt_strings_flags(p_tpf, p_tpf_values, &tpf_flags, true);
|
||||||
(void)opt_strings_flags(p_ve, p_ve_values, &ve_flags, true);
|
(void)opt_strings_flags(p_ve, p_ve_values, &ve_flags, true);
|
||||||
(void)opt_strings_flags(p_swb, p_swb_values, &swb_flags, true);
|
(void)opt_strings_flags(p_swb, p_swb_values, &swb_flags, true);
|
||||||
(void)opt_strings_flags(p_wop, p_wop_values, &wop_flags, true);
|
(void)opt_strings_flags(p_wop, p_wop_values, &wop_flags, true);
|
||||||
(void)opt_strings_flags(p_jop, p_jop_values, &jop_flags, true);
|
|
||||||
(void)opt_strings_flags(p_cb, p_cb_values, &cb_flags, true);
|
(void)opt_strings_flags(p_cb, p_cb_values, &cb_flags, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,4 +104,70 @@ d
|
|||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for 'jumpoptions'
|
||||||
|
func Test_jumpoptions()
|
||||||
|
new
|
||||||
|
call setline(1, range(1, 200))
|
||||||
|
clearjumps
|
||||||
|
set jumpoptions=stack
|
||||||
|
|
||||||
|
" Jump around to add some locations to the jump list.
|
||||||
|
normal 10G
|
||||||
|
normal 20G
|
||||||
|
normal 30G
|
||||||
|
normal 40G
|
||||||
|
normal 50G
|
||||||
|
let bnr = bufnr()
|
||||||
|
|
||||||
|
" discards the tail when navigating from the middle
|
||||||
|
exe "normal \<C-O>\<C-O>"
|
||||||
|
call assert_equal([
|
||||||
|
\ [{'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 10, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 20, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 30, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 40, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 50, 'bufnr': bnr, 'col': 0, 'coladd': 0}
|
||||||
|
\ ], 3], getjumplist())
|
||||||
|
|
||||||
|
" new jump location is added immediately after the last one
|
||||||
|
normal 90G
|
||||||
|
call assert_equal([
|
||||||
|
\ [{'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 10, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 20, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 30, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ ], 4], getjumplist())
|
||||||
|
|
||||||
|
" does not add the same location twice adjacently
|
||||||
|
normal 60G
|
||||||
|
normal 60G
|
||||||
|
call assert_equal([
|
||||||
|
\ [{'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 10, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 20, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 30, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 90, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
"\ Nvim: avoids useless/phantom jumps
|
||||||
|
"\ {'lnum': 60, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
"\ ], 6], getjumplist())
|
||||||
|
\ ], 5], getjumplist())
|
||||||
|
|
||||||
|
" does add the same location twice non adjacently
|
||||||
|
normal 10G
|
||||||
|
normal 20G
|
||||||
|
call assert_equal([
|
||||||
|
\ [{'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 10, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 20, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 30, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 90, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 60, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ {'lnum': 10, 'bufnr': bnr, 'col': 0, 'coladd': 0},
|
||||||
|
\ ], 7], getjumplist())
|
||||||
|
|
||||||
|
set jumpoptions&
|
||||||
|
%bw!
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
Loading…
Reference in New Issue
Block a user