Vim: Kann das Verzeichnis einer Datei nicht öffnen, wenn sie Sonderzeichen enthält

3

In Vim kann ich das Verzeichnis einer aktiven Datei mit diesem Befehl öffnen:

:silent ! start %:p:h

Wenn das Verzeichnis jedoch Sonderzeichen enthält (z. B. skandinavische Buchstaben), wird eine Fehlermeldung angezeigt. Unten finden Sie einen Link zu einem Beispiel.

Der Fehler besagt etwas wie "Das Ziel kann nicht gefunden werden. Bitte stellen Sie sicher, dass Sie es richtig geschrieben haben, und versuchen Sie es erneut." (In finnisch). Das Verzeichnis im obigen Beispiel ist D: \ ölöälä , aber wie Sie sehen, werden die Buchstaben ö und ä im cmd nicht richtig angezeigt. Ich denke das verursacht den Fehler.

Wie kann ich das lösen? Ich bin auf 64-Bit-Win 7.

martias
quelle
Ich glaube nicht, dass ich helfen kann, aber können Sie tippen? öä in Vim selbst?
romainl
Ja. Ich benutze Vim schon ziemlich lange, aber dies ist das erste Mal, dass ich Probleme mit Ös und Äs habe.
martias
Wenn ich mich bei Google umsehe, habe ich den Eindruck, dass es ziemlich schwierig ist, Nicht-ASCII-Zeichen in cmd.exe zu verwenden. Wenn Vim die richtigen Zeichen mit der richtigen Codierung korrekt an cmd.exe sendet (was meiner Meinung nach der Fall ist), ist möglicherweise eine ernsthafte Einschränkung von cmd.exe aufgetreten. Ich sehe, es gibt eine Reihe von Alternativen. Hast du welche ausprobiert? Angenommen, Sie haben es auf Ihrem System, könnte iconv vielleicht helfen?
romainl

Antworten:

4

Das ist ein vim Fehler.

Es ist kein Problem, im Gegensatz zu was romainl sagt in einem Kommentar zu der Frage mit cmd überhaupt. Es hat nichts damit zu tun cmd eigentlich. Beide cmd und start verhalten sich wie vorgesehen.

Das Problem ist, dass vim verwendet UTF-8 (Siehe :help unicode.) zum Speichern und Bearbeiten der Befehlszeichenfolge und Übergeben dieser UTF-8-Zeichenfolge im Istzustand an eine Programmierschnittstelle, die UTF-8 überhaupt nicht akzeptiert. Insbesondere: Es endet damit, dass die UTF-8-Zeichenfolge an das übergeben wird CreateProcessA() Funktion. Aber CreateProcessA() nimmt Zeichenketten, die in der Windows-Codepage . vim sollte Konvertieren Sie die Zeichenfolge zuvor von UTF-8 in die entsprechende Codepage (oder in Unicode und rufen Sie auf CreateProcessW() stattdessen). Aber das tut es nicht.

Infolgedessen wird die Bytefolge in Ihrem UTF-8-Pfadnamen wie von erstellt vim von %:p:hwird behandelt von CreateProcessA() als wäre es eine Folge von Bytes in der Windows-Codepage. Sie können das Ergebnis sehen.

Es gibt wahrscheinlich keine lokaler Fix dafür. Verwenden von 8.3-Namen ( :8 ) behebt das überhaupt nicht. Aber herumspielen vim 's encoding Variable kann es in gewissem Maße verbessern (obwohl es mehr als nur das betrifft und nicht der richtige Weg ist, um das Problem anzugehen). Du musst mit Bram Moolenaar sprechen. (Rücksprache mit dem vim 7.3 Fehlerliste, ich finde, dass Sie auch sprechen können diese Person Obwohl es immer noch eine gute Idee ist, M. Moolenaar davon zu überzeugen, dass Kikuchan nicht allein ist.)

JdeBP
quelle
Danke für diese sehr gute Antwort. Ich denke immer noch, dass die Nichtannahme von utf-8-Zeichen eine sehr schwerwiegende Einschränkung ist, ob es sich um eine solche handelt cmd.exe oder ein Unterprozess. Und ich stimme auch zu, dass es ein bisschen blöd ist, darauf zu bestehen, dass utf-8-Zeichenfolgen an Befehle gesendet werden, von denen bekannt ist, dass sie diese nicht akzeptieren.
romainl
Wie oft muss ich sagen, dass dies ist gar nichts damit zu tun cmd bevor es einsinkt? Die Win32-System-API-Funktion verwendet die Zeichensätze, die als "Taking" definiert sind. Dies ist keine Einschränkung, geschweige denn eine "ernsthafte", insbesondere angesichts der Existenz der W() Geschmack der API.
JdeBP
Soweit es mich betrifft, haben Sie es nur einmal gesagt, und ich habe zugestimmt und Ihnen dafür gedankt. Was fehlt dir? Eine API-Methode, die im Jahr 2012 UTF-8 nicht unterstützt, ist völlig nutzlos. Die Tatsache, dass Vim keine alternative Methode verwendet, die UTF-8 unterstützt, ist noch schlimmer.
romainl
Jegliche Falschheit hier liegt bei Ihnen, weil Sie es getan haben nicht tun Sie das, wie Sie ganz deutlich sehen können. Ich habe es gesagt und dir geantwortet beschuldigte weiter cmd. Darin ist es offenbar auch nicht gesunken ist eine API-Variante, die Unicode unterstützt, obwohl ich auch darauf hingewiesen habe. Dieser fortgesetzte Schwachsinn hier beruht entweder darauf, dass man nicht aufpasst, oder auf einer dummen Unwilligkeit, anzuerkennen, dass die A() Geschmack der API ist nicht "begrenzt" oder "nutzlos", sondern hat einen genau definierten Zweck, der einfach ist etwas anderes .
JdeBP
So lief es: 1. Ich schaue mich schnell um und sehe eine Menge Leute, die Probleme haben, utf-8 an zu senden cmd und keine Lösung auf Benutzerebene. 2. Du postest eine sehr gute Antwort. 3. Ich danke Ihnen dafür und mache eine kurze allgemeine Bemerkung zu allem ("ob es sich um cmd.exe oder einen Unterprozess handelt", beachten Sie bitte das falsch geschriebene "ob"), das utf-8 nicht unterstützt UND ich
romainl