Skip to content

Commit

Permalink
Update the vimscript code for restoring cursor position
Browse files Browse the repository at this point in the history
Using xxd(1) to filter and edit binary files causes the input files
to have dual nature, so to speak, which effectively makes restoring
the cursor position broken.  Fix that by ignoring the "xxd" file type
in the code that restores the cursor position.

Interactive rebasing in git causes files to be edited in vim, which,
similarly to commit messages, are rarely the same as the last one
edited.  Thus, also add "gitrebase" to the list of file types for
which the cursor position isn't restored.

While there, refactor the code a bit to possibly save a few CPU cycles
and to keep the line lengths in check, and use the long form of the
commands and variables, to make the code slightly more consistent and
more understandable to newcomers.

Update the relevant comments in the code and the associated parts of
the documentation, to keep them in sync with the updated code.

Remove some redundant trailing whitespace as well, as spotted.
  • Loading branch information
Dragan Simic' via vim_dev authored and chrisbra committed Aug 10, 2023
1 parent 6a50066 commit 81b8bf5
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 14 deletions.
16 changes: 10 additions & 6 deletions runtime/defaults.vim
Original file line number Diff line number Diff line change
Expand Up @@ -99,15 +99,19 @@ if 1
" Put these in an autocmd group, so that you can revert them with:
" ":autocmd! vimStartup"
augroup vimStartup
au!
autocmd!

" When editing a file, always jump to the last known cursor position.
" Don't do it when the position is invalid, when inside an event handler
" (happens when dropping a file on gvim) and for a commit message (it's
" likely a different one than last time).
" (happens when dropping a file on gvim), for a commit or rebase message
" (likely a different one than last time), and when using xxd(1) to filter
" and edit binary files (it transforms input files back and forth, causing
" them to have dual nature, so to speak)
autocmd BufReadPost *
\ if line("'\"") >= 1 && line("'\"") <= line("$") && &ft !~# 'commit'
\ | exe "normal! g`\""
\ let line = line("'\"")
\ | if line >= 1 && line <= line("$") && &filetype !~# 'commit'
\ && index(['xxd', 'gitrebase'], &filetype) == -1
\ | execute "normal! g`\""

This comment has been minimized.

Copy link
@dkearns

dkearns Aug 10, 2023

Contributor

These multiline autocommands should probably use blocks now. See :help :autocmd-block

\ | endif

augroup END
Expand All @@ -119,7 +123,7 @@ if 1
augroup vimHints
au!
autocmd CmdwinEnter *
\ echohl Todo |
\ echohl Todo |
\ echo gettext('You discovered the command-line window! You can close it with ":q".') |
\ echohl None
augroup END
Expand Down
26 changes: 18 additions & 8 deletions runtime/doc/usr_05.txt
Original file line number Diff line number Diff line change
Expand Up @@ -308,17 +308,27 @@ This switches on three very clever mechanisms:


*restore-cursor* *last-position-jump* >
autocmd BufReadPost *
\ if line("'\"") >= 1 && line("'\"") <= line("$") && &ft !~# 'commit'
\ | exe "normal! g`\""
\ | endif
augroup RestoreCursor
autocmd!
autocmd BufReadPost *
\ let line = line("'\"")
\ | if line >= 1 && line <= line("$") && &filetype !~# 'commit'
\ && index(['xxd', 'gitrebase'], &filetype) == -1
\ | execute "normal! g`\""
\ | endif
augroup END
Another autocommand. This time it is used after reading any file. The
complicated stuff after it checks if the '" mark is defined, and jumps to it
if so. The backslash at the start of a line is used to continue the command
from the previous line. That avoids a line getting very long.
See |line-continuation|. This only works in a Vim script file, not when
typing commands at the command-line.
if so. It doesn't do that for a commit or rebase message, which are likely
a different one than last time, and when using xxd(1) to filter and edit
binary files, which transforms input files back and forth, causing them to
have dual nature, so to speak. See also |using-xxd|.

The backslash at the start of a line is used to continue the command from the
previous line. That avoids a line getting very long. See |line-continuation|.
This only works in a Vim script file, not when typing commands at the
command line.

>
command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ | diffthis
Expand Down

0 comments on commit 81b8bf5

Please sign in to comment.