aboutsummaryrefslogtreecommitdiff
path: root/src/path.c
diff options
context:
space:
mode:
authorJohn Schmidt <john.schmidt.h@gmail.com>2014-03-31 01:08:01 +0200
committerThiago de Arruda <tpadilha84@gmail.com>2014-04-01 08:08:07 -0300
commitd31e5988959c116db7130799f692750f08ae8d9b (patch)
tree675849997e85d07f7451e3d1013b6b4478b13c0f /src/path.c
parent7464b07c225629b3969cfdcd135f4ac1fa0b7a0b (diff)
downloadrneovim-d31e5988959c116db7130799f692750f08ae8d9b.tar.gz
rneovim-d31e5988959c116db7130799f692750f08ae8d9b.tar.bz2
rneovim-d31e5988959c116db7130799f692750f08ae8d9b.zip
Move shorten_fname{,1,s} and shorten_filenames from fileio.c
Diffstat (limited to 'src/path.c')
-rw-r--r--src/path.c126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/path.c b/src/path.c
index 99a4cec6cf..0d7685031b 100644
--- a/src/path.c
+++ b/src/path.c
@@ -8,6 +8,7 @@
#include "fileio.h"
#include "file_search.h"
#include "garray.h"
+#include "memfile.h"
#include "memline.h"
#include "message.h"
#include "misc1.h"
@@ -16,7 +17,9 @@
#include "os/os.h"
#include "os/shell.h"
#include "os_unix.h"
+#include "quickfix.h"
#include "regexp.h"
+#include "screen.h"
#include "tag.h"
#include "types.h"
#include "ui.h"
@@ -1777,3 +1780,126 @@ int flags; /* EW_* flags */
}
#endif
+#if defined(FEAT_VIMINFO) || defined(FEAT_BROWSE) || \
+ defined(FEAT_QUICKFIX) || defined(FEAT_AUTOCMD) || defined(PROTO)
+/*
+ * Try to find a shortname by comparing the fullname with the current
+ * directory.
+ * Returns "full_path" or pointer into "full_path" if shortened.
+ */
+char_u *shorten_fname1(char_u *full_path)
+{
+ char_u *dirname;
+ char_u *p = full_path;
+
+ dirname = alloc(MAXPATHL);
+ if (dirname == NULL)
+ return full_path;
+ if (os_dirname(dirname, MAXPATHL) == OK) {
+ p = shorten_fname(full_path, dirname);
+ if (p == NULL || *p == NUL)
+ p = full_path;
+ }
+ vim_free(dirname);
+ return p;
+}
+#endif
+
+/*
+ * Try to find a shortname by comparing the fullname with the current
+ * directory.
+ * Returns NULL if not shorter name possible, pointer into "full_path"
+ * otherwise.
+ */
+char_u *shorten_fname(char_u *full_path, char_u *dir_name)
+{
+ int len;
+ char_u *p;
+
+ if (full_path == NULL)
+ return NULL;
+ len = (int)STRLEN(dir_name);
+ if (fnamencmp(dir_name, full_path, len) == 0) {
+ p = full_path + len;
+ {
+ if (vim_ispathsep(*p))
+ ++p;
+ else
+ p = NULL;
+ }
+ } else
+ p = NULL;
+ return p;
+}
+
+/*
+ * Shorten filenames for all buffers.
+ * 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.
+ * When "force" is FALSE: Only try to shorten absolute file names.
+ * For buffers that have buftype "nofile" or "scratch": never change the file
+ * name.
+ */
+void shorten_fnames(int force)
+{
+ char_u dirname[MAXPATHL];
+ buf_T *buf;
+ char_u *p;
+
+ os_dirname(dirname, MAXPATHL);
+ for (buf = firstbuf; buf != NULL; buf = buf->b_next) {
+ if (buf->b_fname != NULL
+ && !bt_nofile(buf)
+ && !path_with_url(buf->b_fname)
+ && (force
+ || buf->b_sfname == NULL
+ || os_is_absolute_path(buf->b_sfname))) {
+ vim_free(buf->b_sfname);
+ buf->b_sfname = NULL;
+ 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;
+ }
+
+ /* Always make the swap file name a full path, a "nofile" buffer may
+ * also have a swap file. */
+ mf_fullname(buf->b_ml.ml_mfp);
+ }
+ status_redraw_all();
+ redraw_tabline = TRUE;
+}
+
+#if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \
+ || defined(FEAT_GUI_MSWIN) \
+ || defined(FEAT_GUI_MAC) \
+ || defined(PROTO)
+/*
+ * Shorten all filenames in "fnames[count]" by current directory.
+ */
+void shorten_filenames(char_u **fnames, int count)
+{
+ int i;
+ char_u dirname[MAXPATHL];
+ char_u *p;
+
+ if (fnames == NULL || count < 1)
+ return;
+ os_dirname(dirname, sizeof(dirname));
+ for (i = 0; i < count; ++i) {
+ if ((p = shorten_fname(fnames[i], dirname)) != NULL) {
+ /* shorten_fname() returns pointer in given "fnames[i]". If free
+ * "fnames[i]" first, "p" becomes invalid. So we need to copy
+ * "p" first then free fnames[i]. */
+ p = vim_strsave(p);
+ vim_free(fnames[i]);
+ fnames[i] = p;
+ }
+ }
+}
+#endif
+