mirror of
https://github.com/neovim/neovim.git
synced 2025-09-14 15:28:17 +00:00
vim-patch:8.2.1741: pathshorten() only supports using one character
Problem: pathshorten() only supports using one character.
Solution: Add an argument to control the length. (closes vim/vim#7006)
6a33ef0deb
Cherry-pick a line in test from patch 8.2.0634.
Use Nvim's config paths in docs.
shorten_dir() returning a pointer looks a bit confusing here, as it is
actually the same pointer passed to it, and it doesn't really reduce
much code, so change it back to void.
Assigning rettv->vval.v_string = NULL is not needed if a pointer is
within 64 bits. While this is usually the case, I'm not sure if it can
be taken for granted.
This commit is contained in:
@@ -269,16 +269,17 @@ int vim_ispathlistsep(int c)
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Shorten the path of a file from "~/foo/../.bar/fname" to "~/f/../.b/fname"
|
||||
* It's done in-place.
|
||||
*/
|
||||
char_u *shorten_dir(char_u *str)
|
||||
/// Shorten the path of a file from "~/foo/../.bar/fname" to "~/f/../.b/fname"
|
||||
/// "trim_len" specifies how many characters to keep for each directory.
|
||||
/// Must be 1 or more.
|
||||
/// It's done in-place.
|
||||
void shorten_dir_len(char_u *str, int trim_len)
|
||||
{
|
||||
char_u *tail = path_tail(str);
|
||||
char_u *d = str;
|
||||
bool skip = false;
|
||||
for (char_u *s = str;; ++s) {
|
||||
int dirchunk_len = 0;
|
||||
for (char_u *s = str;; s++) {
|
||||
if (s >= tail) { // copy the whole tail
|
||||
*d++ = *s;
|
||||
if (*s == NUL) {
|
||||
@@ -287,10 +288,16 @@ char_u *shorten_dir(char_u *str)
|
||||
} else if (vim_ispathsep(*s)) { // copy '/' and next char
|
||||
*d++ = *s;
|
||||
skip = false;
|
||||
dirchunk_len = 0;
|
||||
} else if (!skip) {
|
||||
*d++ = *s; // copy next char
|
||||
if (*s != '~' && *s != '.') { // and leading "~" and "."
|
||||
skip = true;
|
||||
dirchunk_len++; // only count word chars for the size
|
||||
// keep copying chars until we have our preferred length (or
|
||||
// until the above if/else branches move us along)
|
||||
if (dirchunk_len >= trim_len) {
|
||||
skip = true;
|
||||
}
|
||||
}
|
||||
int l = utfc_ptr2len(s);
|
||||
while (--l > 0) {
|
||||
@@ -298,7 +305,13 @@ char_u *shorten_dir(char_u *str)
|
||||
}
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
/// Shorten the path of a file from "~/foo/../.bar/fname" to "~/f/../.b/fname"
|
||||
/// It's done in-place.
|
||||
void shorten_dir(char_u *str)
|
||||
{
|
||||
shorten_dir_len(str, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user