3

In Vim I can open the directory of an active file using this command:

:silent ! start %:p:h

However, if the directory contains special characters (like Scandinavian letters), I'm getting an error. Below is a link to an example.

The error says something like "Can't find the target. Please make sure you wrote it right and try again." (in Finnish). The directory in the above example is D:\ölöälä, but as you can see, the ö and ä-letters don't show properly in the cmd. I think that causes the error.

How can I solve this? I'm on 64-bit Win 7.

4
  • I don't think I'll be able to help but are you able to type öä in Vim itself?
    – romainl
    Commented Jan 1, 2012 at 12:03
  • Yes. I have been using Vim quite a long time but this is the first time I encounter any problems with ö's and ä's. Commented Jan 1, 2012 at 13:25
  • Looking around google gives me the impression that it's quite hard to use non-ASCII characters in cmd.exe. If Vim correctly sends the right characters with the right encoding to cmd.exe (which I think it does) you have probably encountered a serious limitation of cmd.exe. I see there are a number of alternatives, did you try any? Also, supposing you have it on your system, maybe iconv could help?
    – romainl
    Commented Jan 1, 2012 at 16:34
  • This appears to have been fixed (tested with 32bit Vim9.0)
    – jswolf19
    Commented Mar 6, 2023 at 4:40

1 Answer 1

5

This is a vim bug.

It's not a problem, contrary to what romainl says in a comment to the question, with cmd at all. It's nothing to do with cmd in fact. Both cmd and start are behaving as designed.

The problem is that vim is using UTF-8 (See :help unicode.) for storing and manipulating the command string, and is passing that UTF-8 string as-is to a programming API that doesn't accept UTF-8 in the first place. Specifically: It ends up passing the UTF-8 string to the CreateProcessA() function. But CreateProcessA() takes strings encoded in the Windows code page. vim should convert the string beforehand from UTF-8 to the appropriate code page (or to Unicode and call CreateProcessW() instead). But it doesn't.

As a consequence, the sequence of bytes in your UTF-8 pathname, as constructed by vim from %:p:h, is being treated by CreateProcessA() as if it were a sequence of bytes in the Windows code page. You can see the result.

There's probably no local fix for this. Using 8.3 names (:8) won't fix this at all. But fiddling with vim's encoding variable might ameliorate it to an extent (although it will affect more than just this, and isn't the correct way to address the problem). You'll have to talk to Bram Moolenaar. (Consulting the vim 7.3 bug list, I find that you can also talk to this person, although convincing M. Moolenaar that kikuchan is not alone is still a good idea.)

5
  • Thanks for this very good answer. I still think that not accepting utf-8 characters is a very serious limitation wether it's cmd.exe or a sub-process. And I also agree that it's a bit boneheaded to insist on sending utf-8 strings to commands that are know for not accepting it.
    – romainl
    Commented Jan 2, 2012 at 8:59
  • How many times do I have to say that this is nothing at all to do with cmd before it sinks in? The Win32 system API function takes the character sets that it is defined as taking. This is not a limitation, let alone a "serious" one, especially given the existence of the W() flavour of the API.
    – JdeBP
    Commented Jan 2, 2012 at 9:41
  • As far as I'm concerned you said it only once and I agreed and thanked you for it. What's wrong with you? An API method that doesn't support UTF-8 in 2012 is seriously useless IMO and the fact that Vim doesn't use an alternative method that supports UTF-8 is even worse.
    – romainl
    Commented Jan 2, 2012 at 11:00
  • Any wrongheadedness here is yours, because you did not do that, as can be quite clearly seen. I said it and in response you kept on blaming cmd. It also apparently hasn't sunk in that there is an API flavour that supports Unicode, even though I pointed that out as well. This continued daft "seriously" here is based upon either not paying attention or a foolish unwilliness to acknowledge that the A() flavour of the API is not "limited" or "useless" but has a well-defined purpose that is simply something else.
    – JdeBP
    Commented Jan 2, 2012 at 13:40
  • Here is how it went: 1. I quickly look around and see quite a lot of people having trouble sending utf-8 to cmd and no user-level solution. 2. You post a very good answer. 3. I thank you for that and I make a quick general remark about anything ("wether it's cmd.exe or a sub-process" please note the misspelled "whether") not supporting utf-8 AND I
    – romainl
    Commented Jan 2, 2012 at 15:00

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .