Основываясь на ответе Сато, я пришел к следующему:
let s:quitting = 0
autocmd BufWritePost *
\ if ! s:quitting |
\ Neomake |
\ elseif tabpagenr('$') > 1 || winnr('$') > 1 |
\ let s:quitting = 0 |
\ endif
autocmd QuitPre * let s:quitting = 1
s: выход из
должен быть сброшен после закрытия окна, иначе Neomake
не будет работать на следующем : w
где угодно. QuitPre
, так как это может быть что угодно, если я : wqa
Neomake
, если Я закрываю окно, так как могу закрыть все последующие окна вскоре после (до завершения Neomake
), а затем Neovim все равно зависнет NeoVim также предоставляет v: выход
], но он еще не установлен на момент запуска BufWritePost
.
Neomake теперь предоставляет команду NeomakeCancelJobs
, поэтому исходная проблема решается принудительной отменой всех запущенных заданий в VimLeave
:
augroup LucNeoMake
autocmd!
autocmd BufWritePost * Neomake
autocmd VimLeave * NeomakeCancelJobs
augroup END
(Это решение для моя первоначальная проблема, но не вопрос.)
Предполагая, что вы хотите удалить все одинаковые символы в двух строках, вы можете сделать это за два вызоваsed
:
#!/bin/sh
player1_word='hello'
player2_word='bxolq'
player1_short=$( printf '%s\n' "$player1_word" | sed "s/[$player2_word]//g" )
player2_short=$( printf '%s\n' "$player2_word" | sed "s/[$player1_word]//g" )
if [ "${#player1_short}" -gt "${#player2_short}" ]; then
printf 'Player1 wins with "%s" ("%s") over "%s" ("%s")\n' \
"$player1_word" "$player1_short" \
"$player2_word" "$player2_short"
elif [ "${#player2_short}" -gt "${#player1_short}" ]; then
printf 'Player2 wins with "%s" ("%s") over "%s" ("%s")\n' \
"$player2_word" "$player2_short" \
"$player1_word" "$player1_short"
else
printf 'It is a draw between "%s" ("%s") and "%s" ("%s")\n' \
"$player1_word" "$player1_short" \
"$player2_word" "$player2_short"
fi
Основной операционной частью этого скрипта является
player1_short=$( printf '%s\n' "$player1_word" | sed "s/[$player2_word]//g" )
player2_short=$( printf '%s\n' "$player2_word" | sed "s/[$player1_word]//g" )
, который устанавливает две переменные _short
в значение каждой переменной _word
с удалением букв из другой переменной _word
. Это делается путем использования одного из слов в выражении([...]
)в квадратных скобках и выполнения глобальной замены другого слова, которая удаляет каждый символ, соответствующий любому символу в выражении [...]
.
Тестирование:
$ sh./script.sh
Player2 wins with "bxolq" ("bxq") over "hello" ("he")