Skip to content

Commit

Permalink
Merge pull request #1508 from ychin/showdefinition-selection-use-getr…
Browse files Browse the repository at this point in the history
…egion

Use getregion() for showing definition of selected texts
  • Loading branch information
ychin authored Oct 31, 2024
2 parents 5ca4161 + 2b0b4e2 commit 45c5509
Showing 1 changed file with 1 addition and 52 deletions.
53 changes: 1 addition & 52 deletions runtime/autoload/macvim.vim
Original file line number Diff line number Diff line change
Expand Up @@ -3,62 +3,11 @@ vim9script
# Maintainer: Yee Cheng Chin (macvim-dev@macvim.org)
# Last Change: 2023-03-15

# Retrieves the text under the selection, without polluting the registers.
# This is easier if we could yank, but we don't know what the user has been
# doing. One way we could have accomplished this was to save the register info
# and then restore it, but this runs into problems if the unnamed register was
# pointing to the "* register as setting and restoring the system clipboard
# could be iffy (if there are non-text items in the clipboard). It's cleaner
# to just use a pure Vimscript solution without having to rely on yank.
def SelectedText(): string
var [line_start, column_start] = getpos("'<")[1 : 2]
var [line_end, column_end] = getpos("'>")[1 : 2]
final lines = getline(line_start, line_end)
if len(lines) == 0
return ''
endif

const visualmode = visualmode()

if visualmode ==# 'v'
if line_start == line_end && column_start == column_end
# Exclusive has a special case where you always select at least one
# char, so just handle the case here.
return lines[0][column_start - 1]
endif
if &selection ==# "exclusive"
column_end -= 1 # exclusive selection don't count the last column (usually)
endif
lines[-1] = lines[-1][ : column_end - 1]
lines[0] = lines[0][column_start - 1 : ]
elseif visualmode ==# "\<C-V>"
if column_end <= column_start
# This can happen with v_O, need to swap start/end
const temp = column_start
column_start = column_end
column_end = temp
# Also, exclusive mode is weird in this state in that we don't need to
# do column_end -= 1, and it acts like inclusive instead.
else
if &selection ==# "exclusive"
column_end -= 1 # normal exclusive behavior, need to cull the last column.
endif
endif
for idx in range(len(lines))
lines[idx] = lines[idx][column_start - 1 : column_end - 1]
endfor
else
# Line mode doesn't have to do anything to trim the lines
endif
return join(lines, "\n")
enddef


# Ask macOS to show the definition of the last selected text. Note that this
# uses '<, and therefore has to be used in normal mode where the mark has
# already been updated.
export def ShowDefinitionSelected()
const sel_text = SelectedText()
const sel_text = join(getregion(getpos("'<"), getpos("'>"), { type: visualmode(), exclusive: (&selection ==# "exclusive") }), "\n")
if len(sel_text) > 0
const sel_start = getpos("'<")
const sel_screenpos = win_getid()->screenpos(sel_start[1], sel_start[2])
Expand Down

0 comments on commit 45c5509

Please sign in to comment.