Vim – Visueller Modus – Wortauswahl verbessern

Vim – Visueller Modus – Wortauswahl verbessern

Sehr geehrte Damen und Herren,

Ich verstehe nicht, warum vim das folgende Verhalten zeigt, wenn ich die folgende Verknüpfung im visuellen Modus (.vimrc) auslöse:

vmap <script> <C-LEFT> :call Test()<CR>
function! Test()
     "empty
endfunction

Bildbeschreibung hier eingeben

Vim geht zur ersten Spalte der Zeile über der Zeile, in der ich die Verknüpfung auslöse, und zeigt in der Statusleiste Folgendes an: '<,'> call Test ()". Dies geschieht jedoch nur, wenn ich eine Funktion aufrufe. Wenn ich einen Befehl wie "$" verwende (siehe *), ist das Verhalten wie erwartet.

Bildbeschreibung hier eingeben

(*)

vmap <C-LEFT> $

Mein Ziel besteht darin, dass Vim das „Tab“ als Wort betrachtet, wenn ich die Kombination „Strg+Links“ verwende, denn wenn das erste Zeichen der Zeile ein „Tab“ ist, wählt Vim das erste Wort in der obersten Zeile aus.

Bildbeschreibung hier eingeben

Dies ist das gewünschte Verhalten:

Bildbeschreibung hier eingeben

Wenn Sie eine alternative Lösung oder Problemumgehung haben, wäre ich ebenfalls dankbar.

Danke!

Antwort1

Dies vmapgilt, wenn sich vim im visuellen oder Auswahlmodus befindet. Sie haben nicht gesagt, welcher Text ausgewählt wurde, als Sie die Karte ausgelöst haben.

Das überraschende Verhalten kann eine Folge der

:'<,'>

Bereich, der automatisch bereitgestellt wird, wenn Sie mithilfe von vom visuellen Modus in den Ex-Modus wechseln :. Auch die Art und Weise, wie benutzerdefinierte Funktionen standardmäßig mit Bereichen umgehen.

Allerdings würde ich erwarten, dass der Cursor in der letzten Zeile der visuellen Auswahl endet. Ich kann das von Ihnen beschriebene Verhalten nicht reproduzieren.

:help :call
:help '<
:help v_:

Antwort2

Dies liegt daran, dass :callmit dem automatisch hinzugefügten visuellen Bereich aufgerufen wird '<,'>. :help :callerklärt:

Wenn ein Bereich angegeben ist und die Funktion ihn nicht selbst verarbeitet, wird die Funktion für jede Zeile im Bereich ausgeführt, wobei sich der Cursor in der ersten Spalte dieser Zeile befindet. Der Cursor bleibt in der letzten Zeile (möglicherweise verschoben durch den letzten Funktionsaufruf).

Sie müssen also entweder den Bereich löschen

vmap <script> <C-LEFT> :<C-u>call Test()<CR>

oder lassen Sie es von der Funktion verarbeiten:

function! Test() range

Antwort3

Ich habe dieses Problem mit dem folgenden Ansatz „gelöst“:

" Note: "Normal" movement with "Ctrl+Right"! By Questor
nmap <silent> <C-Right> e
imap <silent> <C-Right> <C-o>e<Right>
vmap <silent> <C-Right> e

" Note: "Normal" movement with "Ctrl+Left"! By Questor
nmap <silent> <C-Left> b
imap <silent> <C-Left> <C-o>b
vmap <silent> <C-Left> b

Beachten Sie jedoch, dass ich keine Funktion verwende. Wenn eine Funktion verwendet würde, müsste ich so vorgehen, wie Ingo Karkat es in seiner Antwort erklärt (mithilfe von : <C-u>).

Mit diesem einfachen Ansatz „behebe“ ich das oben erläuterte unerwünschte Verhalten von Vim.

Siehe ein Anwendungsbeispiel inhttps://github.com/eduardolucioac/groovim/blob/master/.vimrc

[]'S

verwandte Informationen