![Vim – Visueller Modus – Wortauswahl verbessern](https://rvso.com/image/1399997/Vim%20%E2%80%93%20Visueller%20Modus%20%E2%80%93%20Wortauswahl%20verbessern.png)
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
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.
(*)
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.
Dies ist das gewünschte Verhalten:
Wenn Sie eine alternative Lösung oder Problemumgehung haben, wäre ich ebenfalls dankbar.
Danke!
Antwort1
Dies vmap
gilt, 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 :call
mit dem automatisch hinzugefügten visuellen Bereich aufgerufen wird '<,'>
. :help :call
erklä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