Skip to content

Commit

Permalink
vis-open: fix for absolute and non-existent paths
Browse files Browse the repository at this point in the history
When the shell cannot find any matching files, the glob is not expanded,
and vis-open will return the absolute path of the current working
directory (because dirname outputs '.'), followed by the filename,
followed by a literal '*'. This commit checks that the final path
actually exists, and if not, exits with status 1.

It also uses text_object_longword for the range to match, so that
absolute paths are accepted, and replaced properly (else it only works
back to the first '/').
  • Loading branch information
kj committed Jan 1, 2018
1 parent 6557d0e commit 664b3ee
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 2 deletions.
5 changes: 3 additions & 2 deletions lua/plugins/complete-filename.lua
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ vis:map(vis.modes.INSERT, "<C-x><C-f>", function()
local pos = win.selection.pos
if not pos then return end
-- TODO do something clever here
local range = file:text_object_word(pos > 0 and pos-1 or pos);
local range = file:text_object_longword(pos > 0 and pos-1 or pos);
if not range then return end
if range.finish > pos then range.finish = pos end
if range.start == range.finish then return end
Expand All @@ -29,7 +29,8 @@ vis:map(vis.modes.INSERT, "<C-x><C-o>", function()
local file = win.file
local pos = win.selection.pos
if not pos then return end
local range = file:text_object_word(pos > 0 and pos-1 or pos);
-- TODO do something clever here
local range = file:text_object_longword(pos > 0 and pos-1 or pos);
if not range then return end
if range.finish > pos then range.finish = pos end
local prefix = file:content(range)
Expand Down
9 changes: 9 additions & 0 deletions vis-lua.c
Original file line number Diff line number Diff line change
Expand Up @@ -2234,6 +2234,14 @@ static int file_mark_get(lua_State *L) {
* @treturn Range range the range
*/

/***
* WORD text object.
*
* @function text_object_longword
* @tparam int pos the position which must be part of the word
* @treturn Range range the range
*/

static int file_text_object(lua_State *L) {
Filerange range = text_range_empty();
File *file = obj_ref_check(L, 1, VIS_LUA_TYPE_FILE);
Expand Down Expand Up @@ -2703,6 +2711,7 @@ void vis_lua_init(Vis *vis) {
const char *name;
} textobjects[] = {
{ VIS_TEXTOBJECT_INNER_WORD, "text_object_word" },
{ VIS_TEXTOBJECT_INNER_LONGWORD, "text_object_longword" },
};

for (size_t i = 0; i < LENGTH(textobjects); i++) {
Expand Down
5 changes: 5 additions & 0 deletions vis-open
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ if [ $# -eq 1 -a "$ALLOW_AUTO_SELECT" = 1 ]; then
# If there were globs on the command-line, they've expanded to
# a single item, so we can just process it.

# If the file or directory does not exist, abort.
if [ ! -e "$1" ]; then
exit 1
fi

if [ -d "$1" ]; then
# Recurse and show the contents of the named directory,
# We pass -f to force the next iteration to present the
Expand Down

0 comments on commit 664b3ee

Please sign in to comment.