Bug#445238: vim: write errors in swap file when on remote FS

Chris Butler chrisb at debian.org
Thu Oct 4 08:57:42 UTC 2007


Package: vim
Version: 1:7.1-056+2
Severity: normal

When using vim to edit files on a remote FS (in this case sshfs, but I
imagine this happens with others too), vim starts throwing errors saying
"E297: Write error in swap file" if the connection to the remote dies
and then comes back up again. I'm guessing that vim is keeping the
filehandle for the swapfile open, and this filehandle becomes invalid
when the connection dies.

Steps to reproduce:

mkdir tmp
sshfs -o reconnect localhost:/tmp tmp
vim tmp/foo

Type some stuff in, save it, then keep it open. In another window, kill
the ssh process that's been spawned by sshfs, then go back to vim. Start
pressing u/^R to undo/redo, and you should start to see the
aforemetioned error.

The above example is a bit contrived, I actually noticed the problem
when using software suspend, which makes the ssh processes die.

According to strace, the error returned from the write(2) call is EIO.
Perhaps instead of just throwing an error, vim should attempt to re-open
the swap file and THEN throw an error if that fails as well.


select(8, [0 5 7], NULL, [0 5], NULLselect(4, [3], [], [], NULL)            = 1 (in [0])
read(0, "u", 4096)                      = 1
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
_llseek(8, 0, [0], SEEK_SET)            = 0
write(8, "b0VIM 7.1\0\0\0\0\20\0\0\304\247\4G&\0\0\0\200)\0\0chr"..., 4096) = -1 EIO (Input/output error)
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
time(NULL)                              = 1191487479
time(NULL)                              = 1191487479
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
write(1, "\33[53;1H\r\n\33[?25l\33[1m\33[37m\33[41mE29"..., 156) = 156
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
gettimeofday({1191487479, 947304}, NULL) = 0
select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 208000})
select(8, [0 5 7], NULL, [0 5], NULL)   = 1 (in [0])
read(0, "\r", 4096)                     = 1
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
uname({sys="Linux", node="spawn", ...}) = 0
write(7, "\22\0\f\0L\0\200\3\'\0\0\0\37\0\0\0\10\0\0\0\25\0\0\0v"..., 116) = 116
uname({sys="Linux", node="spawn", ...}) = 0
write(7, "\22\0\10\0L\0\200\3%\0\0\0\37\0\0\0\10\0\0\0\7\0\0\0vi"..., 100) = 100
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
write(1, "\33[m\33[1;1H\33[2L\33[?25l\33[1;1Haoeu\r\na"..., 115) = 115
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
gettimeofday({1191487480, 740168}, NULL) = 0
select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 472000})
select(8, [0 5 7], NULL, [0 5], NULL)   = 1 (in [0])
read(0, "\22", 4096)                    = 1
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
_llseek(8, 0, [0], SEEK_SET)            = 0
write(8, "b0VIM 7.1\0\0\0\0\20\0\0\304\247\4G&\0\0\0\200)\0\0chr"..., 4096) = -1 EIO (Input/output error)
write(1, "\33[?25l\33[m\33[53;1H\33[1m\33[37m\33[41mE2"..., 60) = 60
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
time(NULL)                              = 1191487481
time(NULL)                              = 1191487481
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
write(1, "\33[m\r\r\n1 change; after #2  52 sec"..., 98) = 98
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
gettimeofday({1191487481, 267523}, NULL) = 0
select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 96000})
select(8, [0 5 7], NULL, [0 5], NULL)   = 1 (in [0])
read(0, "\r", 4096)                     = 1
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
uname({sys="Linux", node="spawn", ...}) = 0
write(7, "\22\0\f\0L\0\200\3\'\0\0\0\37\0\0\0\10\0\0\0\27\0\0\0v"..., 116) = 116
uname({sys="Linux", node="spawn", ...}) = 0
write(7, "\22\0\10\0L\0\200\3%\0\0\0\37\0\0\0\10\0\0\0\7\0\0\0vi"..., 100) = 100
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
write(1, "\33[m\33[1;1H\33[2L\33[?25l\33[1;1Haoeu\r\na"..., 129) = 129
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
gettimeofday({1191487482, 172142}, NULL) = 0
select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 320000})
select(8, [0 5 7], NULL, [0 5], NULL)   = 1 (in [0])
read(0, "\22", 4096)                    = 1
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
time(NULL)                              = 1191487482
time(NULL)                              = 1191487482
write(1, "\33[?25l\33[53;1H2 more lines; after"..., 51) = 51
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
write(1, "\33[4;51r\33[4;1H\33[2L\33[1;53r\33[53;1H\33"..., 86) = 86
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
gettimeofday({1191487482, 851962}, NULL) = 0
select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {2, 464000})
select(8, [0 5 7], NULL, [0 5], NULL)   = 1 (in [0])
read(0, "u", 4096)                      = 1
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
time(NULL)                              = 1191487484
time(NULL)                              = 1191487484
write(1, "\33[?25l\33[m\33[53;1H2 fewer lines; b"..., 56) = 56
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
write(1, "\33[3;51r\33[3;1H\33[2M\33[1;53r\33[3;1Hao"..., 436) = 436
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
gettimeofday({1191487484, 387571}, NULL) = 0
select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 640000})
select(8, [0 5 7], NULL, [0 5], NULL)   = 1 (in [0])
read(0, "u", 4096)                      = 1
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
_llseek(8, 0, [0], SEEK_SET)            = 0
write(8, "b0VIM 7.1\0\0\0\0\20\0\0\304\247\4G&\0\0\0\200)\0\0chr"..., 4096) = -1 EIO (Input/output error)
write(1, "\33[?25l\33[m\33[53;1H\33[1m\33[37m\33[41mE2"..., 60) = 60
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
time(NULL)                              = 1191487484
time(NULL)                              = 1191487484
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
write(1, "\33[m\r\r\n1 change; before #2  55 se"..., 99) = 99
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
gettimeofday({1191487484, 747662}, NULL) = 0
select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 336000})
select(8, [0 5 7], NULL, [0 5], NULL)   = 1 (in [0])
read(0, "\r", 4096)                     = 1
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
uname({sys="Linux", node="spawn", ...}) = 0
write(7, "\22\0\f\0L\0\200\3\'\0\0\0\37\0\0\0\10\0\0\0\25\0\0\0v"..., 116) = 116
uname({sys="Linux", node="spawn", ...}) = 0
write(7, "\22\0\10\0L\0\200\3%\0\0\0\37\0\0\0\10\0\0\0\7\0\0\0vi"..., 100) = 100
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
write(1, "\33[m\33[1;1H\33[2L\33[?25l\33[1;1Haoeu\r\na"..., 128) = 128
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
gettimeofday({1191487485, 412200}, NULL) = 0
select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {2, 896000})
select(8, [0 5 7], NULL, [0 5], NULL)   = 1 (in [0])
read(0, ":", 4096)                      = 1
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
write(1, "\33[?25l\33[53;1H:", 14)      = 14
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
ioctl(0, SNDCTL_TMR_START or TCSETS, {B38400 opost -isig -icanon -echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
write(1, "\33[34h\33[?25h", 11)         = 11
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
gettimeofday({1191487486, 514793}, NULL) = 0
select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 808000})
select(8, [0 5 7], NULL, [0 5], NULL)   = 1 (in [0])
read(0, "q", 4096)                      = 1
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
write(1, "q\33[?25l\r:q\33[34h\33[?25h", 21) = 21
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
gettimeofday({1191487486, 706526}, NULL) = 0
select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 624000})
select(8, [0 5 7], NULL, [0 5], NULL)   = 1 (in [0])
read(0, "\r", 4096)                     = 1
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
write(1, "\r", 1)                       = 1
open(".", O_RDONLY|O_LARGEFILE)         = 6
fchdir(6)                               = 0
chdir("tmp")                            = 0
getcwd("/home/chrisb/tmp", 1024)        = 17
fchdir(6)                               = 0
close(6)                                = 0
select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout)
unlink("/tmp/v498049/dbext.sql")        = -1 ENOENT (No such file or directory)
open("/home/chrisb/.viminfo", O_RDONLY|O_LARGEFILE) = 6
stat64("/home/chrisb/.viminfo", {st_mode=S_IFREG|0600, st_size=24566, ...}) = 0
getuid32()                              = 1000
getuid32()                              = 1000
stat64("/home/chrisb/.viminfo.tmp", 0xbf82da6c) = -1 ENOENT (No such file or directory)
umask(0)                                = 022
open("/home/chrisb/.viminfo.tmp", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE|O_NOFOLLOW, 0600) = 9
umask(022)                              = 0
fcntl64(9, F_GETFL)                     = 0x28001 (flags O_WRONLY|O_LARGEFILE|O_NOFOLLOW)
fstat64(9, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f1d000
_llseek(9, 0, [0], SEEK_CUR)            = 0
fchown32(9, 1000, 1000)                 = 0
fstat64(6, {st_mode=S_IFREG|0600, st_size=24566, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f1c000
read(6, "# This viminfo file was generate"..., 4096) = 4096
read(6, "PATH\'].\'/application/includes/re"..., 4096) = 4096
read(6, "/sites/deep.thought/devsites/cbu"..., 4096) = 4096
read(6, "cation/searches/suite/itq.search"..., 4096) = 4096
read(6, "uite/cas/bid.html\n-\'  316  26  ~"..., 4096) = 4096
open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = 10
fstat64(10, {st_mode=S_IFREG|0644, st_size=25486, ...}) = 0
mmap2(NULL, 25486, PROT_READ, MAP_SHARED, 10, 0) = 0xb7f15000
close(10)                               = 0
futex(0xb7173a6c, FUTEX_WAKE, 2147483647) = 0
open("/usr/lib/gconv/ISO8859-1.so", O_RDONLY) = 10
read(10, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p\3\0\000"..., 512) = 512
fstat64(10, {st_mode=S_IFREG|0644, st_size=5384, ...}) = 0
mmap2(NULL, 8220, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 10, 0) = 0xb7f12000
mmap2(0xb7f13000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 10, 0) = 0xb7f13000
close(10)                               = 0
write(9, "# This viminfo file was generate"..., 4096) = 4096
write(9, "PATH\'].\'/application/includes/re"..., 4096) = 4096
write(9, "re/htdocs/suite/cas/edit.html\n-\'"..., 4096) = 4096
write(9, "nt/dt/home/export/sites/deep.tho"..., 4096) = 4096
read(6, "9\t26\n\t+\t282\t0\n\t+\t383\t0\n\t+\t315\t5\n"..., 4096) = 4086
write(9, "143\t0\n\t+\t146\t0\n\t+\t147\t0\n\t+\t167\t0"..., 4096) = 4096
read(6, "", 4096)                       = 0
write(9, "252\t0\n\t+\t163\t0\n\t+\t246\t0\n\t+\t252\t0"..., 2870) = 2870
close(9)                                = 0
munmap(0xb7f1d000, 4096)                = 0
close(6)                                = 0
munmap(0xb7f1c000, 4096)                = 0
stat64("/home/chrisb/.viminfo.tmp", {st_mode=S_IFREG|0600, st_size=23350, ...}) = 0
unlink("/home/chrisb/.viminfo")         = 0
rename("/home/chrisb/.viminfo.tmp", "/home/chrisb/.viminfo") = 0
write(1, "\33[?25l", 6)                 = 6
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0
ioctl(0, SNDCTL_TMR_START or TCSETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
uname({sys="Linux", node="spawn", ...}) = 0
write(7, "\22\0\n\0L\0\200\3\'\0\0\0\37\0\0\0\10\0\0\0\17\0\0\0c"..., 108) = 108
uname({sys="Linux", node="spawn", ...}) = 0
write(7, "\22\0\n\0L\0\200\3%\0\0\0\37\0\0\0\10\0\0\0\17\0\0\0ch"..., 108) = 108
write(1, "\33[53;1H\33[K\33[53;1H\33[?1l\33>", 24) = 24
write(1, "\33[34h\33[?25h\33[?1049l", 19) = 19
close(8)                                = -1 EIO (Input/output error)
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "E", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "7", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "2", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, ":", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, " ", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "C", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "l", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "o", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "s", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "e", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, " ", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "e", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "r", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "r", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "o", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "r", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, " ", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "o", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "n", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, " ", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "s", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "w", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "a", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "p", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, " ", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "f", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "i", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "l", 1)                        = 1
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "e", 1)                        = 1
write(1, "\33[?25l\33[J", 9)            = 9
unlink("/home/chrisb/tmp/.vimtest.swp") = 0
open("/tmp/v498049/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 6
fstat64(6, {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
fcntl64(6, F_SETFD, FD_CLOEXEC)         = 0
getdents64(6, /* 2 entries */, 4096)    = 48
getdents64(6, /* 0 entries */, 4096)    = 0
close(6)                                = 0
rmdir("/tmp/v498049")                   = 0
exit_group(0)                           = ?
) = ? ERESTARTNOHAND (To be restarted)

-- System Information:
Debian Release: lenny/sid
  APT prefers testing
  APT policy: (900, 'testing'), (500, 'unstable'), (1, 'experimental')
Architecture: i386 (i686)

Kernel: Linux 2.6.22-2-686 (SMP w/1 CPU core)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8) (ignored: LC_ALL set to en_GB.UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages vim depends on:
ii  libc6                     2.6.1-1+b1     GNU C Library: Shared libraries
ii  libgpmg1                  1.19.6-25      General Purpose Mouse - shared lib
ii  libncurses5               5.6+20070825-1 Shared libraries for terminal hand
ii  vim-common                1:7.1-056+2    Vi IMproved - Common files
ii  vim-runtime               1:7.1-056+2    Vi IMproved - Runtime files

vim recommends no packages.

-- no debconf information





More information about the pkg-vim-maintainers mailing list