2017-05-31 1 views
0

Ich versuche, führende und nachfolgende Leerzeichen in einer Funktion zu entfernen, aber es funktioniert nicht:Vim - Entfernen von führenden und abschließenden Leerzeichen in einer Funktion

function Trim(s) 
    echo ">>>".a:s."<<<" 
    let ss = substitute(a:s, '\v^\s*([^\s]+)\s*$', '\1', '') 
    echo ">>>".ss."<<<" 
endfunction 

Die Regex \s*([^\s]+)\s* auf https://regex101.com/

Ersetzen funktioniert ok * mit + macht keinen Unterschied.

Testing:

: call Trim(" testing ") 

Ausgang:

>>> testing <<< 
>>> testing <<< 

Auch scheint es egal, ob ich doppelte Anführungszeichen im Vergleich zu einfachen Anführungszeichen in Ersatzfunktion verwenden.

Wo sind die Probleme und wie können sie gelöst werden? Vielen Dank.

Antwort

3

Ihr Problem durch Ihre Sammlung verursacht wird.

sollten Sie [^ ] anstelle von [^\s]:

function! Trim(s) 
    echo ">>>".a:s."<<<" 
    let ss = substitute(a:s, '\v^\s*([^ ]+)\s*$', '\1', '') 
    echo ">>>".ss."<<<" 
endfunction 

Dies liegt daran, Sammlungen auf einzelne Zeichen arbeiten und \s ist kein individueller Charakter; Es wird als \ gefolgt von s angezeigt, das zu nichts aufgelöst wird, da s kein Sonderzeichen ist, das es zu umgehen gilt.

Wenn Sie Ihre Sammlung wollen beide Leerzeichen und Tabulatoren enthalten, verwenden Sie diese:

[^ \t] 
[ \t] 

wo \t eine Registerkarte darstellt.

+0

Bisher für meinen * buggy * Kommentar zu' \ s', tx Romain. Beachten Sie, dass diese Interpretation einer Sammlung vim specific zu sein scheint ?! Die einzige Regex-Variante, die ich mit der gleichen Interpretation finde, ist POSIX. –

+0

Das erklärt das Problem sehr gut. Ich sehe auch, dass die Lösung nicht funktioniert, wenn sie in Anführungszeichen statt in einfache Anführungszeichen eingeschlossen ist. Was ist der Grund? (Laut Antwort hier https://stackoverflow.com/questions/13435586/should-i-use-single-o-double-quotes-in-my-vimrc-file, erwartete ich hier doppelte Anführungszeichen). – rnso

+0

Tatsächlich werden in der Dokumentation http://vimdoc.sourceforge.net/htmldoc/eval.html#substitute%28%29 doppelte Anführungszeichen verwendet. – rnso

1

Sie fügen ein, was bei Ihrer Suche/Ersetzen beibehalten werden muss. Vieles ist einfacher, nur Blick für das, was te und Ersatz entfernt werden muss, dass

:%s/\v(^\s+|\s+$)//g 

Pannen

%s    Start a global search/replace 
\v    Use Very Magic 
(^\s+   search for leading spaces 
|    or 
\s+$)   search for trailing spaces 
//g   remove all search results from entire line 
+0

Das ist in Ordnung, aber die Frage ist, warum mein Code nicht funktioniert? Was ist falsch an diesem Code und wie kann das korrigiert werden? – rnso

+0

Das Suchmuster '\ v^\ s * ([^ \ s] +) \ s * $ ', das Sie verwenden, gibt kein Ergebnis zurück. Wenn Sie darauf bestehen, einzuschließen, was bei Ihrer Suche beibehalten werden muss, erschweren Sie die Dinge.Sie müssen sich der gierigen Suche bewusst sein, von Zeilen, die keine führenden Leerzeichen haben und von Zeilen, die keine Trainingsräume haben. –

+0

'\ s *' ist für 0 oder mehr führende oder nachstehende Leerzeichen. Ich muss die gierige Suche überprüfen. – rnso

2

Wie romainl erklärt, bedeutet [^\s] weder \ noch s. Das Gegenteil von \s (d. H. Alles außer einem Leerzeichen oder einer Registerkarte) wäre \S.

Ansonsten ist hier eine andere Lösung: in lh-vim-lib I definiert haben folgende

function! lh#string#trim(string) abort 
    return matchstr(a:string, '^\v\_s*\zs.{-}\ze\_s*$') 
endfunction 

In Bezug auf die Differenz (n) zwischen den verschiedenen Arten von Anführungszeichen, diese Q sehen/A auf vi.SE: https://vi.stackexchange.com/questions/9706/what-is-the-difference-between-single-and-double-quoted-strings

Verwandte Themen