summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-05-01 14:30:36 +0200
committerBram Moolenaar <Bram@vim.org>2018-05-01 14:30:36 +0200
commita796d46f29e3cc235cc981696d7ee80faccb5000 (patch)
tree542906c6f700a59c60ad6dcd203be8d75dd66643
parent15142e27aaafa15b72d1042c25fbb5e4f12b6736 (diff)
patch 8.0.1781: file names in quickfix window are not shortenedv8.0.1781
Problem: File names in quickfix window are not always shortened. Solution: Shorten the file name when opening the quickfix window. (Yegappan Lakshmanan, closes #2851, closes #2846)
-rw-r--r--src/fileio.c52
-rw-r--r--src/proto/fileio.pro1
-rw-r--r--src/quickfix.c17
-rw-r--r--src/testdir/test_quickfix.vim24
-rw-r--r--src/version.c2
5 files changed, 75 insertions, 21 deletions
diff --git a/src/fileio.c b/src/fileio.c
index 63cc61c432..98631e074a 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -6163,7 +6163,7 @@ shorten_fname(char_u *full_path, char_u *dir_name)
}
/*
- * Shorten filenames for all buffers.
+ * Shorten filename of a buffer.
* When "force" is TRUE: Use full path from now on for files currently being
* edited, both for file name and swap file name. Try to shorten the file
* names a bit, if safe to do so.
@@ -6172,34 +6172,44 @@ shorten_fname(char_u *full_path, char_u *dir_name)
* name.
*/
void
+shorten_buf_fname(buf_T *buf, char_u *dirname, int force)
+{
+ char_u *p;
+
+ if (buf->b_fname != NULL
+#ifdef FEAT_QUICKFIX
+ && !bt_nofile(buf)
+#endif
+ && !path_with_url(buf->b_fname)
+ && (force
+ || buf->b_sfname == NULL
+ || mch_isFullName(buf->b_sfname)))
+ {
+ VIM_CLEAR(buf->b_sfname);
+ p = shorten_fname(buf->b_ffname, dirname);
+ if (p != NULL)
+ {
+ buf->b_sfname = vim_strsave(p);
+ buf->b_fname = buf->b_sfname;
+ }
+ if (p == NULL || buf->b_fname == NULL)
+ buf->b_fname = buf->b_ffname;
+ }
+}
+
+/*
+ * Shorten filenames for all buffers.
+ */
+ void
shorten_fnames(int force)
{
char_u dirname[MAXPATHL];
buf_T *buf;
- char_u *p;
mch_dirname(dirname, MAXPATHL);
FOR_ALL_BUFFERS(buf)
{
- if (buf->b_fname != NULL
-#ifdef FEAT_QUICKFIX
- && !bt_nofile(buf)
-#endif
- && !path_with_url(buf->b_fname)
- && (force
- || buf->b_sfname == NULL
- || mch_isFullName(buf->b_sfname)))
- {
- VIM_CLEAR(buf->b_sfname);
- p = shorten_fname(buf->b_ffname, dirname);
- if (p != NULL)
- {
- buf->b_sfname = vim_strsave(p);
- buf->b_fname = buf->b_sfname;
- }
- if (p == NULL || buf->b_fname == NULL)
- buf->b_fname = buf->b_ffname;
- }
+ shorten_buf_fname(buf, dirname, force);
/* Always make the swap file name a full path, a "nofile" buffer may
* also have a swap file. */
diff --git a/src/proto/fileio.pro b/src/proto/fileio.pro
index 12d5c14ff3..990348143b 100644
--- a/src/proto/fileio.pro
+++ b/src/proto/fileio.pro
@@ -11,6 +11,7 @@ void msg_add_fname(buf_T *buf, char_u *fname);
void msg_add_lines(int insert_space, long lnum, off_T nchars);
char_u *shorten_fname1(char_u *full_path);
char_u *shorten_fname(char_u *full_path, char_u *dir_name);
+void shorten_buf_fname(buf_T *buf, char_u *dirname, int force);
void shorten_fnames(int force);
void shorten_filenames(char_u **fnames, int count);
char_u *modname(char_u *fname, char_u *ext, int prepend_dot);
diff --git a/src/quickfix.c b/src/quickfix.c
index acff1ec703..dde68419a2 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -2736,6 +2736,9 @@ qf_list(exarg_T *eap)
idx2 = (-idx2 > i) ? 0 : idx2 + i + 1;
}
+ /* Shorten all the file names, so that it is easy to read */
+ shorten_fnames(FALSE);
+
/*
* Get the attributes for the different quickfix highlight items. Note
* that this depends on syntax items defined in the qf.vim syntax file
@@ -3542,6 +3545,10 @@ qf_fill_buffer(qf_info_T *qi, buf_T *buf, qfline_T *old_last)
/* Check if there is anything to display */
if (qi->qf_curlist < qi->qf_listcount)
{
+ char_u dirname[MAXPATHL];
+
+ *dirname = NUL;
+
/* Add one line for each error */
if (old_last == NULL)
{
@@ -3562,7 +3569,17 @@ qf_fill_buffer(qf_info_T *qi, buf_T *buf, qfline_T *old_last)
if (qfp->qf_type == 1) /* :helpgrep */
STRCPY(IObuff, gettail(errbuf->b_fname));
else
+ {
+ /* shorten the file name if not done already */
+ if (errbuf->b_sfname == NULL
+ || mch_isFullName(errbuf->b_sfname))
+ {
+ if (*dirname == NUL)
+ mch_dirname(dirname, MAXPATHL);
+ shorten_buf_fname(errbuf, dirname, FALSE);
+ }
STRCPY(IObuff, errbuf->b_fname);
+ }
len = (int)STRLEN(IObuff);
}
else
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index 092a5c43af..1e781de11e 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -3201,3 +3201,27 @@ func Test_lhelpgrep_autocmd()
au! QuickFixCmdPost
new | only
endfunc
+
+" Test for shortening/simplifying the file name when opening the
+" quickfix window or when displaying the quickfix list
+func Test_shorten_fname()
+ if !has('unix')
+ return
+ endif
+ %bwipe
+ " Create a quickfix list with a absolute path filename
+ let fname = getcwd() . '/test_quickfix.vim'
+ call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
+ call assert_equal(fname, bufname('test_quickfix.vim'))
+ " Opening the quickfix window should simplify the file path
+ cwindow
+ call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
+ cclose
+ %bwipe
+ " Create a quickfix list with a absolute path filename
+ call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
+ call assert_equal(fname, bufname('test_quickfix.vim'))
+ " Displaying the quickfix list should simplify the file path
+ silent! clist
+ call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
+endfunc
diff --git a/src/version.c b/src/version.c
index 7726f8450b..ae231be515 100644
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1781,
+/**/
1780,
/**/
1779,