Символы, оставшиеся после сравнения двух строк

Основываясь на ответе Сато, я пришел к следующему:

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 все равно зависнет

Обновление 1

NeoVim также предоставляет v: выход ], но он еще не установлен на момент запуска BufWritePost .

Обновление 2

Neomake теперь предоставляет команду NeomakeCancelJobs , поэтому исходная проблема решается принудительной отменой всех запущенных заданий в VimLeave :

augroup LucNeoMake
  autocmd!
  autocmd BufWritePost * Neomake
  autocmd VimLeave * NeomakeCancelJobs
augroup END

(Это решение для моя первоначальная проблема, но не вопрос.)

3
01.01.2017, 01:03
1 ответ

Предполагая, что вы хотите удалить все одинаковые символы в двух строках, вы можете сделать это за два вызова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")
0
27.01.2020, 21:37

Теги

Похожие вопросы